← man/data_processing
bc — man bc — 80×24
ugur@toprak:~/man/data_processing$man bc
Bölüm 1 Veri İşleme

bc

keyfi duyarlıklı ondalık aritmetik dili ve hesap makinesi

Sözdizimi

       bc [-cCghilPqRsvVw] [--digit-clamp] [--no-digit-clamp] [--global-stacks] [--help]
       [--interactive] [--mathlib] [--no-prompt] [--no-read-prompt] [--quiet] [--standard] [--warn]
       [--version] [-e ifade] [--expression=ifade...] [-f dosya...] [--file=dosya...] [dosya...] [-I
       ibase] [--ibase=ibase] [-O obase] [--obase=obase] [-S scale] [--scale=scale] [-E seed]
       [--seed=seed]

Açıklama

bc(1), ilk olarak 1991 yılında POSIX tarafından standartlaştırılan bir dil için etkileşimli bir işlemcidir. (Bkz. STANDARTLAR bölümü.) Dil, sınırsız duyarlıklı ondalık aritmetik sağlar ve bir dereceye kadar C diline benzer, ancak bazı farklılıklar vardır. Bu tür farklılıklar bu belgede belirtilecektir.

Seçenekleri ayrıştırdıktan ve işledikten sonra, bu bc(1) komut satırında verilen tüm dosyaları okur ve stdin'den okumadan önce onları yürütür.

Bu bc(1), GNU bc(1) dahil (ve özellikle) herhangi bir bc(1) için doğrudan bir alterniftir (drop-in replacement). Ayrıca diğer uygulamaların ötesinde birçok uzantıya ve ekstra özelliğe sahiptir.

Not: Başka bir bc(1) için tasarlanmış herhangi bir betiğin bu bc(1) üzerinde çalıştırılması bir ayrıştırma hatası (parse error) verirse, bunun nedeni muhtemelen bu bc(1) tarafından anahtar kelime olarak ayrılmış bir kelimenin bir fonksiyon, değişken veya dizi adı olarak kullanılmış olmasıdır. Bunu düzeltmek için, betikte bir isim olarak kullanılan anahtar kelimeyi belirterek -r keyword komut satırı seçeneğini kullanın. Daha fazla bilgi için SEÇENEKLER bölümüne bakın.

Diğer bc(1) uygulamaları için tasarlanmış betiklerin ayrıştırılması hala çalışmıyorsa, bu bir hatadır (bug) ve bildirilmelidir. Bkz. HATALAR bölümü.

Seçenekler

Aşağıdakiler bc(1) tarafından kabul edilen seçeneklerdir.

-C, --no-digit-clamp Sayılar ayrıştırılırken basamakların geçerli ibase değerinden büyük veya ona eşit olmasının sınırlanmasını (clamping) devre dışı bırakır.

Bu, bir basamaktan bir sayıya eklenen değerin, her zaman o basamağın değerinin, en önemsiz basamakta (least significant digit) 0'dan başlayan basamak konumunun kuvvetine yükseltilmiş ibase değeriyle çarpımı olduğu anlamına gelir.

Bu ve/veya -c or --digit-clamp seçenekleri birden fazla kez verilirse, en son verilen seçenek kullanılır.

Bu seçenek, BC_DIGIT_CLAMP çevre değişkenini (bkz. ÇEVRE DEĞİŞKENLERİ bölümü) ve -h veya --help seçenekleriyle sorgulanabilen varsayılan değeri geçersiz kılar.

Bu taşınabilir olmayan (non-portable) bir uzantıdır.

-c, --digit-clamp Sayılar ayrıştırılırken basamakların geçerli ibase değerinden büyük veya ona eşit olmasının sınırlanmasını (clamping) etkinleştirir.

Bu, ibase değerinden büyük veya ona eşit olan bir basamaktan bir sayıya eklenen değerin, ibase değerinin 1 eksiğinin, en önemsiz basamakta 0'dan başlayan basamak konumunun kuvvetine yükseltilmiş ibase değeriyle çarpımı olduğu anlamına gelir.

Bu ve/veya -C veya --no-digit-clamp seçenekleri birden fazla kez verilirse, en son verilen seçenek kullanılır.

Bu seçenek, BC_DIGIT_CLAMP çevre değişkenini (bkz. ÇEVRE DEĞİŞKENLERİ bölümü) ve -h veya --help seçenekleriyle sorgulanabilen varsayılan değeri geçersiz kılar.

Bu taşınabilir olmayan bir uzantıdır.

-E seed, --seed=seed seed'in 10 tabanında olduğu varsayılarak yerleşik seed değişkenini seed değerine ayarlar. seed geçerli bir sayı değilse, bu ölümcül bir hatadır (fatal error).

Bu seçeneğin birden fazla örneği verilirse, sonuncusu kullanılır.

Bu taşınabilir olmayan bir uzantıdır.

-e ifade, --expression=ifade ifade değerini değerlendirir. Birden fazla ifade verilirse, sırayla değerlendirilirler. Dosyalar da verilmişse (bkz. -f ve --file seçenekleri), ifadeler ve dosyalar verilen sırayla değerlendirilir. Bu, bir ifadeden önce bir dosya verilirse, önce dosyanın okunacağı ve değerlendirileceği anlamına gelir.

Bu seçenek komut satırında verilirse (yani BC_ENV_ARGS içinde değilse, bkz. ÇEVRE DEĞİŞKENLERİ bölümü), tüm ifadeleri ve dosyaları işledikten sonra bc(1) çıkış yapacaktır; ancak komut satırında veya BC_ENV_ARGS içinde -f veya --file seçeneğine en az bir kez - (stdin) argümanı verilmişse durum değişir. Bununla birlikte, -f- veya eşdeğeri verildikten sonra başka herhangi bir -e, --expression, -f veya --file argümanı verilirse, bc(1) ölümcül bir hata verecek ve çıkacaktır.

Bu taşınabilir olmayan bir uzantıdır.

-f dosya, --file=dosya dosya içeriğini okur ve stdin üzerinden okunmuş gibi satır satır değerlendirir. İfadeler de verilmişse (bkz. -e ve --expression seçenekleri), ifadeler verilen sırayla değerlendirilir.

Bu seçenek komut satırında verilirse (yani BC_ENV_ARGS içinde değilse, bkz. ÇEVRE DEĞİŞKENLERİ bölümü), tüm ifadeleri ve dosyaları işledikten sonra bc(1) çıkış yapacaktır; ancak -f veya --file seçeneğine en az bir kez - (stdin) argümanı verilmişse durum değişir. Bununla birlikte, -f- veya eşdeğeri verildikten sonra başka herhangi bir -e, --expression, -f veya --file argümanı verilirse, bc(1) ölümcül bir hata verecek ve çıkacaktır.

Bu taşınabilir olmayan bir uzantıdır.

-g, --global-stacks ibase, obase, scale ve seed genel (global) değişkenlerini yığınlara (stacks) dönüştürür.

Bu, her fonksiyon çağrısında dördünün de geçerli değerinin bir kopyasının bir yığına itilmesini (push) ve her fonksiyon döndüğünde yığından çekilmesini (pop) sağlar. Bu, fonksiyonların bu genel değişkenlerin herhangi birine veya tümüne atama yapabilmesini ve bu değişikliğin diğer fonksiyonları etkileyeceğinden endişe etmemesini sağlar. Böylece, x değerini b tabanında yazdıran output(x,b) adında varsayımsal bir fonksiyon şu şekilde yazılabilir:

define void output(x, b) { obase=b x }

bunun yerine:

define void output(x, b) { auto c c=obase obase=b x obase=c }

Bu, fonksiyon yazmayı çok daha kolaylaştırır.

(Not: output(x,b) fonksiyonu genişletilmiş matematik kütüphanesinde mevcuttur. Bkz. KÜTÜPHANE bölümü.)

Ancak, bu bayrağın kullanılması fonksiyonların ibase, obase, scale veya seed değişkenlerini genel olarak ayarlayamayacağı anlamına geldiğinden, bunu yapmak için tasarlanmış fonksiyonlar artık çalışamaz. Bunun için iki olası kullanım senaryosu vardır ve her birinin bir çözümü bulunur.

Birincisi, başlangıçta bc(1) hesap makinesini bir sayı dönüştürücüye dönüştürmek için bir fonksiyon çağrılıyorsa, bu yeteneği çeşitli kabuk takma adlarıyla (shell aliases) değiştirmek mümkündür. Örnekler:

alias d2o="bc -e ibase=A -e obase=8" alias h2b="bc -e ibase=G -e obase=2"

İkincisi, bir fonksiyonun amacı başka bir amaç için ibase, obase, scale veya seed değişkenlerini genel olarak ayarlamaksa, bu fonksiyon (ayarladığı genel değişkenlerin sayısına bağlı olarak) bir ila dört fonksiyona bölünebilir ve bu fonksiyonların her biri bir genel değişken için istenen değeri döndürebilir.

seed değişkenini ayarlayan fonksiyonlar için, seed'e atanan değer üst (parent) fonksiyonlara yayılmaz. Bu, onların gördüğü sözde rastgele (pseudo-random) sayı dizisinin, herhangi bir üst fonksiyonun gördüğü sözde rastgele sayı dizisiyle aynı olmayacağı anlamına gelir. Bu durum yalnızca seed ayarlandıktan sonra geçerlidir.

Eğer bir fonksiyon üst fonksiyonlarının sözde rastgele sayı dizisini etkilemek istemiyor ancak aynı seed değerini kullanmak istiyorsa şu satırı kullanabilir:

seed = seed

Bu seçeneğin davranışının bc(1) hesap makinesinin her çalıştırılmasında geçerli olması isteniyorsa, kullanıcılar BC_ENV_ARGS değişkenini tanımladıklarından ve bu seçeneği dahil ettiklerinden emin olabilirler (daha fazla ayrıntı için ÇEVRE DEĞİŞKENLERİ bölümüne bakın).

-s, -w veya bunların eşdeğerleri kullanılırsa, bu seçenek yoksayılır.

Bu taşınabilir olmayan bir uzantıdır.

-h, --help Kullanım mesajını yazdırır ve çıkar.

-I ibase, --ibase=ibase ibase'in 10 tabanında olduğu varsayılarak yerleşik ibase değişkenini ibase değerine ayarlar. ibase geçerli bir sayı değilse, bu ölümcül bir hatadır.

Bu seçeneğin birden fazla örneği verilirse, sonuncusu kullanılır.

Bu taşınabilir olmayan bir uzantıdır.

-i, --interactive Etkileşimli modu zorlar. (Bkz. ETKİLEŞİMLİ MOD bölümü.)

Bu taşınabilir olmayan bir uzantıdır.

-L, --no-line-length Satır uzunluğu kontrolünü devre dışı bırakır ve sayıları ters eğik çizgi () ve yeni satır karakteri olmadan yazdırır. Diğer bir deyişle, bu seçenek BC_LINE_LENGTH değerini 0 olarak ayarlar (bkz. ÇEVRE DEĞİŞKENLERİ bölümü).

Bu taşınabilir olmayan bir uzantıdır.

-l, --mathlib scale (bkz. SÖZDİZİMİ bölümü) değerini 20 olarak ayarlar ve komut satırında belirtilen ifadeler veya dosyalar dahil olmak üzere herhangi bir kod çalıştırılmadan önce yerleşik matematik kütüphanesini ve genişletilmiş matematik kütüphanesini yükler.

Kütüphanelerde ne olduğunu öğrenmek için KÜTÜPHANE bölümüne bakın.

-O obase, --obase=obase obase'in 10 tabanında olduğu varsayılarak yerleşik obase değişkenini obase değerine ayarlar. obase geçerli bir sayı değilse, bu ölümcül bir hatadır.

Bu seçeneğin birden fazla örneği verilirse, sonuncusu kullanılır.

Bu taşınabilir olmayan bir uzantıdır.

-P, --no-prompt TTY modunda istemi (prompt) devre dışı bırakır. (İstem yalnızca TTY modunda etkindir. Bkz. TTY MODU bölümü.) Bu çoğunlukla istem istemeyen veya bc(1) içinde istem görmeye alışkın olmayan kullanıcılar içindir. Bu kullanıcıların çoğu bu seçeneği BC_ENV_ARGS içine koymak isteyecektir (bkz. ÇEVRE DEĞİŞKENLERİ bölümü).

Bu seçenekler, BC_PROMPT ve BC_TTY_MODE çevre değişkenlerini geçersiz kılar (bkz. ÇEVRE DEĞİŞKENLERİ bölümü).

Bu taşınabilir olmayan bir uzantıdır.

