Provided by: manpages-pl_4.19.0-7_all bug

NAZWA

       bc - język kalkulatora dowolnej precyzji

SKŁADNIA

       bc [ -hlwsqv ] [długie-opcje] [  plik ... ]

OPIS

       bc  jest językiem obsługującym obliczenia na liczbach dowolnej dokładności z interaktywnym
       wykonywaniem instrukcji. Istnieją pewne podobieństwa składni do  języka  programowania  C.
       Przy  pomocy  opcji  wiersza poleceń dostępna jest standardowa biblioteka matematyczna. Na
       żądanie, biblioteka matematyczna jest definiowana przed rozpoczęciem przetwarzania plików.
       bc  rozpoczyna pracę przetwarzając kod z wszystkich plików wymienionych w wierszu poleceń,
       zachowując ich kolejność. Po przetworzeniu wszystkich plików, bc  czyta  ze  standardowego
       wejścia.  Całość  kodu  wykonywana  jest  w  miarę czytania. (Jeśli plik zawiera polecenie
       zatrzymania procesora, to bc nie będzie prowadził odczytu ze standardowego wejścia).

       Omawiana wersja bc zawiera kilka rozszerzeń w stosunku do  tradycyjnych  realizacji  bc  i
       standardu POSIX.  Opcje wiersza poleceń mogą powodować, że rozszerzenia te będą wyświetlać
       ostrzeżenia lub będą odrzucane. Niniejszy dokument opisuje  język  akceptowany  przez  ten
       procesor bc. Rozszerzenia są w nim wyraźnie wyróżnione.

   OPCJE
       -h, --help
              Wypisuje informację o sposobie wywołania i kończy działanie.

       -i, --interactive
              Wymusza tryb interaktywny.

       -l, --mathlib
              Definiuje standardową bibliotekę matematyczną.

       -w, --warn
              Ostrzega o rozszerzeniach w stosunku do POSIX bc.

       -s, --standard
              Przetwarza wyłącznie standardowy, POSIX-owy język bc.

       -q, --quiet
              Nie wyświetla zwykłego przywitania GNU bc.

       -v, --version
              Wypisuje numer wersji, informację o prawach autorskich i kończy działanie.

   LICZBY
       The  most  basic  element  in  bc is the number.  Numbers are arbitrary precision numbers.
       This precision is both in the integer part and  the  fractional  part.   All  numbers  are
       represented  internally  in decimal and all computation is done in decimal.  (This version
       truncates results from divide and multiply  operations.)   There  are  two  attributes  of
       numbers,  the length and the scale.  The length is the total number of decimal digits used
       by bc to represent a number and the scale is the total number of decimal digits after  the
       decimal point.  For example:
               .000001 ma długość 6 i dokładność 6.
               1935.000 ma długość 7 i dokładność 3.

   ZMIENNE
       Liczby przechowywane są w dwu rodzajach zmiennych, zmiennych prostych i tablicach. Zarówno
       zmienne proste, jak i tablice mają  nazwy.  Nazwy  zaczynają  się  od  litery,  po  której
       następuje  dowolna  liczba  liter,  cyfr i znaków podkreślenia. Wszystkie litery muszą być
       małe. (Nazwy w pełni alfanumeryczne są rozszerzeniem. W POSIX-owym bc wszystkie  nazwy  są
       pojedynczymi  małymi  literami). Rodzaj zmiennej wynika z kontekstu, gdyż po nazwie każdej
       zmiennej tablicowej wystąpią nawiasy ([]).

       Istnieją cztery zmienne specjalne: scale, ibase,  obase  oraz  last.  scale  określa,  jak
       niektóre  operacje  używają  cyfr  po kropce dziesiętnej. Domyślną wartością scale jest 0.
       ibase oraz obase określają podstawę pozycyjnego systemu liczbowego przy konwersji  wejścia
       i  wyjścia.  Domyślną  podstawą  zarówno  dla  wejścia,  jak  i  dla wyjścia jest 10. last
       (rozszerzenie standardu) jest zmienną, która  przechowuje  wartość  ostatnio  wydrukowanej
       liczby.  Zmienne  te będą omówione szczegółowo później, w odpowiedniej części. Wszystkie z
       nich mogą mieć przypisywane wartości, jak również mogą być używane w wyrażeniach.

   KOMENTARZE
       Komentarze w bc rozpoczynają się od znaków  /*,  a  kończą  znakami  */.  Komentarze  mogą
       zaczynać  się  w  dowolnym  miejscu  i  na  wejściu  pojawiają się jako pojedyncze spacje.
       (Powoduje to, że komentarze są  ogranicznikami  innych  elementów  wejścia.  Na  przykład,
       komentarz nie może znajdować się w środku nazwy zmiennej). Komentarze obejmują znaki nowej
       linii (końca linii) pomiędzy początkiem a końcem komentarza.

       Do zapewnienia obsługi skryptów dla bc, jako rozszerzenie dodano komentarz  w  pojedynczym
       wierszu.  Komentarz  jednowierszowy  rozpoczyna  się  znakiem  #  i  rozciąga się do końca
       wiersza. Znak końca linii nie jest tu częścią komentarza i jest przetwarzany jak zwykle.

   WYRAŻENIA
       Liczbami posługują się wyrażenia i instrukcje. Ponieważ język został  zaprojektowany  jako
       interaktywny,  instrukcje  i wyrażenia wykonywane są niezwłocznie. Nie ma żadnego programu
       "głównego" ("main"). Zamiast tego, kod jest wykonywany zaraz po jego napotkaniu. (Funkcje,
       omówione szczegółowo dalej, są zdefiniowane po ich napotkaniu).

       A  simple  expression  is  just  a  constant.  bc converts constants into internal decimal
       numbers using the current input base, specified  by  the  variable  ibase.  (There  is  an
       exception  in functions.)  The legal values of ibase are 2 through 36. (Bases greater than
       16 are an extension.)  Assigning a value outside this range to  ibase  will  result  in  a
       value  of 2 or 36.  Input numbers may contain the characters 0–9 and A–Z. (Note: They must
       be capitals.  Lower case letters are variable names.)  Single digit  numbers  always  have
       the  value  of the digit regardless of the value of ibase. (i.e. A = 10.)  For multi-digit
       numbers, bc changes all input digits greater or equal to ibase to the  value  of  ibase-1.
       This makes the number ZZZ always be the largest 3 digit number of the input base.

       Pełne  wyrażenia  są podobne do występujących w wielu językach wysokiego poziomu. Ponieważ
       występuje tylko jeden rodzaj liczb, nie  ma  reguł  określających  użycie  różnych  typów.
       Zamiast  tego  istnieją reguły dotyczące dokładności wyrażeń. Każde wyrażenie ma określoną
       dokładność. Zależy ona od dokładności pierwotnych liczb, wykonywanego działania i, w wielu
       przypadkach,  wartości zmiennej scale. Dopuszczalnymi wartościami zmiennej scale są liczby
       od 0 aż do maksymalnej liczby, jaka może być reprezentowana  jako  całkowita  (integer)  w
       języku C.

       W  podanych  poniżej opisach dopuszczalnych wyrażeń, "wyrażenie" określa pełne wyrażenie a
       "zmienna" określa zmienną prostą lub tablicową.  Zmienną prostą jest po prostu
              nazwa
       a zmienna tablicowa jest określona jako
              nazwa[wyrażenie]
       Dokładność wyniku jest maksymalną z dokładności użytych w nim  wyrażeń,  chyba  że  podano
       inaczej.

       - wyrażenie
              Wynikiem jest wartość przeciwna do wyrażenia.

       ++ zmienna
              Zmienna jest powiększana o jeden a wynikiem wyrażenia jest ta nowa wartość.

       -- zmienna
              Zmienna jest pomniejszana o jeden a wynikiem wyrażenia jest ta nowa wartość.

       zmienna ++
              Wynikiem  wyrażenia  jest  wartość zmiennej, a następnie zmienna jest powiększana o
              jeden.

       zmienna --
              Wynikiem wyrażenia jest wartość zmiennej, a następnie zmienna jest  pomniejszana  o
              jeden.

       wyrażenie + wyrażenie
              Wynikiem tego wyrażenia jest suma obu wyrażeń.

       wyrażenie - wyrażenie
              Wynikiem tego wyrażenia jest różnica obu wyrażeń.

       wyrażenie * wyrażenie
              Wynikiem tego wyrażenia jest iloczyn obu wyrażeń.

       wyrażenie / wyrażenie
              Wynikiem  tego wyrażenia jest iloraz obu wyrażeń. Liczba cyfr po kropce dziesiętnej
              wyniku jest równa wartości zmiennej scale.

       wyrażenie % wyrażenie
              Wynikiem tego wyrażenia jest "reszta" z dzielenia obliczana w następujący sposób. W
              celu  obliczenia  a%b,  obliczane  jest  najpierw  a/b z dokładnością do scale cyfr
              dziesiętnych. Wynik używany jest do obliczenia a-(a/b)*b z  dokładnością  określoną
              jako  maksymalna  z  scale+scale(b)  oraz scale(a).  Jeżeli scale ustawiona jest na
              zero,  zaś  oba  wyrażenia  są  całkowite  to  wyrażenie  to  jest  funkcją  reszty
              całkowitej.

       wyrażenie ^ wyrażenie
              Wynikiem  tego  wyrażenia  jest  wartość pierwszego z wyrażeń podniesiona do potęgi
              określonej przez drugie. Drugie wyrażenie musi być liczbą całkowitą.  (Jeśli drugie
              wyrażenie  nie  jest  całkowite,  to  emitowane  jest  ostrzeżenie a wyrażenie jest
              obcinane tak, by otrzymać wartość całkowitą). Liczba cyfr ułamkowych wyniku  wynosi
              scale,  jeśli  wykładnik jest ujemny. Jeżeli jest on dodatni, to dokładność (liczba
              cyfr po  kropce  dziesiętnej)  wyniku  stanowi  minimum  z  dokładności  pierwszego
              wyrażenia  przemnożonej  przez  wartość wykładnika i maksimum z scale i dokładności
              pierwszego  wyrażenia.  To  znaczy:  scale(a^b)  =  min(scale(a)*b,   max(   scale,
              scale(a)))  Należy pamiętać, że wyrażenie^0 zawsze zwraca wartość 1.

       ( wyrażenie )
              Nawiasy wymuszają zmianę standardowych priorytetów przy obliczaniu wyrażenia.

       zmienna = wyrażenie
              Zmiennej przypisywana jest wartość wyrażenia.

       zmienna <op>= wyrażenie
              jest  to  równoważne zapisowi "zmienna = zmienna <op> wyrażenie", z wyjątkiem tego,
              iż część "zmienna" jest wyliczana tylko raz. Może to być istotne,  jeśli  "zmienna"
              jest tablicą.

       Wyrażenia  relacyjne  są  specjalnym rodzajem wyrażeń, zwracającym zawsze wartość 0 lub 1:
       zero jeśli relacja jest fałszywa, zaś 1 jeżeli jest  prawdziwa.   Mogą  one  występować  w
       dowolnych  dozwolonych  wyrażeniach. (POSIX bc wymaga, by wyrażenia relacyjne były używane
       wyłącznie w instrukcjach if,  while  i  for  oraz  aby  było  w  nich  użyte  tylko  jedno
       sprawdzenie relacji). Operatorami relacji są:

       wyrażenie1 < wyrażenie2
              Wynikiem jest 1, jeśli wyrażenie1 jest mniejsze niż wyrażenie2.

       wyrażenie1 <= wyrażenie2
              Wynikiem jest 1, gdy wyrażenie jest mniejsze bądź równe wyrażenie2.

       wyrażenie1 > wyrażenie2
              Wynikiem jest 1, jeśli wyrażenie1 jest większe niż wyrażenie2.

       wyrażenie1 >= wyrażenie2
              Wynikiem jest 1, gdy wyrażenie1 jest większe bądź równe wyrażenie2.

       wyrażenie1 == wyrażenie2
              Wynikiem jest 1, gdy wyrażenie1 jest równe wyrażenie2.

       wyrażenie != wyrażenie2
              Wynikiem jest 1, gdy wyrażenie1 nie jest równe wyrażenie2.

       Dozwolone są także operacje logiczne. (POSIX bc NIE zawiera operacji logicznych). Wynikami
       wszystkich operacji logicznych są 0 lub 1 (dla fałszu  i  prawdy),  tak  jak  dla  wyrażeń
       relacyjnych. Operatorami logicznymi są:

       !wyrażenie
              Zaprzeczenie. Wynikiem jest 1, jeśli wyrażenie ma wartość 0.

       wyrażenie && wyrażenie
              Koniunkcja. Wynikiem jest 1, jeżeli oba wyrażenia są niezerowe.

       wyrażenie || wyrażenie
              Alternatywa. Wynikiem jest 1, jeśli dowolne z wyrażeń jest niezerowe.

       Wyrażenia mają następujący priorytet (od najniższego do najwyższego):
              operator ||, wiązanie lewe
              operator &&, wiązanie lewe
              operator !, niezwiązany
              operatory relacji, wiązanie lewe
              operator przypisania, wiązanie prawe
              operatory + i -, wiązanie lewe
              operatory *, / i %, wiązanie lewe
              operator ^, wiązanie prawe
              jednoargumentowy operator -, niezwiązany
              operatory ++ i --, niezwiązane

       Kolejność  wykonywania  została  dobrana  tak,  by  programy  zgodne  z  POSIX bc działały
       poprawnie.  Powoduje  to,  że  operatory  relacyjne  i  logiczne,  użyte   w   wyrażeniach
       przypisania, będą wykazywać niecodzienne zachowywanie. Weźmy następujące wyrażenie:
              a = 3 < 5

       Większość  programistów  C  uważałaby, że przypisze ono wynik operacji "3 < 5" (wartość 1)
       zmiennej "a". Tymczasem w bc nadaje ono wartość 3 zmiennej "a", a następnie porównuje 3  z
       5. Używając operatorów relacji i operatorów logicznych z operatorami przypisania najlepiej
       jest posłużyć się nawiasami.

       bc obsługuje jeszcze kilka  innych  wyrażeń  specjalnych.  Związane  są  one  z  funkcjami
       definiowanymi  przez  użytkownika  i  funkcjami  standardowymi.  Wszystkie one mają postać
       "nazwa(parametry)". Funkcje  definiowane  przez  użytkownika  opisano  w  sekcji  Funkcje.
       Funkcjami standardowymi są:

       length ( wyrażenie )
              Wynikiem funkcji length jest liczba cyfr znaczących w wyrażeniu.

       read ( )
              Funkcja  ta,  będąca  rozszerzeniem,  odczytuje  liczbę  ze  standardowego wejścia,
              niezależnie od miejsca użycia funkcji. Strzeż się --  może  to  spowodować  kłopoty
              przy  przeplataniu  się  danych  i  programu  ze standardowego wejścia.  Najlepszym
              zastosowaniem tej funkcji jest użycie jej w uprzednio  napisanym  programie,  który
              wymaga wprowadzania danych przez użytkownika, ale nigdy nie pozwala na wprowadzanie
              kodu  programu.  Wynikiem  działania  funkcji  read  jest   liczba   odczytana   ze
              standardowego  wejścia  z  konwersją  układu  liczbowego  według aktualnej wartości
              zmiennej ibase.

       scale ( wyrażenie )
              Wynikiem funkcji scale jest liczba cyfr po kropce dziesiętnej w  wyrażeniu  będącym
              jej parametrem.

       sqrt ( wyrażenie )
              Wynikiem  funkcji sqrt jest pierwiastek kwadratowy z wyrażenia. Jeżeli wyrażenie ma
              wartość ujemną, to generowany jest błąd wykonania.

   INSTRUKCJE
       Instrukcje (jak w większości języków algorytmicznych) umożliwiają  sterowanie  kolejnością
       wykonywania  wyrażeń.  W bc instrukcje wykonywane są bezzwłocznie, "tak szybko jak to jest
       możliwe". Wykonanie odbywa się gdy napotkano znak nowej linii i istnieje jedna lub  więcej
       pełna  instrukcja.   W  związku  z  takim natychmiastowym wykonaniem, znaki nowej linii są
       bardzo istotne w bc. W rzeczywistości, jako organiczniki  instrukcji  używane  są  zarówno
       znaki  nowej  linii,  jak i średniki. Nieprawidłowo umieszczony znak nowej linii spowoduje
       błąd składni. Ponieważ znaki nowej linii rozdzielają instrukcje, możliwe jest ich  ukrycie
       (przed interpretacją) przy pomocy znaku odwrotnego ukośnika. Sekwencja "\<nl>", gdzie <nl>
       jest znakiem nowej linii postrzegana jest przez bc jako znak zwykłej spacji zamiast  znaku
       nowej linii. Poniżej umieszczono listę instrukcji bc i ich znaczenia (elementy umieszczone
       w nawiasach kwadratowych ([]) są opcjonalnymi częściami instrukcji):

       wyrażenie
              Instrukcja ta wykonuje dwie rzeczy. Jeżeli wyrażenie rozpoczyna się  od  "<zmienna>
              <przypisanie>  ...", to jest traktowane jak instrukcja przypisania. Jeśli wyrażenie
              nie jest instrukcją  przypisania,  to  wyrażenie  jest  wyliczane  i  drukowane  na
              standardowym  wyjściu.  Po  wydrukowaniu liczby drukowany jest znak nowej linii. Na
              przykład, "a=1" jest instrukcją przypisania, a "(a=1)" jest wyrażeniem zawierającym
              przypisanie.   Wszystkie  liczby  drukowane  są  przy  użyciu  systemu  pozycyjnego
              określonego zmienną obase. Dopuszczalnymi wartościami obase są  2  do  BC_BASE_MAX.
              (Patrz sekcja OGRANICZENIA). Dla podstaw systemu od 2 do 16 używana jest zwyczajowa
              metoda zapisu liczb. Dla podstaw większych od  16  bc  posługuje  się  metodą  cyfr
              wieloznakowych  wyświetlania  liczb,  gdzie każda z kolejnych cyfr wyświetlana jest
              jako liczba dziesiętna. Cyfry wieloznakowe oddzielane są odstępami.  Każda  z  cyfr
              zawiera  tyle  znaków, ile jest niezbędnych do przedstawienia dziesiętnego wartości
              "obase-1". Ponieważ liczby mają dowolną dokładność, niektóre z liczb mogą  nie  dać
              wydrukować się w pojedynczym wierszu. Takie długie liczby zostaną podzielone między
              wiersze przy zastosowaniu "\" jako  ostatniego  znaku  wiersza.  Maksymalną  liczbą
              znaków  drukowanych  w  wierszu  jest  70.  Z  powodu  interaktywnego charakteru bc
              drukowanie liczby ma efekt uboczny w postaci przypisania wydrukowanej  wartości  do
              specjalnej  zmiennej o nazwie last. Umożliwia to użytkownikowi odtworzenie ostatnio
              wydrukowanej  wartości  bez  potrzeby  ponownego  wpisywania  wyrażenia,  które  ją
              wydrukowało.  Nadawanie  wartości  zmiennej  last  jest  dozwolone;  spowoduje  ono
              zastąpienie ostatnio wydrukowanej wartości wartością  przypisaną.  Nowo  przypisana
              wartość  pozostanie  aż  do  wydrukowania  kolejnej  liczby  lub nadania last innej
              wartości. (Niektóre z implementacji mogą dopuszczać użycie pojedynczej kropki  (.),
              niebędącej częścią liczby, jako skróconej notacji dla last).

       łańcuch
              Na  wyjściu  drukowany  jest  łańcuch  znakowy.  Łańcuchy  rozpoczynają się znakiem
              cudzysłowu i zawierają wszystkie znaki do następnego znaku  cudzysłowu.   Wszystkie
              znaki,  włącznie  ze znakami nowej linii, traktowane są dosłownie.  Po wydrukowaniu
              łańcucha nie jest drukowany znak nowej linii.

       print lista
              Instrukcja print (rozszerzenie) umożliwia użycie innego  sposobu  wydruku  wyników.
              "Lista" jest listą łańcuchów i wyrażeń oddzielonych przecinkami.  Każdy łańcuch czy
              wyrażenie drukowany jest w kolejności występowania na liście.  Nie  jest  drukowany
              kończący znak nowej linii (przejście do następnego wiersza). Wyliczana jest wartość
              wyrażeń; jest  ona  drukowana  i  przypisywana  zmiennej  last.  Łańcuchy  użyte  w
              instrukcji  print  są  drukowane  na wyjściu i mogą zawierać znaki specjalne. Znaki
              specjalne  rozpoczynają  się  znakiem  odwrotnego  ukośnika  (\).   bc   rozpoznaje
              następujące  znaki specjalne: "a" (dzwonek, bell), "b" (backspace), "f" (wysunięcie
              strony, form feed), "n"  (nowa  linia,  newline),  "r"  (powrót  karetki,  carriage
              return),  "q"  (cudzysłów,  double  quote), "t" (tabulacja, tab) oraz "\" (odwrotny
              ukośnik, backslash). Inne znaki występujące po odwrotnym ukośniku będą ignorowane.

       { lista_instrukcji }
              Jest to instrukcja grupowania. Pozwala na grupowanie wielu instrukcji do wykonania.

       if ( wyrażenie ) instrukcja1 [else instrukcja2]
              Instrukcja  if  oblicza  wyrażenie  i  wykonuje  instrukcję1  bądź  instrukcję2   w
              zależności  od wartości wyrażenia. Jeżeli wyrażenie jest niezerowe, wykonywana jest
              instrukcja1.  Jeśli  występuje  instrukcja2  a  wartością  wyrażenia  jest  0,   to
              wykonywana jest instrukcja2. (Klauzula else instrukcji if jest rozszerzeniem).

       while ( wyrażenie ) instrukcja
              Instrukcja   while  powtarza  wykonywanie  danej  instrukcji  póki  wyrażenie  jest
              niezerowe. Oblicza  ona  wartość  wyrażenia  przed  każdym  wykonaniem  instrukcji.
              Przerwanie   pętli  powodowane  jest  zerową  wartością  wyrażenia  lub  wykonaniem
              instrukcji break (przerwania).

       for ( [wyr1] ; [wyr2] ; [wyr3] ) instrukcja
              Instrukcja for  kontroluje  powtarzane  wykonanie  danej  instrukcji.  Przed  pętlą
              obliczane  jest  wyrażenie1.  Wyrażenie2  jest  obliczane  przed  każdym wykonaniem
              instrukcji. Jeśli jest niezerowe, to wykonywana  jest  instrukcja.   Jeśli  ma  ono
              wartość  zero,  to  pętla  jest  przerywana.  Po  każdym wykonaniu danej instrukcji
              wyliczana jest wartość wyrażenia3 przed  ponownym  wyliczeniem  wyrażenia2.  Jeżeli
              pominięto  wyrażenie1  lub  wyrażenie3,  to  nic  nie  jest obliczane w chwili, gdy
              powinna być określana  ich  wartość.  Jeżeli  pominięto  wyrażenie2,  to  jest  ono
              zastępowane  wartością 1. (Wyrażenie opcjonalne stanowią rozszerzenie. bc w POSIXie
              wymaga wszystkich trzech wyrażeń). Poniższy kod jest równoważny instrukcji for:
              wyrażenie1;
              while (wyrażenie2) {
                 instrukcja;
                 wyrażenie3;
              }

       break  Instrukcja ta powoduje wymuszone zakończenie ostatniej  obejmującej  ją  instrukcji
              while lub for.

       continue
              Instrukcja  continue  (rozszerzenie)  powoduje  rozpoczęcie kolejnej iteracji przez
              ostatnią obejmującą ją instrukcję for.

       halt   Instrukcja  halt  (rozszerzenie)  jest  instrukcją  nakazującą  preprocesorowi   bc
              zakończenie  pracy  (ale  tylko  wtedy  gdy  instrukcja  ta  jest  wykonywana).  Na
              przykład, "if (0 == 1) halt" nie spowoduje przerwania  pracy  bc,  gdyż  instrukcja
              halt nie będzie wykonana.

       return Zwraca wartość zero jako wynik funkcji. (Patrz sekcja dotycząca funkcji).

       return ( wyrażenie )
              Zwraca  wartość  wyrażenia  jako  wynik  funkcji. (Patrz sekcja dotycząca funkcji).
              Nawiasy nie są wymagane, co jest rozszerzeniem GNU bc.

   PSEUDOINSTRUKCJE
       Te instrukcje  nie  są  instrukcjami  w  tradycyjnym  sensie  tego  terminu.  Nie  są  one
       instrukcjami wykonywanymi. Ich funkcja jest wykonywana podczas "kompilacji".

       limits Wypisuje   lokalne  ograniczenia  narzucone  przez  lokalna  wersję  bc.   Jest  to
              rozszerzenie.

       quit   Po odczycie instrukcji quit procesor bc kończy pracę, niezależnie  od  tego,  gdzie
              wystąpiła  ta  instrukcja.  Na  przykład,  "if (0 == 1) quit" spowoduje zakończenie
              pracy bc.

       warranty
              Wypisuje dłuższą notkę na temat gwarancji. Jest to rozszerzenie.

   FUNKCJE
       Funkcje dostarczają sposobu  definiowania  obliczeń,  które  mogą  być  wykonane  później.
       Funkcje  w  bc  zawsze  obliczają  wartość  i  zwracają ją do miejsca wywołania. Definicje
       funkcji są "dynamiczne" w tym sensie,  że  funkcja  pozostaje  niezdefiniowana  dopóki  na
       wejściu  nie  zostanie odczytana jej definicja. Definicja ta jest następnie używana dopóki
       nie zostanie napotkana inna definicja funkcji o tej samej nazwie. Wówczas  nowa  definicja
       zastępuje starszą. Funkcja definiowana jest następująco:
              define nazwa ( parametry ) { nowa_linia     lista_auto   lista_instrukcji }
       Wywołanie funkcji jest po prostu wyrażeniem postaci "nazwa(parametry)".

       Parametry  są  liczbami  lub  tablicami  (rozszerzenie). W definicji funkcji definiuje się
       równocześnie  zero  lub  więcej  jej  parametrów  przez  podanie  ich  nazw  rozdzielonych
       przecinkami.  Liczby  są jedynymi parametrami wywoływanymi przez wartość. Tablice podawane
       są w definicji parametrów przy pomocy notacji "nazwa[]".  W  wywołaniu  funkcji  parametry
       rzeczywiste  dla  parametrów  numerycznych są pełnymi wyrażeniami. Do przekazywania tablic
       używana jest ta sama notacja, co  przy  definiowaniu  parametrów  typu  tablicowego.  Dana
       tablica  przesyłana  jest  do  funkcji  przez  wartość.   Ponieważ  definicje  funkcji  są
       dynamiczne, w trakcie wywoływania funkcji sprawdzana jest liczba i  typy  jej  parametrów.
       Niezgodność liczby parametrów lub ich typów powoduje błąd wykonania. Błąd wykonania pojawi
       się także przy próbie wywołania niezdefiniowanej funkcji.

       lista_auto jest opcjonalną listą zmiennych, do użytku "lokalnego".   A  oto  składnia  tej
       listy  (jeśli występuje): "auto nazwa, ... ;".  Średnik jest opcjonalny. Każda z nazw jest
       nazwą auto-zmiennej.  Tablice mogą być podane przy  użyciu  takiej  samej  składni  jak  w
       parametrach.   Na  początku  funkcji  wartości  tych  zmiennych  odkładane  są  na stosie.
       Następnie zmienne są inicjowane zerami  i  używane  w  czasie  wykonywania  funkcji.  Przy
       zakończeniu  funkcji zmienne są zdejmowane ze stosu, tak że przywracana jest ich pierwotna
       wartość  (z  momentu  wywołania  funkcji).  Parametry  te  są  faktycznie  zmiennymi  auto
       inicjowanymi  wartościami  dostarczonymi w wywołaniu funkcji. Zmienne typu auto różnią się
       od tradycyjnych zmiennych lokalnych, gdyż jeśli funkcja  A  woła  funkcję  B,  to  B  może
       posługiwać  się  zmiennymi  auto  funkcji  A po prostu używając tych samych nazw, chyba że
       funkcja B traktuje je jako zmienne auto. Ponieważ zmienne auto i parametry  składowane  są
       na stosie, to bc obsługuje funkcje rekurencyjne.

       Ciało  funkcji  jest  listą  instrukcji  bc.  I znów, jak w części zasadniczej, instrukcje
       oddzielane są średnikami lub znakami nowej linii.  Instrukcje  return  (powrót)   powodują
       zakończenie  funkcji  i  zwrócenie  wartości.  Istnieją  dwa  warianty  instrukcji return.
       Pierwsza postać, "return", zwraca wartość  0  do  wywołującego  wyrażenia.  Druga  postać,
       "return  (  wyrażenie  )",  oblicza wartość wyrażenia i zwraca ją do wyrażenia wołającego.
       Każda funkcja domyślnie kończy się niejawną instrukcją "return (0)". Pozwala to na funkcji
       na zakończenie działania i zwrócenie zera bez jawnej instrukcji powrotu.

       Funkcje inaczej korzystają ze zmiennej ibase. Wszystkie stałe w obrębie ciała funkcji będą
       konwertowane przy zastosowaniu wartości ibase w momencie wywołania funkcji. Zmiany ibase w
       czasie  wykonywania  funkcji  są  ignorowane, z wyjątkiem funkcji standardowej read, która
       zawsze do konwersji liczb wykorzystuje bieżącą wartość ibase.

       GNU bc zawiera kilka rozszerzeń związanych z funkcjami. Pierwszym  jest  nieco  luźniejszy
       format definicji funkcji. Standard wymaga, by nawias otwierający znajdował się w tym samym
       wierszu, co słowo kluczowe define, a wszystkie pozostałe  części  w  kolejnych  wierszach.
       Opisywana  tu  wersja  bc zezwala na dowolną liczbę znaków nowej linii przed i po nawiasie
       otwierającym funkcji. Na przykład, dozwolone są poniższe definicje.
               define d (n) { return (2*n); } define d (n)   { return (2*n); }

       Funkcje mogą być zdefiniowane jako void. Funkcja void nie zwraca wartości, więc  nie  może
       być  używana w miejscach, które wymagają wartości. Po wywołaniu funkcja void nie produkuje
       żadnego wyjścia. Słowo kluczowe void występuje pomiędzy słowem kluczowym  define  a  nazwą
       funkcji. Na przykład prosimy rozważyć poniższy skrypt:
               define py (y) { print "--->", y, "<---", "\n"; } define void px (x) { print "--->", x, "<---", "\n"; } py(1) --->1<--- 0 px(1) --->1<---

       Ponieważ  py  nie  jest  funkcją  void,  to  wywołanie py(1) wyświetla pożądane wyjście, a
       następnie wypisuje w drugiej linii wartość tej funkcji. Ponieważ wartością funkcji,  która
       nie  zawiera  instrukcji return, jest zero, to właśnie zero zostanie wypisane. W przypadku
       funkcji px(1) zero nie jest wypisywane, ponieważ ta funkcja jest funkcją void.

       Także dodano wywoływanie tablic przez zmienną. Aby zadeklarować  wywołanie  przez  zmienną
       tablicową,  należy  zadeklarować  parametr  tablicowy w definicji funkcji jako "*nazwa[]".
       Wywołanie funkcji jest takie samo, jak w przypadku wywołania przez wartość.

   BIBLIOTEKA MATEMATYCZNA
       Jeżeli bc wywoływane jest z opcją -l, to wstępnie wczytywana jest biblioteka  matematyczna
       (math  library), a domyślna liczba cyfr dziesiętnych (scale) ustawiana jest na 20. Funkcje
       matematyczne obliczają swe wyniki z  dokładnością  określoną  w  momencie  ich  wywołania.
       Bibilioteka matematyczna definiuje następujące funkcje:

       s (x)  Sinus x, x podawany jest w radianach.

       c (x)  Cosinus x, x w radianach.

       a (x)  Arcus tangens x; arcus tangens zwraca radiany.

       l (x)  Logarytm naturalny z x.

       e (x)  Funkcja wykładnicza - e do potęgi x.

       j (n,x)
              Funkcja Bessela rzędu n (całkowitego) z argumentem x.

   PRZYKŁADY
       W  powłoce  /bin/sh, poniższe polecenie przypisuje wartość liczby "Pi" zmiennej środowiska
       pi.
               pi=$(echo "scale=10; 4*a(1)" | bc -l)

       Poniżej podano definicję funkcji wykładniczej używanej w bibliotece matematycznej. Funkcja
       ta napisana jest w bc standardu POSIX.
               scale = 20

              /* wykorzystuje fakt, że e^x = (e^(x/2))^2    Gdy  x jest dostatecznie małe, używamy szeregu:      e^x = 1 + x + x^2/2! + x^3/3! + ... */

              define e(x) {   auto  a, d, e, f, i, m, v, z

                /* Sprawdzenie znaku x. */   if (x<0) {     m = 1     x = -x   }

                /* przewidywane x */   z = scale;   scale = 4 + z + .44*x;   while (x > 1) {     f += 1;     x /= 2;   }

                /* inicjowanie zmiennych */   v = 1+x   a = x   d = 1

                for (i=2; 1; i++) {     e = (a *= x) / (d *= i)     if (e == 0) {       if (f>0) while (f--)  v = v*v;       scale = z       if (m) return (1/v);       return (v/1);     }     v += e   } }

       Poniższy  kod  posługuje  się  rozszerzonymi  cechami  bc  do  uzyskania prostego programu
       liczącego salda książeczki czekowej. Najlepiej byłoby zachować go w pliku, tak by mógł być
       wykorzystany wielokrotnie bez potrzeby każdorazowego przepisywania.
               scale=2 print "\nProgram książeczki czekowej!\n" print "  Pamiętaj, wpłaty są transakcjami ujemnymi.\n" print "  Koniec - transakcja zerowa.\n\n"

              print "Saldo początkowe? "; bal = read() bal /= 1 print "\n" while (1) {   "bieżące saldo = "; bal   "transakcja? "; trans = read()   if (trans == 0) break;   bal -= trans   bal /= 1 } quit

       Poniżej zamieszczono definicję rekurencyjnej funkcji silni.
               define f (x) {   if (x <= 1) return (1);   return (f(x-1) * x); }

   OPCJE READLINE I LIBEDIT
       GNU  bc  może  zostać  skompilowany  (przez  opcję  konfiguracji)  tak,  by posługiwał się
       biblioteką GNU edytora wejścia o nazwie readline lub też biblioteką BSD libedit. Umożliwia
       to  użytkownikowi  edycję  wierszy przed wysłaniem ich do bc. Pozwala też na wykorzystanie
       historii poprzednio wprowadzonych wierszy. Przy wybraniu tej opcji  bc  zawiera  dodatkową
       zmienną specjalną. Ta specjalna zmienna, history, przechowuje liczbę zachowywanych wierszy
       historii. Dla readline, wartość -1 oznacza, że przechowywana  jest  nieograniczona  liczba
       wierszy  historii.  Ustawienie  wartości  history  na  liczbę  dodatnią  ogranicza  liczbę
       przechowywanych wierszy historii do podanej liczby. Wartość zero wyłącza funkcję  historii
       wprowadzonych  wierszy.  Wartością  domyślną  jest  100. Więcej informacji można znaleźć w
       podręcznikach użytkownika dla bibliotek GNU readline i history oraz BSD libedit. Nie można
       równocześnie włączyć zarówno readline, jak i libedit.

   RÓŻNICE
       Niniejsza  wersja  bc  została zbudowana, bazując na projekcie POSIX P1003.2/D11 i zawiera
       kilka różnic i rozszerzeń w stosunku do tego dokumentu i tradycyjnych realizacji. Nie jest
       wykonana  w tradycyjny sposób, wykorzystujący polecenie dc(1).  Wersja ta jest pojedynczym
       procesem,  analizującym  i  uruchamiającym  kod  binarny  będący  tłumaczeniem   programu.
       Istnieje  "nieudokumentowana"  opcja  (-c) powodująca, że program wyświetla kod binarny na
       standardowym wyjściu zamiast wykonywania go. Używana  była  ona  głównie  do  debuggowania
       analizatora składni i przy przygotowaniu biblioteki matematycznej.

       Głównym  źródłem  różnic  są  rozszerzenia, w których jakaś cecha, możliwość programu jest
       rozbudowana w celu dodania funkcjonalności, oraz dodatki, gdzie  dodano  nowe  możliwości.
       Poniżej podano listę różnic i rozszerzeń.

       Zmienna środowiska LANG
              Niniejsza wersja nie spełnia standardu POSIX przetwarzania zmiennej środowiska LANG
              i wszystkich zmiennych środowiska rozpoczynających się na LC_.

       nazwy  Tradycyjny i POSIXowy bc zawierają jednoliterowe nazwy funkcji, zmiennych i tablic.
              Zostały  one  rozszerzone  do  nazw  wieloznakowych,  rozpoczynających się literą i
              mogących zawierać litery, cyfry i znaki podkreślenia.

       Łańcuchy znakowe
              Łańcuchy nie mogą zawierać znaków NUL. POSIX stwierdza, że  wszystkie  znaki  muszą
              być zawarte w łańcuchach.

       last   POSIX  bc nie zawiera zmiennej last. Niektóre implementacje bc używają kropki (.) w
              podobny sposób.

       porównania
              POSIX bc dopuszcza porównania wyłącznie w instrukcjach  if,  while  oraz  w  drugim
              wyrażeniu  instrukcji  for. Dodatkowo, w każdej z tych instrukcji dopuszczalna jest
              tylko jedna operacja porównania (relacji).

       instrukcja if, klauzula else
              POSIX bc nie zawiera klauzuli else.

       instrukcja for
              POSIX bc wymaga, by w instrukcji for występowały wszystkie wyrażenia.

       &&, ||, !
              POSIX bc nie zawiera operatorów logicznych.

       funkcja read
              POSIX bc nie zawiera funkcji read.

       instrukcja print
              POSIX bc nie zawiera instrukcji print.

       instrukcja continue
              POSIX bc nie zawiera instrukcji continue.

       instrukcja return
              POSIX bc wymaga nawiasów wokół zwracanego wyrażenia.

       parametry tablicowe
              POSIX bc nie obsługuje (obecnie) w pełni parametrów tablicowych.   Gramatyka  POSIX
              zezwala na użycie tablic w definicjach funkcji, ale nie zapewnia metody przekazania
              tablicy  jako  bieżącego  parametru.  (Jest  to  najprawdopodobniej  przeoczenie  w
              zdefiniowanej  gramatyce.)  Tradycyjne  implementacje  bc  mają  jedynie  wywołanie
              parametrów tablicowych przez wartość.

       format funkcji
              POSIX bc wymaga, by nawias otwierający był w tym samym wierszu, co  słowo  kluczowe
              define, instrukcja auto natomiast w następnym wierszu.

       =+, =-, =*, =/, =%, =^
              POSIX  bc  nie wymaga, by były zdefiniowane powyższe operatory przypisania "starego
              typu". Niniejsza wersja zezwala na  takie  przypisania  w  "starym  stylu".  Należy
              skorzystać  z  instrukcji  limits,  by  stwierdzić,  czy  zainstalowana  wersja  je
              rozpoznaje. Jeżeli obsługuje ona przypisania w "starym stylu", to instrukcja "a  =-
              1" pomniejszy a o jeden zamiast przypisać a wartość -1.

       spacje w liczbach
              Inne  implementacje  bc  dopuszczają  występowanie spacji w liczbach.  Na przykład,
              "x=1 3" przypisze wartość 13 zmiennej x. Ta sama instrukcja spowoduje błąd  składni
              w opisywanej tu wersji bc.

       błędy i wykonanie
              Opisywana  implementacja różni się od innych sposobem, w jaki wykonywany jest kod w
              przypadku znalezienia w  programie  błędów  składniowych  i  innych.   W  przypadku
              napotkania  błędu  w  definicji  funkcji,  obsługa błędów próbuje odnaleźć początek
              instrukcji i kontynuować  analizę  składniową  funkcji.   Po  znalezieniu  błędu  w
              funkcji,  nie  jest  ona  możliwa  do  wywołania i staje się niezdefiniowana. Błędy
              składniowe w interaktywnym wykonywaniu kodu unieważniają  bieżący  blok  wykonania.
              Blok  wykonania  jest  zakończony końcem linii pojawiającym się po pełnej sekwencji
              instrukcji. Na przykład,
              a = 1
              b = 2
       ma dwa bloki wykonania a
              { a = 1
                b = 2 }
       ma jeden blok wykonania. Każdy z błędów wykonania  przerywa  wykonywanie  bieżącego  bloku
       wykonania. Ostrzeżenie w trakcie wykonywania nie przerywa bieżącego bloku.

       Przerwania
              Podczas sesji interaktywnej sygnał SIGINT (zwykle generowany przez znak control-C z
              terminala) spowoduje przerwanie bieżącego bloku  wykonywania.   Wyświetli  on  błąd
              wykonania ("runtime"), wskazujący która funkcja została przerwana. Po wyczyszczeniu
              wszystkich struktur (runtime structures) wykonania, zostanie wyświetlony  komunikat
              informujący  użytkownika,  że  bc  jest  gotów  do  przyjmowania  kolejnych danych.
              Wszystkie uprzednio  zdefiniowane  funkcje  pozostają  zdefiniowane,  zaś  wartości
              wszystkich zmiennych innych niż zmienne typu auto są wartościami sprzed przerwania.
              Podczas procesu oczyszczania struktur danych usuwane są wszystkie zmienne typu auto
              oraz  parametry  funkcji.   W  czasie sesji nieinteraktywnej sygnał SIGINT przerywa
              wykonanie całego bc.

   OGRANICZENIA
       Poniżej podano obecne ograniczenia opisywanego procesora bc.  Niektóre  z  nich  mogą  być
       zmienione  podczas instalacji. Faktyczne ograniczenia można sprawdzić za pomocą instrukcji
       limits (ograniczenia).

       BC_BASE_MAX
              Maksymalna podstawa pozycyjnego układu, w którym  wyprowadzane  są  wyniki  obecnie
              ustawiona jest na 999. Maksymalną podstawą układu wejściowego jest 16.

       BC_DIM_MAX
              Obecnie    ustawione    jest   arbitralne   ograniczenie   do   65535   (w   wersji
              rozpowszechnianej). Twoja instalacja może być inna.

       BC_SCALE_MAX
              Liczba cyfr po kropce dziesiętnej ograniczona jest do INT_MAX  cyfr.  Także  liczba
              cyfr przed kropką dziesiętną ograniczona jest do INT_MAX cyfr.

       BC_STRING_MAX
              Maksymalnie w łańcuchu może wystąpić INT_MAX znaków.

       wykładnik
              Wartość wykładnika w operacji potęgowania (^) ograniczona jest do LONG_MAX.

       nazwy zmiennych
              Obecnie  nie  może  być  więcej  niż  32767  unikatowych  nazw w każdym z rodzajów:
              zmiennych prostych, tablic i funkcji.