-q, --quiet Bu seçenek GNU bc(1) (https://www.gnu.org/software/bc/) ile uyumluluk içindir; herhangi bir işlem yapmaz (no-op). Bu seçenek olmadan GNU bc(1) telif hakkı başlığını yazdırır. Bu bc(1) ise telif hakkı başlığını yalnızca -v, -V veya --version seçeneklerinden biri veya daha fazlası verildiğinde yazdırır; ancak BC_BANNER çevre değişkeni ayarlanmışsa ve sıfır olmayan bir tamsayı içeriyorsa veya bu bc(1) varsayılan olarak başlık görüntülenecek şekilde derlenmişse durum değişir. Bunlardan herhangi biri geçerliyse, o zaman bu seçenek bc(1) hesap makinesinin başlığı yazdırmasını engeller.

Bu taşınabilir olmayan bir uzantıdır.

-R, --no-read-prompt TTY modunda okuma istemini (read prompt) devre dışı bırakır. (Okuma istemi yalnızca TTY modunda etkindir. Bkz. TTY MODU bölümü.) Bu çoğunlukla bir okuma istemi istemeyen veya bc(1) içinde buna alışkın olmayan kullanıcılar içindir. Bu kullanıcıların çoğu bu seçeneği BC_ENV_ARGS içine koymak isteyecektir (bkz. ÇEVRE DEĞİŞKENLERİ bölümü). Bu seçenek, kullanıcıdan girdi isteyen bc(1) betiklerinin hashbang (shebang) satırlarında da yararlıdır.

Bu seçenek, okuma istemi yalnızca yerleşik read() fonksiyonu çağrıldığında kullanıldığı için normal istemi devre dışı bırakmaz.

Bu seçenekler, BC_PROMPT ve BC_TTY_MODE çevre değişkenlerini geçersiz kılar (bkz. ÇEVRE DEĞİŞKENLERİ bölümü), ancak yalnızca okuma istemi için geçerlidir.

Bu taşınabilir olmayan bir uzantıdır.

-r keyword, --redefine=keyword Bir fonksiyon, değişken veya dizi adı olarak kullanılabilmesini sağlamak amacıyla keyword anahtar kelimesini yeniden tanımlar. Bu, diğer bc(1) uygulamaları için tasarlanmış betikler ayrıştırılırken bu bc(1) ayrıştırma hataları verdiğinde kullanışlıdır.

Bu bc(1) tarafından yeniden tanımlanmasına izin verilen anahtar kelimeler şunlardır:

• abs

• asciify

• continue

• divmod

• else

• halt

• irand

• last

• limits

• maxibase

• maxobase

• maxrand

• maxscale

• modexp

• print

• rand

• read

• seed

• stream

Bu anahtar kelimelerden herhangi biri betikte bir fonksiyon, değişken veya dizi adı olarak kullanılıyorsa, argüman olarak anahtar kelimeyi vererek bu seçeneği kullanın. Birden fazlası kullanılıyorsa, hepsi için bu seçeneği kullanın; birden fazla kez kullanılabilir.

Yerleşik matematik kütüphanesi ayrıştırılırken anahtar kelimeler yeniden tanımlanmaz (bkz. KÜTÜPHANE bölümü).

POSIX standardı tarafından zorunlu kılınan anahtar kelimelerin yeniden tanımlanması ölümcül bir hatadır (bkz. STANDARTLAR bölümü). Bu bc(1) hesap makinesinin anahtar kelime olarak ayırmadığı kelimeleri yeniden tanımlamaya çalışmak ölümcül bir hatadır.

-S scale, --scale=scale scale'in 10 tabanında olduğu varsayılarak yerleşik scale değişkenini scale değerine ayarlar. scale geçerli bir sayı değilse, bu ölümcül bir hatadır.

Bu seçeneğin birden fazla örneği verilirse, sonuncusu kullanılır.

Bu taşınabilir olmayan bir uzantıdır.

-s, --standard Tam olarak standart tarafından tanımlanan dili işler (bkz. STANDARTLAR bölümü) ve herhangi bir uzantı kullanılırsa hata verir.

Bu taşınabilir olmayan bir uzantıdır.

-v, -V, --version Sürüm bilgisini (telif hakkı başlığı) yazdırır ve çıkar.

Bu taşınabilir olmayan bir uzantıdır.

-w, --warn -s ve --standard seçeneğine benzer, ancak standart dışı uzantılar için hata yerine uyarılar yazdırılır ve yürütme normal şekilde devam eder.

Bu taşınabilir olmayan bir uzantıdır.

-z, --leading-zeroes bc(1) hesap makinesinin, -1'den büyük, 1'den küçük ve 0'a eşit olmayan tüm sayıları başında sıfır olacak şekilde yazdırmasını sağlar.

Bu, genişletilmiş matematik kütüphanesindeki plz(x), plznl(x), pnlz(x) ve pnlznl(x) fonksiyonlarıyla tek tek sayılar için de ayarlanabilir (bkz. KÜTÜPHANE bölümü).

Bu taşınabilir olmayan bir uzantıdır.

Tüm uzun seçenekler (long options) taşınabilir olmayan uzantılardır.

Stdin

-f, --file, -e veya --expression seçenekleriyle hiçbir dosya veya ifade verilmemişse, bc(1) stdin üzerinden okuma yapar.

Ancak bunun bazı istisnaları vardır.

Birincisi, stdin satır satır değerlendirilir. Bunun tek istisnası, ayrıştırmanın tamamlanamamasıdır. Bu, bir dizeyi kapatmadan başlatmanın veya bir fonksiyonu, if ifadesini ya da döngüyü kapatmadan başlatmanın da bc(1) hesap makinesinin yürütülmemesine neden olacağı anlamına gelir.

İkincisi, bir if ifadesinden sonra bc(1) bir else ifadesinin gelip gelmeyeceğini bilemez, bu nedenle bir else ifadesinin olmayacağından emin olana kadar yürütülmeyecektir.

Stdout

Hata olmayan tüm çıktılar stdout'a yazılır. Ek olarak, geçmiş (bkz. GEÇMİŞ bölümü) ve istem (bkz. TTY MODU bölümü) etkinleştirilmişse, her ikisi de stdout'a çıktı olarak verilir.

Not: Diğer bc(1) uygulamalarından farklı olarak, bu bc(1) stdout'a yazamadığında ölümcül bir hata (bkz. ÇIKIŞ DURUMU bölümü) verecektir, dolayısıyla stdout kapatılırsa, örneğin bc >&- şeklinde çalıştırılırsa, bir hata ile sonlanacaktır. Bu, bc(1) hesap makinesinin stdout bir dosyaya yönlendirildiğinde sorunları bildirebilmesi için yapılır.

Diğer bc(1) uygulamalarının davranışına bağımlı olan betikler varsa, bu betiklerin stdout'u /dev/null adresine yönlendirecek şekilde değiştirilmesi önerilir.

Stderr

Tüm hata çıktıları stderr'e yazılır.

Not: Diğer bc(1) uygulamalarından farklı olarak, bu bc(1) stderr'e yazamadığında ölümcül bir hata (bkz. ÇIKIŞ DURUMU bölümü) verecektir, dolayısıyla stderr kapatılırsa, örneğin bc 2>&- şeklinde çalıştırılırsa, bir hata ile sonlanacaktır. Bu, bc(1) hesap makinesinin stderr bir dosyaya yönlendirildiğinde bir hata koduyla çıkabilmesi için yapılır.

Diğer bc(1) uygulamalarının davranışına bağımlı olan betikler varsa, bu betiklerin stderr'i /dev/null adresine yönlendirecek şekilde değiştirilmesi önerilir.

Sözdizimi

bc(1) programlarının sözdizimi bazı farklılıklarla birlikte çoğunlukla C diline benzer. Bu bc(1), bu hesap makinesinin kabul ettiği dil için çok daha kapsamlı bir kaynak olan POSIX standardını (bkz. STANDARTLAR bölümü) takip eder. Bu bölüm, standarda yapılan tüm uzantıların bir özeti ve listesi niteliğindedir.

Aşağıdaki bölümlerde E, ifade (expression); S, ifade/deyim (statement) ve I, tanımlayıcı (identifier) anlamına gelir.

Tanımlayıcılar (I) küçük bir harfle başlar ve ardından herhangi bir sayıda (BC_NAME_MAX-1 değerine kadar) küçük harf (a-z), rakam (0-9) ve alt çizgi () gelebilir. Düzenli ifade (regex) [a-z][a-z0-9]* şeklindedir. Birden fazla karakter (harf) içeren tanımlayıcılar taşınabilir olmayan bir uzantıdır.

ibase, sabit sayıların nasıl yorumlanacağını belirleyen genel bir değişkendir. Giriş tabanıdır veya giriş sayılarını yorumlamak için kullanılan sayı tabanıdır. ibase başlangıçta 10'dur. Komut satırında -s (--standard) ve -w (--warn) bayrakları verilmemişse, ibase için izin verilen maksimum değer 36'dır. Aksi takdirde 16'dır. ibase için izin verilen minimum değer 2'dir. ibase için izin verilen maksimum değer bc(1) programlarında yerleşik maxibase() fonksiyonu ile sorgulanabilir.

obase, sonuçların nasıl çıktı olarak verileceğini belirleyen genel bir değişkendir. Çıkış tabanıdır veya sayıları yazdırmak için kullanılan sayı tabanıdır. obase başlangıçta 10'dur. obase için izin verilen maksimum değer BC_BASE_MAX'tır ve bc(1) programlarında yerleşik maxobase() fonksiyonu ile sorgulanabilir. obase için izin verilen minimum değer 0'dır. obase 0 ise değerler bilimsel gösterimle, obase 1 ise mühendislik gösterimiyle çıktı olarak verilir. Aksi takdirde, değerler belirtilen tabanda yazdırılır.

Bilimsel ve mühendislik gösterimlerinde çıktı vermek taşınabilir olmayan uzantılardır.

Bir ifadenin scale değeri, ifadenin sonucundaki ondalık noktanın sağındaki basamak sayısıdır ve scale, istisnalar hariç herhangi bir işlemin duyarlılığını ayarlayan genel bir değişkendir. scale başlangıçta 0'dır. scale negatif olamaz. scale için izin verilen maksimum değer BC_SCALE_MAX'tır ve bc(1) programlarında yerleşik maxscale() fonksiyonu ile sorgulanabilir.

bc(1) hem genel değişkenlere hem de yerel değişkenlere sahiptir. Tüm yerel değişkenler fonksiyona yereldir; parametrelerdir veya bir fonksiyonun auto listesinde tanıtılırlar (bkz. FONKSİYONLAR bölümü). Bir parametre veya auto listesinde olmayan bir değişkene erişilirse, bunun genel olduğu varsayılır. Üst fonksiyon, alt fonksiyonun genel olarak kabul ettiği bir değişkenin yerel değişken sürümüne sahipse, alt fonksiyondaki o genel değişkenin değeri, gerçek genel değişkenin değeri değil, üst fonksiyondaki değişkenin değeridir.

Yukarıdakilerin tümü diziler için de geçerlidir.

En düşük öncelikli operatör bir atama operatörü olmadıkça ve ifade parantez içine alınmadıkça, ifade olan bir deyimin (yani adlandırılmış ifadelerden veya işlenenlerden herhangi birinin) değeri yazdırılır.

Yazdırılan değer aynı zamanda özel last değişkenine atanır. last için bir eş anlamlı olarak tek bir nokta (.) da kullanılabilir. Bunlar taşınabilir olmayan uzantılardır.

İfadeleri ayırmak için noktalı virgül veya yeni satır karakteri kullanılabilir.

Yorumlar İki tür yorum vardır:

  1. Blok yorumları /* ve */ arasına alınır.

  2. Satır yorumları #'ten başlar ve bir sonraki yeni satıra kadar gider (yeni satır dahil değildir). Bu taşınabilir olmayan bir uzantıdır.

Adlandırılmış İfadeler Aşağıdakiler bc(1) içindeki adlandırılmış ifadelerdir:

  1. Değişkenler: I

  2. Dizi Elemanları: I[E]

  3. ibase

  4. obase

  5. scale

  6. seed

  7. last veya tek bir nokta (.)

6 ve 7 numaralı olanlar taşınabilir olmayan uzantılardır.

seed değişkeninin anlamı geçerli sözde rastgele sayı üretecine bağlıdır ancak yeni ana sürümler hariç değişmeyeceği garanti edilir.

Değerin scale ve işareti önemli olabilir.

Daha önce kullanılan bir seed değeri seed değişkenine atanır ve tekrar kullanılırsa, sözde rastgele sayı üretecinin, seed değerinin daha önce kullanıldığı zamankiyle aynı sözde rastgele sayı dizisini üretmesi garanti edilir.

seed tekrar sorgulandığında, atanan tam değerin hemen geri döndürüleceği garanti edilmez. Ancak seed farklı bir değer döndürse bile, her iki değer de seed'e atandığında aynı sözde rastgele sayı dizisini üretmesi garanti edilir. Bu, seed'e atanan belirli değerlerin benzersiz sözde rastgele sayı dizileri üretmeyeceği anlamına gelir. seed'in değeri, rand() ve irand(E) işlenenlerinin (bkz. aşağıdaki İşlenenler alt bölümü) her kullanımından sonra değişecektir; ancak irand(E) fonksiyonuna geçirilen parametre 0, 1 veya negatifse durum değişir.

seed değişkenine atanabilecek değerin uzunluğu (anlamlı ondalık basamak sayısı) veya scale değeri için bir sınır yoktur.

Değişkenler ve diziler birbirine karışmaz; kullanıcıların değişkenlerle aynı adı taşıyan dizileri olabilir. Bu durum fonksiyonlar için de geçerlidir (bkz. FONKSİYONLAR bölümü), dolayısıyla bir kullanıcının hepsi aynı ada sahip bir değişkeni, dizisi ve fonksiyonu olabilir ve bunlar fonksiyonların içinde olsun ya da olmasın birbirini gölgelemez.

Artırma/azaltma operatörlerinin işleneni olarak ve atama operatörlerinin sol tarafı olarak adlandırılmış ifadeler gereklidir (bkz. Operatörler alt bölümü).

İşlenenler Aşağıdakiler bc(1) içinde geçerli işlenenlerdir:

  1. Sayılar (bkz. aşağıdaki Sayılar alt bölümü).

  2. Dizi indeksleri (I[E]).

  3. (E): E'nin değeri (önceliği değiştirmek için kullanılır).

  4. sqrt(E): E'nin karekökü. E negatif olmamalıdır.

  5. length(E): E içindeki anlamlı ondalık basamak sayısı. Ondalık basamağı olmayan 0 için 1 döndürür. Bir dize verilirse, dizenin uzunluğu döndürülür. length(E) fonksiyonuna bir dize geçirmek taşınabilir olmayan bir uzantıdır.

  6. length(I[]): I dizisindeki eleman sayısı. Bu taşınabilir olmayan bir uzantıdır.

  7. scale(E): E'nin scale değeri.

  8. abs(E): E'nin mutlak değeri. Bu taşınabilir olmayan bir uzantıdır.

  9. is_number(E): Verilen argüman bir sayı ise 1, dize ise 0 döndürür. Bu taşınabilir olmayan bir uzantıdır.

  10. is_string(E): Verilen argüman bir dize ise 1, sayı ise 0 döndürür. Bu taşınabilir olmayan bir uzantıdır.

  11. modexp(E, E, E): Modüler üs alma; ilk ifade taban, ikincisi üs ve üçüncüsü modüldür. Her üç değer de tamsayı olmalıdır. İkinci argüman negatif olmamalıdır. Üçüncü argüman sıfır olmamalıdır. Bu taşınabilir olmayan bir uzantıdır.

  12. divmod(E, E, I[]): Tek bir işlemde bölme ve mod alma. Bu optimizasyon içindir. İlk ifade bölünen, ikincisi ise sıfır olmaması gereken bölendir. Geri dönüş değeri bölümdür ve kalan, sağlanan dizinin (son argüman) 0. indeksinde saklanır. Bu taşınabilir olmayan bir uzantıdır.

  13. asciify(E): E bir dize ise, argümanının ilk harfi olan bir dize döndürür. Bir sayı ise, sayının mod 256'sını hesaplar ve bu sayıyı tek karakterlik bir dize olarak döndürür. Bu taşınabilir olmayan bir uzantıdır.

  14. asciify(I[]): Argüman tarafından tanımlanan dizinin her bir elemanı üzerinde asciify(E) çalıştırılmasıyla elde edilecek karakterlerden oluşan bir dize. Bu, çok karakterli dizeler oluşturmaya ve bunları saklamaya olanak tanır. Bu taşınabilir olmayan bir uzantıdır.

  15. I(), I(E), I(E, E) ve bu şekilde devam eden, I'nın void olmayan bir fonksiyon için tanımlayıcı olduğu fonksiyon çağrıları (bkz. FONKSİYONLAR bölümünün Void Olmayan Fonksiyonlar alt bölümü). E argümanları, fonksiyon tanımındaki ilgili parametre bir dizi referansı ise otomatik olarak dizi referanslarına dönüştürülecek olan (bkz. FONKSİYONLAR bölümünün Dizi Referansları alt bölümü) I[] formundaki diziler de olabilir.

  16. read(): stdin'den bir satır okur ve bunu bir ifade olarak kullanır. Bu ifadenin sonucu, read() işleneninin sonucudur. Bu taşınabilir olmayan bir uzantıdır.

  17. maxibase(): İzin verilen maksimum ibase. Bu taşınabilir olmayan bir uzantıdır.

  18. maxobase(): İzin verilen maksimum obase. Bu taşınabilir olmayan bir uzantıdır.

  19. maxscale(): İzin verilen maksimum scale. Bu taşınabilir olmayan bir uzantıdır.

  20. line_length(): BC_LINE_LENGTH ile ayarlanan satır uzunluğu (bkz. ÇEVRE DEĞİŞKENLERİ bölümü). Bu taşınabilir olmayan bir uzantıdır.

  21. global_stacks(): -g veya --global-stacks seçenekleriyle genel yığınlar etkinleştirilmemişse 0, aksi takdirde sıfır dışı bir değer döndürür. Bkz. SEÇENEKLER bölümü. Bu taşınabilir olmayan bir uzantıdır.

  22. leading_zero(): -z veya --leading-zeroes seçenekleriyle başında sıfır gösterimi etkinleştirilmemişse 0, aksi takdirde sıfır dışı bir değer döndürür. Bkz. SEÇENEKLER bölümü. Bu taşınabilir olmayan bir uzantıdır.

  23. rand(): 0 (dahil) ile BC_RAND_MAX (dahil) arasında sözde rastgele bir tamsayı. Bu işlenenin kullanılması seed değerini değiştirecektir. Bu taşınabilir olmayan bir uzantıdır.

  24. irand(E): 0 (dahil) ile E'nin değeri (hariç) arasında sözde rastgele bir tamsayı. E negatifse veya tamsayı değilse (E'nin scale değeri 0 değilse), bir hata oluşur ve seed değişmeden kalırken bc(1) sıfırlanır (bkz. SIFIRLAMA bölümü). E, BC_RAND_MAX değerinden büyükse, üst sınır, birkaç sözde rastgele tamsayı üretilerek, bunlar BC_RAND_MAX+1 değerinin uygun kuvvetleriyle çarpılarak ve birbirine eklenerek karşılanır. Böylece, bu işlenenle üretilebilecek tamsayının boyutu sınırsızdır. Bu işlenenin kullanılması, E değeri 0 veya 1 olmadıkça seed değerini değiştirecektir. Bu durumda 0 döndürülür ve seed değiştirilmez. Bu taşınabilir olmayan bir uzantıdır.

  25. maxrand(): rand() tarafından döndürülen maksimum tamsayı. Bu taşınabilir olmayan bir uzantıdır.

rand() ve irand(E) tarafından üretilen tamsayıların, sözde rastgele sayı üretecinin sınırlamalarına tabi olarak, mümkün olduğunca tarafsız (unbiased) olması garanti edilir.

Not: rand() ve irand(E) ile sözde rastgele sayı üreteci tarafından döndürülen değerlerin kriptografik olarak güvenli OLMADIĞI garanti edilir. Bu, çekirdekli (seeded) bir sözde rastgele sayı üreteci kullanmanın bir sonucudur. Ancak, aynı seed değerleriyle yeniden üretilebilir olmaları garanti edilir. Bu, bc(1) hesap makinesinden gelen sözde rastgele değerlerin yalnızca yeniden üretilebilir bir sözde rastgele sayı akışının ÇOK ÖNEMLİ olduğu durumlarda kullanılması gerektiği anlamına gelir. Diğer durumlarda, çekirdeksiz (non-seeded) bir sözde rastgele sayı üreteci kullanın.

Sayılar Sayılar; rakamlar, büyük harfler ve en fazla 1 adet ondalık noktası içeren dizelerdir. Sayılar BC_NUM_MAX değerine kadar basamak içerebilir. Büyük harfler, 1'den başlayarak alfabedeki konumlarına 9 eklenmesine eşittir (yani A, 10'a veya 9+1'e eşittir).

Bir basamak veya harf geçerli ibase değeriyle hiçbir anlam ifade etmiyorsa (yani geçerli ibase değerinden büyük veya ona eşitse), davranış -c/--digit-clamp veya -C/--no-digit-clamp seçeneklerinin varlığına (bkz. SEÇENEKLER bölümü), BC_DIGIT_CLAMP çevre değişkeninin varlığına ve ayarına (bkz. ÇEVRE DEĞİŞKENLERİ bölümü) veya -h/--help seçeneğiyle sorgulanabilen varsayılan değere bağlıdır.

Sınırlama (clamping) kapalıysa, geçerli ibase değerinden büyük veya ona eşit olan basamaklar veya harfler değiştirilmez. Bunun yerine, verilen değerleri ibase değerinin uygun kuvvetiyle çarpılır ve sayıya eklenir. Bu, 3'lük bir ibase ile AB sayısının 3^1A+3^0B değerine eşit olduğu anlamına gelir; bu da 3 kere 10 artı 11, yani 41'dir.

Sınırlama açıksa, geçerli ibase değerinden büyük veya ona eşit olan basamaklar veya harfler, ibase değerinin uygun kuvvetiyle çarpılmadan ve sayıya eklenmeden önce ibase içindeki en yüksek geçerli basamağın değerine ayarlanır. Bu, 3'lük bir ibase ile AB sayısının 3^12+3^02 değerine eşit olduğu anlamına gelir; bu da 3 kere 2 artı 2, yani 8'dir.

Sınırlamanın bir istisnası vardır: tek karakterli sayılar (yani tek başına A). Bu tür sayılar asla sınırlanmaz ve her zaman mümkün olan en yüksek ibase değerinde alacakları değeri alırlar. Bu, tek başına A'nın her zaman ondalık 10'a ve tek başına Z'nin her zaman ondalık 35'e eşit olduğu anlamına gelir. Bu davranış standart tarafından zorunlu kılınmıştır (bkz. STANDARTLAR bölümü) ve geçerli ibase değerinden bağımsız olarak geçerli ibase değerini (i komutu ile) ayarlamanın kolay bir yolunu sağlamak amacıyla tasarlanmıştır.

Sınırlama açıksa ve bir karakterin sınırlanmış değerine ihtiyaç duyuluyorsa, başında sıfır kullanın, yani A için 0A kullanın.

Buna ek olarak, bc(1) bilimsel gösterimdeki sayıları da kabul eder. Bunlar <sayı>e<tamsayı> biçimindedir. Üs (e'den sonraki kısım) bir tamsayı olmalıdır. Bir örnek, 1892370000'e eşit olan 1.89237e9 sayısıdır. Negatif üslere de izin verilir, dolayısıyla 4.2890e-3 sayısı 0.0042890 değerine eşittir.

Bilimsel gösterim kullanılması, sırasıyla -s veya -w komut satırı seçenekleri (veya eşdeğerleri) verilmişse bir hata veya uyarıdır.

UYARI: Bilimsel gösterimdeki hem sayı hem de üs geçerli ibase değerine göre yorumlanır, ancak sayı, geçerli ibase değerine bakılmaksızın yine de 10^üs ile çarpılır. Örneğin, ibase 16 ise ve bc(1) hesap makinesine FFeA sayı dizesi verilirse, sonuçta elde edilen ondalık sayı 2550000000000 olacaktır ve bc(1) hesap makinesine 10e-4 sayı dizesi verilirse, sonuçta elde edilen ondalık sayı 0.0016 olacaktır.

Girdiyi bilimsel gösterim olarak kabul etmek taşınabilir olmayan bir uzantıdır.

Operatörler Aşağıdaki aritmetik ve mantıksal operatörler kullanılabilir. Azalan öncelik sırasına göre listelenmişlerdir. Aynı gruptaki operatörler aynı önceliğe sahiptir.

++ -- Tür: Ön Ek (Prefix) ve Art Ek (Postfix)

İlişkilendirilebilirlik: Yok

Açıklama: artırma, azaltma

  • ! Tür: Ön Ek

İlişkilendirilebilirlik: Yok

Açıklama: negatif yapma, mantıksal değil (boolean not)

$ Tür: Art Ek

İlişkilendirilebilirlik: Yok

Açıklama: kırpma (truncation)

@ Tür: İkili (Binary)

İlişkilendirilebilirlik: Sağ

Açıklama: duyarlılığı ayarlama

^ Tür: İkili

İlişkilendirilebilirlik: Sağ

Açıklama: üs alma

  • / % Tür: İkili

İlişkilendirilebilirlik: Sol

Açıklama: çarpma, bölme, mod alma

    • Tür: İkili

İlişkilendirilebilirlik: Sol

Açıklama: toplama, çıkarma

<< >> Tür: İkili

İlişkilendirilebilirlik: Sol

Açıklama: sola kaydırma, sağa kaydırma

= <<= >>= += -= *= /= %= ^= @= Tür: İkili

İlişkilendirilebilirlik: Sağ

Açıklama: atama

== <= >= != < > Tür: İkili

İlişkilendirilebilirlik: Sol

Açıklama: ilişkisel

&& Tür: İkili

İlişkilendirilebilirlik: Sol

Açıklama: mantıksal ve (boolean and)

|| Tür: İkili

İlişkilendirilebilirlik: Sol

Açıklama: mantıksal veya (boolean or)

Operatörler aşağıda daha ayrıntılı olarak açıklanacaktır.

++ -- Ön ek ve art ek artırma ve azaltma operatörleri tıpkı C'deki gibi davranırlar. İşlenen olarak adlandırılmış bir ifade gerektirirler (bkz. Adlandırılmış İfadeler alt bölümü).

Bu operatörlerin ön ek sürümleri daha verimlidir; mümkün olan yerlerde bunları kullanın.

  •  Negatif yapma operatörü, bir kullanıcı 0 değerine sahip herhangi bir ifadeyi negatif yapmaya çalışırsa 0 döndürür. Aksi takdirde, ifadenin işareti değiştirilmiş bir kopyası döndürür.
    

! Mantıksal değil operatörü, ifade 0 ise 1, aksi takdirde 0 döndürür.

Uyarı: Bu operatör, GNU bc(1) ve diğer bc(1) uygulamalarındaki eşdeğer operatörden farklı bir önceliğe sahiptir!

Bu taşınabilir olmayan bir uzantıdır.

$ Kırpma operatörü, verilen ifadenin tüm scale değeri kaldırılmış bir kopyasını döndürür.

Bu taşınabilir olmayan bir uzantıdır.

@ Duyarlılık ayarlama operatörü iki ifade alır ve birincisinin scale değerini ikincisinin değerine eşitleyerek bir kopyasını döndürür. Bu, sayının ya hiç değiştirilmeden döndürülmesi (ilk ifadenin scale değeri ikincin değerine eşitse), genişletilmesi (daha azsa) veya kırpılması (daha çoksa) anlamına gelebilir.

İkinci ifade bir tamsayı (scale değeri olmamalı) ve negatif olmamalıdır.

Bu taşınabilir olmayan bir uzantıdır.

^ Üs alma operatörü (C'de olduğu gibi özel veya/xor operatörü değildir) iki ifade alır ve birincisini ikincisinin değerinin kuvvetine yükseltir. Sonucun scale değeri scale değişkenine eşittir.

İkinci ifade bir tamsayı (scale değeri olmamalı) olmalıdır ve negatifse, ilk değer sıfır olmamalıdır.

  •  Çarpma operatörü iki ifade alır, bunları çarpar ve sonucu döndürür. a ilk ifadenin scale değeri ve b ikinci ifadenin scale değeriyse, sonucun scale değeri min(a+b,max(scale,a,b)) değerine eşittir; burada min() ve max() bariz değerleri döndürür.
    

/ Bölme operatörü iki ifade alır, bunları böler ve bölümü döndürür. Sonucun scale değeri scale değişkeninin değeri olacaktır.

İkinci ifade sıfır olmamalıdır.

% Mod alma operatörü a ve b olmak üzere iki ifade alır ve bunları şu şekilde değerlendirir: 1) Geçerli scale değerine göre a/b sonucunu hesaplar ve 2) Adım 1'in sonucunu kullanarak a-(a/b)*b değerini max(scale+scale(b),scale(a)) scale değerine göre hesaplar.