ZMIENNE ŚRODOWISKOWE

       bc przetwarza następujące zmienne środowiska:

       POSIXLY_CORRECT
              To samo, co opcja -s. Tryb zgodności z POSIX.

       BC_ENV_ARGS
              Inny sposób przekazywania argumentów do bc. Format jest taki  sam,  jak  argumentów
              wiersza  poleceń.  Argumenty  te  przetwarzane  są na początku, więc pliki podane w
              argumentach środowiska  przetwarzane  są  przed  plikami  podanymi  jako  argumenty
              wiersza  poleceń.  Umożliwia  to  użytkownikowi  ustawienie "standardowych" opcji i
              plików, jakie będą przetwarzane przy każdym wywołaniu bc. Pliki podane w  zmiennych
              środowiska   zawierają   zwykle  definicje  funkcji,  które  użytkownik  chce  mieć
              zdefiniowane przy każdym uruchomieniu bc.

       BC_LINE_LENGTH
              Powinna to  być  liczba  całkowita  (integer)  podająca  liczbę  znaków  w  wierszu
              wynikowym.  Obejmuje ona znaki odwrotnego ukośnika i nowej linii dla długich liczb.
              Jako rozszerzenie GNU wartość zero wyłącza wieloliniowe wyjście.  Jakakolwiek  inna
              wartość mniejsza od 3 ustawia długość linii na 70.