İkinci ifade sıfır olmamalıdır.

  •  Toplama operatörü a ve b olmak üzere iki ifade alır ve scale değeri a ve b'nin scale değerlerinin maksimumuna eşit olacak şekilde toplamı döndürür.
    
  •  Çıkarma operatörü a ve b olmak üzere iki ifade alır ve scale değeri a ve b'nin scale değerlerinin maksimumuna eşit olacak şekilde farkı döndürür.
    

<< Sola kaydırma operatörü a ve b olmak üzere iki ifade alır ve ondalık noktası b basamak sağa kaydırılmış bir a kopyasını döndürür.

İkinci ifade bir tamsayı (scale değeri olmamalı) ve negatif olmamalıdır.

Bu taşınabilir olmayan bir uzantıdır.

Sağa kaydırma operatörü a ve b olmak üzere iki ifade alır ve ondalık noktası b basamak sola kaydırılmış bir a kopyasını döndürür.

İkinci ifade bir tamsayı (scale değeri olmamalı) ve negatif olmamalıdır.

Bu taşınabilir olmayan bir uzantıdır.

= <<= >>= += -= *= /= %= ^= @= Atama operatörleri a ve b olmak üzere iki ifade alır; burada a adlandırılmış bir ifadedir (bkz. Adlandırılmış İfadeler alt bölümü).

= için b kopyalanır ve sonuç a'ya atanır. Diğerleri için a ve b, karşılık gelen aritmetik operatöre işlenen olarak uygulanır ve sonuç a'ya atanır.

Uzantı olan operatörlere karşılık gelen atama operatörleri de taşınabilir olmayan uzantılardır.

== <= >= != < > İlişkisel operatörler a ve b olmak üzere iki ifadeyi karşılaştırır ve C dili semantiğine göre ilişki kurulabiliyorsa sonuç 1 olur. Aksi takdirde 0 olur.

C'den farklı olarak, bu operatörlerin atama operatörlerinden daha düşük bir önceliğe sahip olduğunu unutmayın; bu da a=b>c ifadesinin (a=b)>c olarak yorumlandığı anlamına gelir.

Ayrıca, standardın (bkz. STANDARTLAR bölümü) gerektirdiğinin aksine, bu operatörler diğer ifadelerin kullanılabileceği her yerde görünebilir. Bu izin taşınabilir olmayan bir uzantıdır.

&& Mantıksal ve operatörü iki ifade alır ve her iki ifade de sıfır dışı ise 1, aksi takdirde 0 döndürür.

Bu bir kısa devre (short-circuit) operatörü değildir.

Bu taşınabilir olmayan bir uzantıdır.

|| Mantıksal veya operatörü iki ifade alır ve ifadelerden biri sıfır dışı ise 1, aksi takdirde 0 döndürür.

Bu bir kısa devre (short-circuit) operatörü değildir.

Bu taşınabilir olmayan bir uzantıdır.

Deyimler

Aşağıdakiler deyimlerdir (statements):

  1. E

  2. { S ; ... ; S }

  3. if ( E ) S

  4. if ( E ) S else S

  5. while ( E ) S

  6. for ( E ; E ; E ) S

  7. Boş bir deyim

  8. break

  9. continue

  10. quit

  11. halt

  12. limits

  13. Çift tırnak içine alınmış karakter dizisi (string)

  14. print E , ... , E

  15. stream E , ... , E

  16. I(), I(E), I(E, E) ve bu şekilde devam eden, I'nın bir void fonksiyon tanımlayıcısı olduğu fonksiyon çağrıları (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü). E argümanları, fonksiyon tanımındaki ilgili parametre bir dizi referansı ise otomatik olarak dizi referanslarına dönüştürülecek olan (bkz. FONKSİYONLAR bölümünün Dizi Referansları alt bölümü) I[] formundaki diziler de olabilir.

4, 9, 11, 12, 14, 15 ve 16 numaralı deyimler taşınabilir olmayan uzantılardır.

Ayrıca taşınabilir olmayan bir uzantı olarak, bir for döngüsünün başlığındaki ifadelerin herhangi biri veya tümü atlanabilir. Koşul (ikinci ifade) atlanırsa, bunun sabit 1 olduğu varsayılır.

break deyimi, bir döngünün yinelenmeyi durdurmasına ve döngünün hemen ardından yürütülmeye devam etmesine neden olur. Buna yalnızca döngüler içinde izin verilir.

continue deyimi, bir döngü yinelemesinin erken durmasına neden olur ve döngü koşulunun test edilmesi dahil olmak üzere döngünün başına geri döner. Buna yalnızca döngüler içinde izin verilir.

if else deyimi C'deki ile aynı şeyi yapar.

quit deyimi, yürütülmeyecek bir dalda olsa bile bc(1) hesap makinesinin çıkmasına neden olur (bu derleme zamanı bir komuttur).

Uyarı: Bu bc(1) hesap makinesinin quit üzerindeki davranışı diğer bc(1) uygulamalarından biraz farklıdır. Diğer bc(1) uygulamaları, quit komutunun bulunduğu satırı ayrıştırmayı bitirir bitirmez çıkacaktır. Bu bc(1) ise çıkmadan önce quit deyiminden önce gelen tamamlanmış ve yürütülebilir tüm deyimleri yürütür.

Başka bir deyişle, aşağıdaki bc(1) kodu için:

for (i = 0; i < 3; ++i) i; quit

Diğer bc(1) uygulamaları hiçbir şey yazdırmayacak, bu bc(1) ise çıkmadan önce ardışık satırlarda 0, 1 ve 2 yazdıracaktır.