DIAGNOSTYKA

       Jeżeli  któryś  z  plików podanych w wierszu poleceń nie może zostać otwarty bc zgłosi, że
       plik ten  jest  niedostępny  i  przerwie  pracę.  Istnieją  też  komunikaty  diagnostyczne
       kompilacji i wykonania, które powinny być zrozumiałe.

BŁĘDY

       Obsługa błędów (error recovery) nie jest jeszcze bardzo dobra.

       Błędy  proszę  zgłaszać (w jęz.angielskim) na adres bug-bc@gnu.org. Proszę się upewnić, że
       pole tematu wiadomości zawiera gdzieś słowo "bc".

AUTOR

       Philip A. Nelson
       philnelson@acm.org

PODZIĘKOWANIA

       Autor chciałby podziękować Steve'owi Sommars (Steve.Sommars@att.com) za jego szeroką pomoc
       w   testowaniu  tej  implementacji.  Podsunął  on  wiele  cennych  sugestii.  Dzięki  jego
       zaangażowaniu jest to o wiele lepszy produkt.

TŁUMACZENIE

       Autorami  polskiego  tłumaczenia  niniejszej  strony  podręcznika   są:   Wojtek   Kotwica
       <wkotwica@post.pl> i Robert Luberda <robert@debian.org>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją. Bliższe informacje o warunkach licencji
       można   uzyskać   zapoznając   się   z   GNU   General   Public   License   w   wersji   3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   lub   nowszej.   Nie  przyjmuje  się  ŻADNEJ
       ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej
       ⟨manpages-pl-list@lists.sourceforge.net⟩.