halt deyimi, yürütülürse bc(1) hesap makinesinin çıkmasına neden olur. (Bir if deyiminin yürütülmeyen bir dalındaysa quit'in aksine, bc(1) çıkış yapmaz.)

limits deyimi, bu bc(1) hesap makinesinin tabi olduğu sınırları yazdırır. Bu, derleme zamanı bir komut olması yönüyle quit deyimine benzer.

Kendi başına bir ifade değerlendirilir, yazdırılır ve ardından yeni satır karakteri eklenir.

İfadelerin sonuçlarını yazdırmak için hem bilimsel gösterim hem de mühendislik gösterimi mevcuttur. Bilimsel gösterim obase değişkenine 0 atanarak, mühendislik gösterimi ise obase değişkenine 1 atanarak etkinleştirilir. Bunları devre dışı bırakmak için obase değişkenine farklı bir değer atamanız yeterlidir.

bc(1) -s veya -w komut satırı seçenekleriyle (veya eşdeğerleriyle) çalıştırılırsa bilimsel gösterim ve mühendislik gösterimi devre dışı bırakılır.

Sayıları bilimsel gösterimle ve/veya mühendislik gösterimiyle yazdırmak taşınabilir olmayan bir uzantıdır.

Dizeler Dizeler kendi başlarına bir deyim olarak görünürlerse, sonlarında yeni satır karakteri olmadan yazdırılırlar.

Kendi başlarına tek bir deyim olarak görünmenin yanı sıra, dizeler değişkenlere ve dizi elemanlarına भी atanabilir. Değişken parametrelerindeki fonksiyonlara da geçirilebilirler.

Bir dize bekleyen herhangi bir deyime dize atanmış bir değişken verilirse, deyim bir dize almış gibi davranır.

Bir dizeye ya da dize atanmış bir değişkene veya dizi elemanına herhangi bir matematiksel işlem uygulanmaya çalışılırsa, bir hata oluşur ve bc(1) sıfırlanır (bkz. SIFIRLAMA bölümü).

Değişkenlere ve dizi elemanlarına dize atamak ve bunları fonksiyonlara geçirmek taşınabilir olmayan uzantılardır.

Print Deyimi Bir print deyimindeki "ifadeler" dize de olabilir. Dize iseler, özel olarak yorumlanan ters eğik çizgi kaçış dizileri (escape sequences) mevcuttur. Bu dizilerin neler olduğu ve neyin yazdırılmasına neden olduğu aşağıda gösterilmiştir:

\a: \a

\b: \b

\: \

\e: \

\f: \f

\n: \n

\q: "

\r: \r

\t: \t

Ters eğik çizgiyi takip eden diğer karakterler, ters eğik çizginin ve karakterin olduğu gibi yazdırılmasına neden olur.

Bir print deyimindeki dize olmayan tüm ifadeler, yazdırılan diğer ifadeler gibi last değişkenine atanır.

Stream Deyimi Bir stream deyimindeki ifadeler dize de olabilir.

Bir stream deyimine bir dize verilirse, dizeyi kendi deyimi olarak görünmüş gibi yazdırır. Başka bir deyişle, stream deyimi dizeleri normal şekilde, yeni satır olmadan yazdırır.

Bir stream deyimine bir sayı verilirse, sayının bir kopyası kırpılır ve mutlak değeri hesaplanır. Sonuç daha sonra obase 256 imiş gibi yazdırılır ve her bir basamak 8 bitlik bir ASCII karakteri olarak yorumlanarak bir bayt akışı (byte stream) haline getirilir.

Değerlendirme Sırası İşlem sırasını korumak için gerekli olanlar dışında, bir deyimdeki tüm ifadeler soldan sağa doğru değerlendirilir. Bu, örneğin i'nin 0'a eşit olduğu varsayılırsa,

a[i++] = i++

ifadesinde a'nın ilk (veya 0.) elemanının 1 olarak ayarlanacağı ve ifadenin sonunda i'nin 2'ye eşit olacağı anlamına gelir.

Buna fonksiyon argümanları da dahildir. Dolayısıyla i'nin 0'a eşit olduğu varsayılırsa, bu durum

x(i++, i++)

ifadesinde x() fonksiyonuna geçirilen ilk argümanın 0, ikinci argümanın ise 1 olacağı, fonksiyon yürütülmeye başlamadan önce i'nin 2'ye eşit olacağı anlamına gelir.

Fonksiyonlar

Fonksiyon tanımları aşağıdaki gibidir:

define I(I,...,I){ auto I,...,I S;...;S return(E) }

Parametre listesindeki veya auto listesindeki herhangi bir I, bir parametreyi veya auto değişkenini bir dizi yapmak için I[] ile değiştirilebilir ve parametre listesindeki herhangi bir I, bir parametreyi dizi referansı yapmak için *I[] ile değiştirilebilir. Dizi referansları alan fonksiyonları çağıranlar, çağrıda yıldız işareti koymamalıdır; normal dizi parametreleri gibi sadece I[] ile çağrılmalıdırlar ve otomatik olarak referanslara dönüştürüleceklerdir.

Taşınabilir olmayan bir uzantı olarak, bir define deyiminin açılış süslü parantezi bir sonraki satırda görünebilir.

Taşınabilir olmayan bir uzantı olarak, return deyimi aşağıdaki biçimlerden birinde de olabilir:

  1. return

  2. return ( )

  3. return E

İlk ikisi veya bir return deyimi belirtilmemesi, fonksiyon bir void fonksiyon olmadıkça (bkz. aşağıdaki Void Fonksiyonlar alt bölümü) return (0) değerine eşdeğerdir.

Void Fonksiyonlar Fonksiyonlar, aşağıdaki gibi tanımlanan void fonksiyonlar da olabilir:

define void I(I,...,I){ auto I,...,I S;...;S return }

Bunlar, print deyimi hariç, bu tür bir ifadenin tek başına yazdırılacağı bağımsız ifadeler olarak kullanılabilirler.

Void fonksiyonlar yalnızca yukarıda listelenen ilk iki return deyimini kullanabilirler. return deyimini tamamen de atlayabilirler.

"void" kelimesine bir anahtar kelime olarak işlem yapılmaz; void adında değişkenler, diziler ve fonksiyonlar olması hala mümkündür. "void" kelimesine yalnızca define anahtar kelimesinden hemen sonra özel bir işlem uygulanır.

Bu taşınabilir olmayan bir uzantıdır.

Dizi Referansları Parametre listesindeki herhangi bir dizi, eğer şu biçimde bildirilmişse:

*I[]

bir referanstır. Fonksiyondaki dizide yapılan tüm değişiklikler, fonksiyon döndüğünde geçirilen diziye yansıtılır.

Bunun dışında, tüm fonksiyon argümanları değerine göre (by value) geçirilir.

Bu taşınabilir olmayan bir uzantıdır.

Kütüphane

Aşağıdaki tüm fonksiyonlar, genişletilmiş matematik kütüphanesindeki fonksiyonlar (bkz. aşağıdaki Genişletilmiş Kütüphane alt bölümü) dahil olmak üzere, -s seçeneği, -w seçeneği veya eşdeğerleri verildiğinde genişletilmiş matematik kütüphanesinin kullanılamaması dışında, -l veya --mathlib komut satırı bayrakları verildiğinde kullanılabilir.

Standart Kütüphane Standart (bkz. STANDARTLAR bölümü) matematik kütüphanesi için aşağıdaki fonksiyonları tanımlar:

s(x) Radyan cinsinden olduğu varsayılan x'in sinüsünü döndürür.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

c(x) Radyan cinsinden olduğu varsayılan x'in kosinüsünü döndürür.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

a(x) Radyan cinsinden x'in arktanjantını döndürür.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

l(x) x'in doğal logaritmasını döndürür.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

e(x) Matematiksel sabit e'nin x. kuvvetini döndürür.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

j(x, n) x'in n. dereceden (kırpılmış) bessel değerini döndürür.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

Genişletilmiş Kütüphane Genişletilmiş kütüphane, standart tarafından tanımlanan kütüphanenin bir parçası olmadıkları için -s/--standard veya -w/--warn seçenekleri verildiğinde yüklenmez (bkz. STANDARTLAR bölümü).

Genişletilmiş kütüphane taşınabilir olmayan bir uzantıdır.

p(x, y) y bir tamsayı olmasa bile x'in y. kuvvetini hesaplar ve sonucu geçerli scale değerine göre döndürür.

y negatifse ve x 0 ise bu bir hatadır.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

r(x, p) x'i sıfırdan yarım uzaklaşarak yuvarlama (round half away from zero - https://en.wikipedia.org/wiki/Rounding#Round_half_away_from_zero) yuvarlama moduna göre p ondalık basamağına yuvarlayarak döndürür.

ceil(x, p) x'i sıfırdan uzaklaşarak yuvarlama (round away from zero - https://en.wikipedia.org/wiki/Rounding#Rounding_away_from_zero) yuvarlama moduna göre p ondalık basamağına yuvarlayarak döndürür.

f(x) x'in kırpılmış mutlak değerinin faktöriyelini döndürür.

max(a, b) a, b'den büyükse a'yı; aksi takdirde b'yi döndürür.

min(a, b) a, b'den küçükse a'yı; aksi takdirde b'yi döndürür.

perm(n, k) k <= n ise, n'nin kırpılmış mutlak değerinin k'nin kırpılmış mutlak değeri kadar permütasyonunu döndürür. Aksi takdirde 0 döndürür.

comb(n, k) k <= n ise, n'nin kırpılmış mutlak değerinin k'nin kırpılmış mutlak değeri kadar kombinasyonunu döndürür. Aksi takdirde 0 döndürür.

fib(n) n'nin kırpılmış mutlak değerinin Fibonacci sayısını döndürür.

l2(x) x'in 2 tabanındaki logaritmasını döndürür.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

l10(x) x'in 10 tabanındaki logaritmasını döndürür.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

log(x, b) x'in b tabanındaki logaritmasını döndürür.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

cbrt(x) x'in küp kökünü döndürür.

root(x, n) n'nin kırpılmış değerini (r) hesaplar ve x'in r. kökünü geçerli scale değerine göre döndürür.

r 0 veya negatifse, bu bir hata oluşturur ve bc(1) hesap makinesinin sıfırlanmasına neden olur (bkz. SIFIRLAMA bölümü). r çift sayıysa ve x negatifse de bir hata oluşturur ve bc(1) hesap makinesinin sıfırlanmasına neden olur.

gcd(a, b) a'nın kırpılmış mutlak değeri ile b'nin kırpılmış mutlak değerinin en büyük ortak bölenini döndürür.

lcm(a, b) a'nın kırpılmış mutlak değeri ile b'nin kırpılmış mutlak değerinin en küçük ortak katını döndürür.

pi(p) pi değerini p ondalık basamağına kadar döndürür.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

t(x) Radyan cinsinden olduğu varsayılan x'in tanjantını döndürür.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

a2(y, x) Radyan cinsinden y/x'in arktanjantını döndürür. Hem y hem de x 0'a eşitse, bir hata oluşturur ve bc(1) hesap makinesinin sıfırlanmasına neden olur (bkz. SIFIRLAMA bölümü). Aksi takdirde, x 0'dan büyükse a(y/x) döndürür. x 0'dan küçükse ve y 0'dan büyük veya ona eşitse a(y/x)+pi döndürür. x 0'dan küçükse ve y 0'dan küçükse a(y/x)-pi döndürür. x 0'a eşitse ve y 0'dan büyükse pi/2 döndürür. x 0'a eşitse ve y 0'dan küçükse -pi/2 döndürür.

Bu fonksiyon birçok programlama dilindeki atan2() fonksiyonu ile aynıdır.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

sin(x) Radyan cinsinden olduğu varsayılan x'in sinüsünü döndürür.

Bu s(x) için bir takma addır.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

cos(x) Radyan cinsinden olduğu varsayılan x'in kosinüsünü döndürür.

Bu c(x) için bir takma addır.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

tan(x) Radyan cinsinden olduğu varsayılan x'in tanjantını döndürür.

x 1 veya -1 değerine eşitse, bu bir hata oluşturur ve bc(1) hesap makinesinin sıfırlanmasına neden olur (bkz. SIFIRLAMA bölümü).

Bu t(x) için bir takma addır.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

atan(x) Radyan cinsinden x'in arktanjantını döndürür.

Bu a(x) için bir takma addır.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

atan2(y, x) Radyan cinsinden y/x'in arktanjantını döndürür. Hem y hem de x 0'a eşitse, bir hata oluşturur ve bc(1) hesap makinesinin sıfırlanmasına neden olur (bkz. SIFIRLAMA bölümü). Aksi takdirde, x 0'dan büyükse a(y/x) döndürür. x 0'dan küçükse ve y 0'dan büyük veya ona eşitse a(y/x)+pi döndürür. x 0'dan küçükse ve y 0'dan küçükse a(y/x)-pi döndürür. x 0'a eşitse ve y 0'dan büyükse pi/2 döndürür. x 0'a eşitse ve y 0'dan küçükse -pi/2 döndürür.

Bu fonksiyon birçok programlama dilindeki atan2() fonksiyonu ile aynıdır.

Bu a2(y, x) için bir takma addır.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

r2d(x) x'i radyandan dereceye dönüştürür ve sonucu döndürür.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

d2r(x) x'i dereceden radyana dönüştürür ve sonucu döndürür.

Bu bir transandantal fonksiyondur (bkz. aşağıdaki Transandantal Fonksiyonlar alt bölümü).

frand(p) p'nin kırpılmış mutlak değerine eşit virgülden sonraki ondalık basamak sayısına sahip, 0 (dahil) ile 1 (hariç) arasında sözde rastgele bir sayı üretir. p 0 değilse, bu fonksiyonun çağrılması seed değerini değiştirecektir. p 0 ise 0 döndürür ve seed değiştirilmez.

ifrand(i, p) virgülden sonraki ondalık basamak sayısı p'nin kırpılmış mutlak değerine eşit olan, 0 (dahil) ile i'nin kırpılmış mutlak değeri (hariç) arasında sözde rastgele bir sayı üretir. i'nin mutlak değeri 2'ye eşit veya ondan büyükse ve p 0 değilse, bu fonksiyonun çağrılması seed değerini değiştirecektir; aksi takdirde 0 döndürür ve seed değiştirilmez.

i2rand(a, b) a ve b'nin kırpılmış değerlerini alır ve bunları dahil sınırlar olarak kullanarak sözde rastgele bir tamsayı üretir. a ve b'nin kırpılmış değerlerinin farkı 0 ise, kırpılmış değer döndürür ve seed değiştirilmez. Aksi takdirde, bu fonksiyon seed değerini değiştirecektir.

srand(x) 0.5 olasılıkla işareti ters çevrilmiş x değerini döndürür. Diğer bir deyişle, x'in işaretini rastgele hale getirir.

brand() Rastgele bir mantıksal değer (0 veya 1) döndürür.

band(a, b) Hem a hem de b'nin kırpılmış mutlak değerini alır ve aralarındaki bitsel ve (bitwise and) işleminin sonucunu hesaplayıp döndürür.

İşaretli ikiye tümleyen (two’s complement) argümanları kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bor(a, b) Hem a hem de b'nin kırpılmış mutlak değerini alır ve aralarındaki bitsel veya (bitwise or) işleminin sonucunu hesaplayıp döndürür.

İşaretli ikiye tümleyen (two’s complement) argümanları kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bxor(a, b) Hem a hem de b'nin kırpılmış mutlak değerini alır ve aralarındaki bitsel özel veya (bitwise xor) işleminin sonucunu hesaplayıp döndürür.

İşaretli ikiye tümleyen (two’s complement) argümanları kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bshl(a, b) Hem a hem de b'nin kırpılmış mutlak değerini alır ve a'nın b kadar sola kaydırılmış bitsel sonucunu hesaplayıp döndürür.

İşaretli ikiye tümleyen (two’s complement) argümanları kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bshr(a, b) Hem a hem de b'nin kırpılmış mutlak değerini alır ve a'nın b kadar sağa kaydırılmış bitsel kırpılmış sonucunu hesaplayıp döndürür.

İşaretli ikiye tümleyen (two’s complement) argümanları kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bnotn(x, n) x'in kırpılmış mutlak değerini alır ve n'nin kırpılmış mutlak değeriyle aynı sayıda bayta sahipmiş gibi bitsel değil (bitwise not) işlemini gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bnot8(x) x'in kırpılmış mutlak değerinin 8 ikili basamağa (1 işaretsiz bayt) sahipmiş gibi bitsel değil işlemini gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bnot16(x) x'in kırpılmış mutlak değerinin 16 ikili basamağa (2 işaretsiz bayt) sahipmiş gibi bitsel değil işlemini gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bnot32(x) x'in kırpılmış mutlak değerinin 32 ikili basamağa (4 işaretsiz bayt) sahipmiş gibi bitsel değil işlemini gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bnot64(x) x'in kırpılmış mutlak değerinin 64 ikili basamağa (8 işaretsiz bayt) sahipmiş gibi bitsel değil işlemini gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bnot(x) x'in kırpılmış mutlak değerinin minimum sayıda ikinin kuvveti olan işaretsiz bayta sahipmiş gibi bitsel değil işlemini gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

brevn(x, n) x'in kırpılmış mutlak değeri üzerinde, n'nin kırpılmış mutlak değeriyle aynı sayıda 8 bitlik bayta sahipmiş gibi bir bit tersine çevirme (bit reversal) işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

brev8(x) x'in kırpılmış mutlak değeri üzerinde 8 ikili basamağa (1 işaretsiz bayt) sahipmiş gibi bir bit tersine çevirme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

brev16(x) x'in kırpılmış mutlak değeri üzerinde 16 ikili basamağa (2 işaretsiz bayt) sahipmiş gibi bir bit tersine çevirme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

brev32(x) x'in kırpılmış mutlak değeri üzerinde 32 ikili basamağa (4 işaretsiz bayt) sahipmiş gibi bir bit tersine çevirme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

brev64(x) x'in kırpılmış mutlak değeri üzerinde 64 ikili basamağa (8 işaretsiz bayt) sahipmiş gibi bir bit tersine çevirme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

brev(x) x'in kırpılmış mutlak değeri üzerinde minimum sayıda ikinin kuvveti olan işaretsiz bayta sahipmiş gibi bir bit tersine çevirme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

broln(x, p, n) x'in kırpılmış mutlak değeri üzerinde, n'nin kırpılmış mutlak değeriyle aynı sayıda işaretsiz 8 bitlik bayta sahipmiş gibi, p'nin kırpılmış mutlak değerinin n'nin 8 bitlik baytındaki ikili basamak sayısı kuvvetine göre modu kadar sola bitsel döndürme (left bitwise rotation) işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

brol8(x, p) x'in kırpılmış mutlak değeri üzerinde 8 ikili basamağa (1 işaretsiz bayt) sahipmiş gibi, p'nin kırpılmış mutlak değerinin 2^8'e göre modu kadar sola bitsel döndürme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

brol16(x, p) x'in kırpılmış mutlak değeri üzerinde 16 ikili basamağa (2 işaretsiz bayt) sahipmiş gibi, p'nin kırpılmış mutlak değerinin 2^16'ya göre modu kadar sola bitsel döndürme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

brol32(x, p) x'in kırpılmış mutlak değeri üzerinde 32 ikili basamağa (4 işaretsiz bayt) sahipmiş gibi, p'nin kırpılmış mutlak değerinin 2^32'ye göre modu kadar sola bitsel döndürme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

brol64(x, p) x'in kırpılmış mutlak değeri üzerinde 64 ikili basamağa (8 işaretsiz bayt) sahipmiş gibi, p'nin kırpılmış mutlak değerinin 2^64'e göre modu kadar sola bitsel döndürme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

brol(x, p) x'in kırpılmış mutlak değeri üzerinde minimum sayıda ikinin kuvveti olan işaretsiz 8 bitlik bayta sahipmiş gibi, p'nin kırpılmış mutlak değerinin minimum sayıdaki 8 bitlik bayt içindeki ikili basamak sayısı kuvvetine göre modu kadar sola bitsel döndürme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

brorn(x, p, n) x'in kırpılmış mutlak değeri üzerinde, n'nin kırpılmış mutlak değeriyle aynı sayıda işaretsiz 8 bitlik bayta sahipmiş gibi, p'nin kırpılmış mutlak değerinin n'nin 8 bitlik baytındaki ikili basamak sayısı kuvvetine göre modu kadar sağa bitsel döndürme (right bitwise rotation) işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bror8(x, p) x'in kırpılmış mutlak değeri üzerinde 8 ikili basamağa (1 işaretsiz bayt) sahipmiş gibi, p'nin kırpılmış mutlak değerinin 2^8'e göre modu kadar sağa bitsel döndürme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bror16(x, p) x'in kırpılmış mutlak değeri üzerinde 16 ikili basamağa (2 işaretsiz bayt) sahipmiş gibi, p'nin kırpılmış mutlak değerinin 2^16'ya göre modu kadar sağa bitsel döndürme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bror32(x, p) x'in kırpılmış mutlak değeri üzerinde 32 ikili basamağa (2 işaretsiz bayt) sahipmiş gibi, p'nin kırpılmış mutlak değerinin 2^32'ye göre modu kadar sağa bitsel döndürme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bror64(x, p) x'in kırpılmış mutlak değeri üzerinde 64 ikili basamağa (2 işaretsiz bayt) sahipmiş gibi, p'nin kırpılmış mutlak değerinin 2^64'e göre modu kadar sağa bitsel döndürme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bror(x, p) x'in kırpılmış mutlak değeri üzerinde minimum sayıda ikinin kuvveti olan işaretsiz 8 bitlik bayta sahipmiş gibi, p'nin kırpılmış mutlak değerinin minimum sayıdaki 8 bitlik bayt içindeki ikili basamak sayısı kuvvetine göre modu kadar sağa bitsel döndürme işlemi gerçekleştirir.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bmodn(x, n) x'in kırpılmış mutlak değerinin, n'nin kırpılmış mutlak değerinin 8 ile çarpımının ikili kuvvetine göre modunu döndürür.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bmod8(x, n) x'in kırpılmış mutlak değerinin 2^8'e göre modunu döndürür.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bmod16(x, n) x'in kırpılmış mutlak değerinin 2^16'ya göre modunu döndürür.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bmod32(x, n) x'in kırpılmış mutlak değerinin 2^32'ya göre modunu döndürür.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

bmod64(x, n) x'in kırpılmış mutlak değerinin 2^64'ya göre modunu döndürür.

İşaretli ikiye tümleyen (two’s complement) argümanı kullanmak istiyorsanız, dönüştürmek için s2u(x) fonksiyonunu kullanın.

plz(x) x 0'a eşit değilse, -1'den büyük ve 1'den küçükse, -z seçeneğinin (bkz. SEÇENEKLER bölümü) kullanımına bakılmaksızın ve sonunda yeni satır karakteri olmadan başında sıfırla yazdırılır.

Aksi takdirde x, sonunda yeni satır karakteri olmadan normal şekilde yazdırılır.

plznl(x) x 0'a eşit değilse, -1'den büyük ve 1'den küçükse, -z seçeneğinin (bkz. SEÇENEKLER bölümü) kullanımına bakılmaksızın ve sonunda yeni satır karakteriyle başında sıfırla yazdırılır.

Aksi takdirde x, sonunda yeni satır karakteriyle normal şekilde yazdırılır.

pnlz(x) x 0'a eşit değilse, -1'den büyük ve 1'den küçükse, -z seçeneğinin (bkz. SEÇENEKLER bölümü) kullanımına bakılmaksızın ve sonunda yeni satır karakteri olmadan başında sıfır olmadan yazdırılır.

Aksi takdirde x, sonunda yeni satır karakteri olmadan normal şekilde yazdırılır.

pnlznl(x) x 0'a eşit değilse, -1'den büyük ve 1'den küçükse, -z seçeneğinin (bkz. SEÇENEKLER bölümü) kullanımına bakılmaksızın ve sonunda yeni satır karakteriyle başında sıfır olmadan yazdırılır.

Aksi takdirde x, sonunda yeni satır karakteriyle normal şekilde yazdırılır.

ubytes(x) x'in kırpılmış mutlak değerini tutmak için gereken işaretsiz tamsayı bayt sayısını döndürür.

sbytes(x) x'in kırpılmış değerini tutmak için gereken işaretli, ikiye tümleyen tamsayı bayt sayısını döndürür.

s2u(x) x negatif değilse x'i döndürür. Negatifse, x'in ikiye tümleyen işaretli tamsayı olarak ne olacağını hesaplar ve ikili sistemde aynı gösterime sahip olacak negatif olmayan tamsayıyı döndürür.

s2un(x,n) x negatif değilse x'i döndürür. Negatifse, x'in n baytlık ikiye tümleyen işaretli bir tamsayı olarak ne olacağını hesaplar ve ikili sistemde aynı gösterime sahip olacak negatif olmayan tamsayıyı döndürür. x, n baytlık ikiye tümleyen işaretli bayta sığmıyorsa, sığması için kırpılır.

hex(x) x'in onaltılık (base 16) gösterimini çıktı olarak verir.

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

binary(x) x'in ikili (base 2) gösterimini çıktı olarak verir.

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

output(x, b) x'in b tabanındaki gösterimini çıktı olarak verir.

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

uint(x) x'in işaretsiz bir tamsayı olarak ikili ve onaltılık gösterimini mümkün olan en az ikinin kuvveti olan bayt cinsinden çıktı olarak verir. Her iki çıktı da aralarında boşluk olan baytlara bölünür.

x bir tamsayı değilse veya negatifse bunun yerine bir hata mesajı yazdırılır, ancak bc(1) sıfırlanmaz (bkz. SIFIRLAMA bölümü).

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

int(x) x'in işaretli, ikiye tümleyen bir tamsayı olarak ikili ve onaltılık gösterimini mümkün olan en az ikinin kuvveti olan bayt cinsinden çıktı olarak verir. Her iki çıktı da aralarında boşluk olan baytlara bölünür.

x bir tamsayı değilse bunun yerine bir hata mesajı yazdırılır, ancak bc(1) sıfırlanmaz (bkz. SIFIRLAMA bölümü).

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

uintn(x, n) x'in n baytlık işaretsiz bir tamsayı olarak ikili ve onaltılık gösterimini çıktı olarak verir. Her iki çıktı da aralarında boşluk olan baytlara bölünür.

x bir tamsayı değilse, negatifse veya n bayta sığmıyorsa bunun yerine bir hata mesajı yazdırılır, ancak bc(1) sıfırlanmaz (bkz. SIFIRLAMA bölümü).

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

intn(x, n) x'in n baytlık işaretli, ikiye tümleyen bir tamsayı olarak ikili ve onaltılık gösterimini çıktı olarak verir. Her iki çıktı da aralarında boşluk olan baytlara bölünür.

x bir tamsayı değilse veya n bayta sığmıyorsa bunun yerine bir hata mesajı yazdırılır, ancak bc(1) sıfırlanmaz (bkz. SIFIRLAMA bölümü).

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

uint8(x) x'in 1 baytlık işaretsiz bir tamsayı olarak ikili ve onaltılık gösterimini çıktı olarak verir. Her iki çıktı da aralarında boşluk olan baytlara bölünür.

x bir tamsayı değilse, negatifse veya 1 bayta sığmıyorsa bunun yerine bir hata mesajı yazdırılır, ancak bc(1) sıfırlanmaz (bkz. SIFIRLAMA bölümü).

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

int8(x) x'in 1 baytlık işaretli, ikiye tümleyen bir tamsayı olarak ikili ve onaltılık gösterimini çıktı olarak verir. Her iki çıktı da aralarında boşluk olan baytlara bölünür.

x bir tamsayı değilse veya 1 bayta sığmıyorsa bunun yerine bir hata mesajı yazdırılır, ancak bc(1) sıfırlanmaz (bkz. SIFIRLAMA bölümü).

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

uint16(x) x'in 2 baytlık işaretsiz bir tamsayı olarak ikili ve onaltılık gösterimini çıktı olarak verir. Her iki çıktı da aralarında boşluk olan baytlara bölünür.

x bir tamsayı değilse, negatifse veya 2 bayta sığmıyorsa bunun yerine bir hata mesajı yazdırılır, ancak bc(1) sıfırlanmaz (bkz. SIFIRLAMA bölümü).

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

int16(x) x'in 2 baytlık işaretli, ikiye tümleyen bir tamsayı olarak ikili ve onaltılık gösterimini çıktı olarak verir. Her iki çıktı da aralarında boşluk olan baytlara bölünür.

x bir tamsayı değilse veya 2 bayta sığmıyorsa bunun yerine bir hata mesajı yazdırılır, ancak bc(1) sıfırlanmaz (bkz. SIFIRLAMA bölümü).

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

uint32(x) x'in 4 baytlık işaretsiz bir tamsayı olarak ikili ve onaltılık gösterimini çıktı olarak verir. Her iki çıktı da aralarında boşluk olan baytlara bölünür.

x bir tamsayı değilse, negatifse veya 4 bayta sığmıyorsa bunun yerine bir hata mesajı yazdırılır, ancak bc(1) sıfırlanmaz (bkz. SIFIRLAMA bölümü).

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

int32(x) x'in 4 baytlık işaretli, ikiye tümleyen bir tamsayı olarak ikili ve onaltılık gösterimini çıktı olarak verir. Her iki çıktı da aralarında boşluk olan baytlara bölünür.

x bir tamsayı değilse veya 4 bayta sığmıyorsa bunun yerine bir hata mesajı yazdırılır, ancak bc(1) sıfırlanmaz (bkz. SIFIRLAMA bölümü).

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

uint64(x) x'in 8 baytlık işaretsiz bir tamsayı olarak ikili ve onaltılık gösterimini çıktı olarak verir. Her iki çıktı da aralarında boşluk olan baytlara bölünür.

x bir tamsayı değilse, negatifse veya 8 bayta sığmıyorsa bunun yerine bir hata mesajı yazdırılır, ancak bc(1) sıfırlanmaz (bkz. SIFIRLAMA bölümü).

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

int64(x) x'in 8 baytlık işaretli, ikiye tümleyen bir tamsayı olarak ikili ve onaltılık gösterimini çıktı olarak verir. Her iki çıktı da aralarında boşluk olan baytlara bölünür.

x bir tamsayı değilse veya 8 bayta sığmıyorsa bunun yerine bir hata mesajı yazdırılır, ancak bc(1) sıfırlanmaz (bkz. SIFIRLAMA bölümü).

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

hex_uint(x, n) x'in kırpılmış mutlak değerinin n bayt kullanılarak onaltılık sistemde işaretsiz bir tamsayı olarak gösterimini çıktı olarak verir. n çok küçükse değerin tamamı çıktı olarak verilmez.

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

binary_uint(x, n) x'in kırpılmış mutlak değerinin n bayt kullanılarak ikili sistemde işaretsiz bir tamsayı olarak gösterimini çıktı olarak verir. n çok küçükse değerin tamamı çıktı olarak verilmez.

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

output_uint(x, n) x'in kırpılmış mutlak değerinin n bayt kullanılarak geçerli obase (bkz. SÖZDİZİMİ bölümü) değerinde işaretsiz bir tamsayı olarak gösterimini çıktı olarak verir. n çok küçükse değerin tamamı çıktı olarak verilmez.

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

output_byte(x, i) x'in kırpılmış mutlak değerinin i baytını çıktı olarak verir; burada 0 en önemsiz (least significant) bayt ve bayt_sayısı - 1 en önemli (most significant) bayttır.

Bu bir void fonksiyondur (bkz. FONKSİYONLAR bölümünün Void Fonksiyonlar alt bölümü).

Transandantal Fonksiyonlar Tüm transandantal fonksiyonlar 1 ULP (https://en.wikipedia.org/wiki/Unit_in_the_last_place) değerine kadar biraz hatalı sonuçlar döndürebilir. Bu kaçınılmazdır ve https://people.eecs.berkeley.edu/~wkahan/LOG10HAF.TXT adresindeki makale, transandantal fonksiyonlar için kesin sonuçları hesaplamanın neden imkansız ve gereksiz olduğunu açıklamaktadır.

Olası hatalar nedeniyle, kullanıcıların bu fonksiyonları gereken duyarlılığın (scale) en az 1 fazlasıyla çağırmalarını öneririm. Kesin sonuçlar kesinlikle gerekliyse, kullanıcılar duyarlılığı (scale) iki katına çıkarabilir ve ardından kırpabilirler.

Standart matematik kütüphanesindeki transandantal fonksiyonlar şunlardır:

• s(x)

• c(x)

• a(x)

• l(x)

• e(x)

• j(x, n)

Genişletilmiş matematik kütüphanesindeki transandantal fonksiyonlar şunlardır:

• l2(x)

• l10(x)

• log(x, b)

• pi(p)

• t(x)

• a2(y, x)

• sin(x)

• cos(x)

• tan(x)

• atan(x)

• atan2(y, x)

• r2d(x)

• d2r(x)

Sıfırlama

bc(1) bir hata ile veya varsayılan olmayan bir işleyiciye sahip olduğu bir sinyal ile karşılaştığında sıfırlanır. Bu, birkaç şeyin gerçekleştiği anlamına gelir.

İlk olarak, yürütülen tüm fonksiyonlar durdurulur ve yığından çekilir. Bu davranış, programlama dillerindeki istisnalara (exceptions) benzer. Ardından yürütme noktası, yürütülmeyi bekleyen tüm kodların (tüm fonksiyonlar döndükten sonra) atlanacağı şekilde ayarlanır.

Böylece bc(1) sıfırlandığında, yürütülmeyi bekleyen kalan kodları atlar. Ardından, etkileşimli moddaysa ve hata ölümcül bir hata değilse (bkz. ÇIKIŞ DURUMU bölümü), daha fazla girdi ister; aksi takdirde uygun dönüş koduyla çıkar.

Bu sıfırlama davranışının, hataya neden olan ifadeden hemen sonraki ifadeyi yürütmeye başlamaya çalışan GNU bc(1) uygulamasından farklı olduğunu unutmayın.

Performans

Çoğu bc(1) uygulaması bir seferde 1 ondalık basamağın değerini hesaplamak için char türlerini kullanır, ancak bu yavaş olabilir. Bu bc(1) ise farklı bir şey yapar.

Bir seferde 1'den fazla ondalık basamak hesaplamak için büyük tamsayılar kullanır. BC_LONG_BIT (bkz. SINIRLAR bölümü) değerinin 64 olduğu bir ortamda derlenmişse, her tamsayı 9 ondalık basamağa sahiptir. BC_LONG_BIT değerinin 32 olduğu bir ortamda derlenmişse, her tamsayı 4 ondalık basamağa sahiptir. Bu değer (büyük tamsayı başına ondalık basamak sayısı) BC_BASE_DIGS olarak adlandırılır.

BC_LONG_BIT ve BC_BASE_DIGS değerlerinin gerçek değerleri limits deyimi ile sorgulanabilir.

Ek olarak, bu bc(1) taşma (overflow) kontrolü için daha da büyük bir tamsayı kullanır. Bu tamsayı türü BC_LONG_BIT değerine bağlıdır, ancak basamakları saklamak için kullanılan tamsayı türünün her zaman en az iki katı büyüklüktedir.

Sınırlar

Aşağıdakiler bc(1) üzerindeki sınırlardır:

BC_LONG_BIT bc(1) hesap makinesinin derlendiği ortamdaki long türünün bit sayısı. Bu, tek bir büyük tamsayıda kaç ondalık basamak saklanabileceğini belirler (bkz. PERFORMANS bölümü).

BC_BASE_DIGS Büyük tamsayı başına ondalık basamak sayısı (bkz. PERFORMANS bölümü). BC_LONG_BIT değerine bağlıdır.

BC_BASE_POW Her bir büyük tamsayının saklayabileceği maksimum ondalık sayı (bkz. BC_BASE_DIGS) artı 1. BC_BASE_DIGS değerine bağlıdır.

BC_OVERFLOW_MAX Taşma türünün (bkz. PERFORMANS bölümü) tutabileceği maksimum sayı. BC_LONG_BIT değerine bağlıdır.

BC_BASE_MAX Maksimum çıkış tabanı. BC_BASE_POW olarak ayarlanmıştır.

BC_DIM_MAX Dizilerin maksimum boyutu. SIZE_MAX-1 olarak ayarlanmıştır.

BC_SCALE_MAX Maksimum scale değeri. BC_OVERFLOW_MAX-1 olarak ayarlanmıştır.

BC_STRING_MAX Dizelerin maksimum uzunluğu. BC_OVERFLOW_MAX-1 olarak ayarlanmıştır.

BC_NAME_MAX Tanımlayıcıların maksimum uzunluğu. BC_OVERFLOW_MAX-1 olarak ayarlanmıştır.

BC_NUM_MAX Virgülden sonraki basamaklar da dahil olmak üzere bir sayının maksimum uzunluğu (ondalık basamak cinsinden). BC_OVERFLOW_MAX-1 olarak ayarlanmıştır.

BC_RAND_MAX rand() işleneni tarafından döndürülen maksimum tamsayı (dahil). 2^BC_LONG_BIT-1 olarak ayarlanmıştır.

Üs İzin verilen maksimum üs (pozitif veya negatif). BC_OVERFLOW_MAX olarak ayarlanmıştır.

Değişken Sayısı Maksimum değişken/dizi sayısı. SIZE_MAX-1 olarak ayarlanmıştır.

Gerçek değerler limits deyimi ile sorgulanabilir.

Bu sınırların fiilen var olmadığı varsayılır; sınırlar o kadar büyüktür ki (en azından 64 bit makinelerde) sorun oluşturacakları bir nokta olmamalıdır. Aslında, bu sınırlara ulaşılmadan önce bellek tükenmelidir.

Çevre Değişkenleri

Taşınabilir olmayan uzantılar olarak, bc(1) aşağıdaki çevre değişkenlerini tanır:

POSIXLY_CORRECT Bu değişken varsa (içeriği ne olursa olsun), bc(1) -s seçeneği verilmiş gibi davranır.

BC_ENV_ARGS Bu, bc(1) hesap makinesine komut satırı argümanları vermenin başka bir yoludur. Diğer tüm komut satırı argümanlarıyla aynı biçimde olmalıdırlar. Bunlar her zaman önce işlenir, dolayısıyla BC_ENV_ARGS içinde verilen tüm dosyalar, komut satırında verilen argümanlardan ve dosyalardan önce işlenecektir. Bu, kullanıcıya her çağrıda kullanılacak "standart" seçenekleri ve dosyaları ayarlama yeteneği verir. Bu tür dosyaların içermesi en yararlı olan şey, kullanıcının bc(1) her çalıştığında isteyebileceği yararlı fonksiyonlar olacaktır.

BC_ENV_ARGS değişkenini ayrıştıran kod, tırnak içine alınmış argümanları doğru bir şekilde işleyecektir ancak kaçış dizilerini anlamaz. Örneğin, "/home/gavin/some bc file.bc" dizesi doğru şekilde ayrıştırılacaktır ancak "/home/gavin/some "bc" file.bc" dizesi ters eğik çizgileri de içerecektir.

Tırnak işareti ayrıştırması ' veya " olmak üzere her iki tür tırnak işaretini de işleyecektir. Dolayısıyla, adında herhangi bir sayıda tek tırnak işareti olan bir dosyanız varsa, dış tırnak işaretleri olarak "some `bc' file.bc" dizesinde olduğu gibi çift tırnak işaretlerini kullanabilirsiniz ve adında çift tırnak işaretleri olan bir dosyanız varsa bunun tersini yapabilirsiniz. Bununla birlikte, BC_ENV_ARGS içinde her iki tür tırnak işaretini de içeren bir dosyanın işlenmesi, ayrıştırmanın karmaşıklığı nedeniyle desteklenmez, ancak bu tür dosyalar ayrıştırmanın kabuk tarafından yapıldığı komut satırında hala desteklenmektedir.

BC_LINE_LENGTH Bu çevre değişkeni varsa ve UINT16_MAX (2^16-1) değerinden küçük, 1'den büyük bir tamsayı içeriyorsa, bc(1) ters eğik çizgi () dahil olmak üzere satırları o uzunlukta çıktı olarak verecektir. Varsayılan satır uzunluğu 70'tir.

Özel 0 değeri, satır uzunluğu kontrolünü devre dışı bırakacak ve sayıları satır uzunluğunu dikkate almadan, ters eğik çizgiler ve yeni satırlar olmadan yazdıracaktır.

BC_BANNER Bu çevre değişkeni varsa ve bir tamsayı içeriyorsa, bc(1) etkileşimli moddayken sıfır dışı bir değer telif hakkı başlığını etkinleştirir, sıfır ise devre dışı bırakır.

bc(1) etkileşimli modda değilse (bkz. ETKİLEŞİMLİ MOD bölümü), bu çevre değişkeninin hiçbir etkisi yoktur çünkü bc(1) etkileşimli modda olmadığında başlığı yazdırmaz.

Bu çevre değişkeni, -h veya --help seçenekleriyle sorgulanabilen varsayılan değeri geçersiz kılar.

BC_SIGINT_RESET bc(1) etkileşimli modda değilse (bkz. ETKİLEŞİMLİ MOD bölümü), bu çevre değişkeninin hiçbir etkisi yoktur çünkü bc(1) etkileşimli modda olmadığında SIGINT sinyaliyle çıkar.

Ancak bc(1) etkileşimli moddayken, bu çevre değişkeni varsa ve bir tamsayı içeriyorsa, sıfır dışı bir değer bc(1) hesap makinesinin çıkmak yerine SIGINT sinyaliyle sıfırlanmasını sağlar, sıfır ise bc(1) hesap makinesinin çıkmasını sağlar. Bu çevre değişkeni varsa ve bir tamsayı değilse, bc(1) SIGINT sinyaliyle çıkacaktır.

Bu çevre değişkeni, -h veya --help seçenekleriyle sorgulanabilen varsayılan değeri geçersiz kılar.

BC_TTY_MODE TTY modu mevcut değilse (bkz. TTY MODU bölümü), bu çevre değişkeninin hiçbir etkisi yoktur.

Ancak TTY modu mevcut olduğunda, bu çevre değişkeni varsa ve bir tamsayı içeriyorsa, sıfır dışı bir değer bc(1) hesap makinesinin TTY modunu kullanmasını sağlar, sıfır ise bc(1) hesap makinesinin TTY modunu kullanmamasını sağlar.

Bu çevre değişkeni, -h veya --help seçenekleriyle sorgulanabilen varsayılan değeri geçersiz kılar.

BC_PROMPT TTY modu mevcut değilse (bkz. TTY MODU bölümü), bu çevre değişkeninin hiçbir etkisi yoktur.

Ancak TTY modu mevcut olduğunda, bu çevre değişkeni varsa ve bir tamsayı içeriyorsa, sıfır dışı bir değer bc(1) hesap makinesinin bir istem kullanmasını sağlar, sıfır veya tamsayı olmayan bir değer ise bc(1) hesap makinesinin bir istem kullanmamasını sağlar. Bu çevre değişkeni mevcut değilse ve BC_TTY_MODE mevcutsa, BC_TTY_MODE çevre değişkeninin değeri kullanılır.

Bu çevre değişkeni ve BC_TTY_MODE çevre değişkeni, -h veya --help seçenekleriyle sorgulanabilen varsayılan değeri geçersiz kılar.

BC_EXPR_EXIT Komut satırıonda -e, --expression, -f veya --file ile herhangi bir ifade veya ifade dosyası verilmişse, bu çevre değişkeni mevcutsa ve bir tamsayı içeriyorsa, sıfır dışı bir değer bc(1) hesap makinesinin ifadeleri ve ifade dosyalarını yürüttükten sonra çıkmasını sağlar, sıfır değeri ise bc(1) hesap makinesinin çıkmamasını sağlar.

Bu çevre değişkeni, -h veya --help seçenekleriyle sorgulanabilen varsayılan değeri geçersiz kılar.

BC_DIGIT_CLAMP Sayılar ayrıştırılırken bu çevre değişkeni varsa ve bir tamsayı içeriyorsa, sıfır dışı bir değer bc(1) hesap makinesinin geçerli ibase değerinden büyük veya ona eşit olan basamakları sınırlamasını (clamping) sağlar, böylece bu tür tüm basamaklar ibase değerinin 1 eksiğine eşit kabul edilir. Sıfır değeri ise bu tür sınırlamayı devre dışı bırakır, böylece bu basamaklar her zaman ibase değerinin kuvveti ile çarpılan kendi değerlerine eşit olur.

Bu, standart gereği (bkz. STANDARTLAR bölümü) tek basamaklı sayılar için asla geçerli değildir.

Bu çevre değişkeni, -h veya --help seçenekleriyle sorgulanabilen varsayılan değeri geçersiz kılar.

Çıkış Durumu

bc(1) aşağıdaki çıkış durumlarını döndürür:

0 Hata yok.

1 Bir matematik hatası oluştu. Matematik hataları normal yürütme sürecinde meydana geleceğinden, bu durum beklenen hatalar için 1 kullanma standart uygulamasını takip eder.

Matematik hataları arasında 0'a bölme, negatif bir sayının karekökünü alma, sözde rastgele sayı üreteci için sınır olarak negatif bir sayı kullanma, negatif bir sayıyı donanım tamsayısına dönüştürmeye çalışma, bir sayıyı donanım tamsayısına dönüştürürken taşma oluşması, bir sayının boyutunu hesaplarken taşma oluşması ve tamsayı gereken yerde tamsayı olmayan bir değer kullanmaya çalışma yer alır.

Donanım tamsayısına dönüştürme; üs (^), duyarlılık basamağı (@), sola kaydırma (<<) ve sağa kaydırma (>>) operatörlerinin ve bunlara karşılık gelen atama operatörlerinin ikinci işleneni için gerçekleşir.

2 Bir ayrıştırma (parse) hatası oluştu.

Ayrıştırma hataları arasında beklenmedik EOF (dosya sonu), geçersiz bir karakter kullanılması, bir dizenin veya yorumun sonunun bulunamaması, geçersiz olduğu bir yerde belirteç (token) kullanılması, geçersiz bir ifade verilmesi, geçersiz bir print deyimi verilmesi, geçersiz bir fonksiyon tanımı verilmesi, adlandırılmış bir ifade olmayan bir ifadeye atama yapılmaya çalışılması (bkz. SÖZDİZİMİ bölümünün Adlandırılmış İfadeler alt bölümü), geçersiz bir auto listesi verilmesi, yinelenen bir auto/fonksiyon parametresi olması, bir kod bloğunun sonunun bulunamaması, bir void fonksiyondan değer döndürülmeye çalışılması, bir değişkenin referans olarak kullanılmaya çalışılması ve -s seçeneği veya herhangi bir eşdeğeri verildiğinde herhangi bir uzantı kullanılması yer alır.

3 Bir çalışma zamanı (runtime) hatası oluştu.

Çalışma zamanı hataları arasında herhangi bir genel değişkene (ibase, obase veya scale) geçersiz bir sayı atanması, bir read() çağrısına hatalı bir ifade verilmesi, bir read() çağrısının içinde read() çağrılması, tür hataları, fonksiyonlara yanlış sayıda argüman geçirilmesi, tanımlanmamış bir fonksiyonun çağrılmaya çalışılması ve bir ifadede değer olarak void fonksiyon çağrısının kullanılmaya çalışılması yer alır.

4 Ölümcül bir hata (fatal error) oluştu.

Ölümcül hatalar arasında bellek tahsis hataları, G/Ç (I/O) hataları, dosyaların açılamaması, yalnızca ASCII karakterleri içermeyen dosyaların kullanılmaya çalışılması (bc(1) yalnızca ASCII karakterlerini kabul eder), bir dizinin dosya olarak açılmaya çalışılması ve geçersiz komut satırı seçeneklerinin verilmesi yer alır.

Çıkış durumu 4 özeldir; ölümcül bir hata oluştuğunda, bc(1) hesap makinesinin hangi modda olduğuna bakılmaksızın her zaman çıkar ve 4 döndürür.

Diğer durumlar yalnızca bc(1) etkileşimli modda olmadığında döndürülür (bkz. ETKİLEŞİMLİ MOD bölümü), çünkü etkileşimli modda bu hatalardan biri oluştuğunda bc(1) durumunu sıfırlar (bkz. SIFIRLAMA bölümü) ve daha fazla girdi kabul eder. Bu durum, -i bayrağı veya --interactive seçeneği ile etkileşimli mod zorlandığında da geçerliyse.

Bu çıkış durumları, bc(1) hesap makinesinin hata kontrolü ile kabuk betiklerinde kullanılabilmesini sağlar ve normal davranışı -i bayrağı veya --interactive seçeneği kullanılarak zorlanabilir.

Etkileşimli Mod

Standart gereği (bkz. STANDARTLAR bölümü), bc(1) bir etkileşimli moda ve bir etkileşimli olmayan moda sahiptir. Hem stdin hem de stdout bir terminale bağlı olduğunda etkileşimli mod otomatik olarak açılır, ancak -i bayrağı ve --interactive seçeneği bunu diğer durumlarda da açabilir.

Etkileşimli modda, bc(1) hatalardan kurtulmaya çalışır (bkz. SIFIRLAMA bölümü) ve normal yürütmede, geçerli girdi için yürütme biter bitmez stdout'u temizler (flush). bc(1), BC_SIGINT_RESET çevre değişkeninin içeriğine veya varsayılan değerine bağlı olarak (bkz. ÇEVRE DEĞİŞKENLERİ bölümü) çıkmak yerine SIGINT sinyaliyle sıfırlanabilir.

Tty Modu

stdin, stdout ve stderr'in tümü bir TTY'ye bağlıysa, "TTY modu" mevcut kabul edilir ve böylece bc(1), bazı ayarlara bağlı olarak TTY modunu açabilir.

Ortamda BC_TTY_MODE çevre değişkeni varsa (bkz. ÇEVRE DEĞİŞKENLERİ bölümü), o çevre değişkeni sıfır dışı bir tamsayı içeriyorsa, stdin, stdout ve stderr'in tümü bir TTY'ye bağlı olduğunda bc(1) TTY modunu açacaktır. BC_TTY_MODE çevre değişkeni mevcutsa ancak sıfır dışı bir tamsayı değilse, bc(1) TTY modunu açmayacaktır.

BC_TTY_MODE çevre değişkeni mevcut değilse varsayılan ayar kullanılır. Varsayılan ayar -h veya --help seçenekleriyle sorgulanabilir.

TTY modu etkileşimli moddan farklıdır çünkü etkileşimli mod bc(1) standardında zorunludur (bkz. STANDARTLAR bölümü) ve etkileşimli mod yalnızca stdin ve stdout'un bir terminale bağlı olmasını gerektirir.

Komut Satırı Geçmişi Komut satırı geçmişi yalnızca TTY modu etkinse etkindir, yani stdin, stdout ve stderr bir TTY'ye bağlıysa ve BC_TTY_MODE çevre değişkeni (bkz. ÇEVRE DEĞİŞKENLERİ bölümü) ile varsayılanı TTY modunu devre dışı bırakmıyorsa etkindir. Daha fazla bilgi için KOMUT SATIRI GEÇMİŞİ bölümüne bakın.

İstem TTY modu mevcutsa, bir istem etkinleştirilebilir. TTY modunun kendisi gibi, bu da bir çevre değişkeniyle açılıp kapatılabilir: BC_PROMPT (bkz. ÇEVRE DEĞİŞKENLERİ bölümü).

BC_PROMPT çevre değişkeni mevcutsa ve sıfır dışı bir tamsayı ise, stdin, stdout ve stderr bir TTY'ye bağlı olduğunda ve -P ile --no-prompt seçenekleri kullanılmadığında istem açılır. Okuma istemi de aynı koşullar altında açılacaktır, ancak -R ve --no-read-prompt seçenekleri de kullanılmamış olmalıdır.

Ancak, BC_PROMPT mevcut değilse istem, BC_TTY_MODE çevre değişkeni, -P ve --no-prompt seçenekleri ile -R ve --no-read-prompt seçenekleri ile etkinleştirilebilir veya devre dışı bırakılabilir. Daha fazla ayrıntı için ÇEVRE DEĞİŞKENLERİ ve SEÇENEKLER bölümlerine bakın.

Sinyal İşleme

Bir SIGINT sinyali gönderilmesi bc(1) hesap makinesinin iki şeyden birini yapmasına neden olur.

bc(1) etkileşimli modda değilse (bkz. ETKİLEŞİMLİ MOD bölümü) veya BC_SIGINT_RESET çevre değişkeni (bkz. ÇEVRE DEĞİŞKENLERİ bölümü) ya da varsayılanı bir tamsayı değilse veya sıfırsa bc(1) çıkış yapacaktır.

Ancak, bc(1) etkileşimli moddaysa ve BC_SIGINT_RESET ya da varsayılanı sıfır dışı bir tamsayı ise, bc(1) geçerli girdiyi yürütmeyi durduracak ve bir SIGINT aldığında sıfırlanacaktır (bkz. SIFIRLAMA bölümü).

"Geçerli girdi" ifadesinin iki anlama gelebileceğini unutmayın. bc(1) etkileşimli modda stdin'den gelen girdileri işliyorsa daha fazla girdi isteyecektir. bc(1) etkileşimli modda bir dosyadan gelen girdileri işliyorsa dosyayı işlemeyi durduracak ve varsa bir sonraki dosyayı işlemeye başlayacak, başka bir dosya yoksa stdin'den girdi isteyecektir.

Bu, bc(1) bir dosyayı yürütürken bir SIGINT gönderilirse, bc(1) hemen bir sonraki dosyayı yürütmeye başlayacağından sinyale yanıt vermemiş gibi görünebileceği anlamına gelir. Bu tasarım gereğidir; kullanıcıların bc(1) ile etkileşime girerken yürüttükleri çoğu dosya, ayrıştırılması hızlı olan fonksiyon tanımlarına sahiptir. Bir dosyanın yürütülmesi uzun sürüyorsa, o dosyada bir hata olabilir. Geri kalan dosyalar yine de sorunsuz bir şekilde yürütülebilir ve kullanıcının devam etmesine olanak tanır.

SIGTERM ve SIGQUIT, bc(1) hesap makinesinin temizlenip çıkmasına neden olur ve diğer tüm sinyaller için varsayılan işleyiciyi kullanır. Tek istisna SIGHUP'tır; bu durumda ve yalnızca bc(1) TTY modundayken (bkz. TTY MODU bölümü), bir SIGHUP bc(1) hesap makinesinin temizlenip çıkmasına neden olur.

Komut Satırı Geçmişi

bc(1) etkileşimli komut satırı düzenlemesini destekler.

bc(1) TTY modunda olabiliyorsa (bkz. TTY MODU bölümü), geçmiş etkinleştirilebilir. Bu, komut satırı geçmişinin yalnızca stdin, stdout ve stderr'in tümü bir TTY'ye bağlı olduğunda etkinleştirilebileceği anlamına gelir.

TTY modunun kendisi gibi, bu da BC_TTY_MODE çevre değişkeni (bkz. ÇEVRE DEĞİŞKENLERİ bölümü) ile açılıp kapatılabilir.

Geçmiş etkinleştirilmişse, önceki satırlar yön tuşlarıyla geri çağrılabilir ve düzenlenebilir.

Not: Sekme (tab) karakterleri 8 boşluğa dönüştürülür.

Yerel Ayarlar

Bu bc(1), farklı yerel ayarlar için hata mesajları ekleme desteğiyle birlikte gelir ve bu nedenle LC_MESSAGES değişkenini destekler.

Ayrıca Bakınız

dc(1)

Standartlar

bc(1), https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html adresindeki IEEE Std 1003.1-2017 (“POSIX.1-2017”) belirtimi ile uyumludur. -efghiqsvVw bayrakları, tüm uzun seçenekler ve yukarıda belirtilen uzantılar bu belirtimin uzantılarıdır.

Ek olarak, quit komutunun davranışı, bu belirtimin bilinen tüm uygulamalardan farklı olan bir yorumunu uygular. Daha fazla bilgi için SÖZDİZİMİ bölümünün Deyimler alt bölümüne bakın.

Belirtimin, LC_NUMERIC değerine bakılmaksızın bc(1) hesap makinesinin yalnızca taban noktası olarak nokta (.) kullanan sayıları kabul ettiğini açıkça belirttiğini unutmayın.

Bu bc(1) farklı yerel ayarlar için hata mesajlarını destekler ve bu nedenle LC_MESSAGES değişkenini destekler.

Hatalar

Sürüm 6.1.0'dan önce, bu bc(1) quit deyimi için yanlış bir davranışa sahipti.

Bilinen başka bir hata yoktur. Hataları https://git.gavinhoward.com/gavin/bc adresinden bildirin.

Yazarlar

Gavin D. Howard gavin@gavinhoward.com ve katkıda bulunanlar.

Gavin D. Howard Ağustos 2024 BC(1)