Provided by: manpages-pl_0.5-1_all bug

NAZWA

       bc - język kalkulatora dowolnej precyzji

SKŁADNIA

       bc [-hlwsqv] [długie_opcje] [plik...]

WERSJA

       Niniejszy podręcznik opisuje GNU bc w wersji 1.06.

OPIS

        Uwaga! To tłumaczenie może być nieaktualne!

       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
       Najbardziej podstawowym elementem w bc jest liczba. Liczby są liczbami dowolnej  dokładności.  Dokładność
       ta  odnosi  się  zarówno  do  części  całkowitej  jak  i do ułamkowej. Wszystkie liczby są reprezentowane
       wewnętrznie  w  postaci  dziesiętnej  i  wszystkie  obliczenia  prowadzone  są  w  układzie  dziesiętnym.
       (Opisywana wersja obcina wyniki operacji dzielenia i mnożenia.)  Liczby posiadają dwa atrybuty: długość i
       dokładność.   [od  tłum.:  (org.scale)  -  w  tłumaczeniu  używane  będzie słowo `dokładność' w znaczeniu
       zbliżonym do znanego np. z obsługi kalkulatorów] Długość jest całkowitą liczbą  cyfr  znaczących  liczby,
       zaś dokładność jest całkowitą liczbą cyfr dziesiętnych po kropce dziesiętnej.  Na przykład:
               .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 posiadają 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 POSIXowym 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 /* zaś 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.)

       Proste  wyrażenie  jest  po  prostu  stałą. bc zamienia stałe na wewnętrzne liczby dziesiętne przy użyciu
       bieżącej podstawy systemu dla wprowadzania, podanej w zmiennej ibase.  (Istnieje  wyjątek  dla  funkcji.)
       Dopuszczalnymi  wartościami  ibase  są  2  do  16. Przypisanie ibase wartości spoza tego zakresu nada jej
       wartość 2 lub 16. Liczby wejściowe mogą zawierać znaki 0-9 oraz A-F. (Uwaga: muszą to być wielkie litery.
       Małe litery są nazwami zmiennych.) Liczby jednocyfrowe mają zawsze wartość cyfry, bez względu na  wartość
       ibase.  (tj.  A  = 10.) Dla liczb wielocyfrowych bc zamienia wszystkie cyfry wejściowe większe bądź równe
       ibase na wartość ibase-1. Powoduje to, że liczba FFF będzie zawsze  największą  trzycyfrową  liczbą  przy
       danej podstawie systemu dla wejścia.

       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 posiada 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 jeden 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 posiada 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 posiadają 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.  Rozważ 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 zaś "(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ętnie 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  interaktywneggo  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 (.), nie bę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" (wysuw 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ą instukcję 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.

   PSEUDO-INSTRUKCJE
       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  jest
       zero  lub  więcej  jej  parametrów  przez  podanie ich nazw rozdzielonych przecinkami. Liczby są jedynymi
       parametrami wywoływanymi przez wartość. Tylko  tablice  są  wołane  przez  wskazanie  zmiennej.   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 nazwę (wskazanie).  Ponieważ  definicje  funkcji  są  dynamiczne,  w  trakcie  wywoływania  funkcji
       sprawdzana  jest liczba i typy jej parametrów.  Niezgodnośc 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.

       Rozszerzeniem GNU bc jest nieco luźniejszy format dla definicji.  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ą  ilość  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); }

   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  (poprzez  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 posiada 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 w oparciu o projekt 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 posiadają 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
              Łańcuchy nie mogą zawierać znaków NUL. POSIX stwierdza, że wszystkie znaki  muszą  być  zawarte  w
              łańcuchach.

       last   POSIX bc nie posiada 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 posiada klauzuli else.

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

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

       funkcja read
              POSIX bc nie posiada funkcji read.

       instrukcja print
              POSIX bc nie posiada instrukcji print.

       instrukcja continue
              POSIX bc nie posiada 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 posiadają 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,  zaś
              instrukcja auto 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
              posiada 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 unikalnych nazw w każdym  z  rodzajów:  zmiennych  prostych,
              tablic i funkcji.

ZMIENNE ŚRODOWISKA

       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 ilość znaków w wierszu wynikowym. Obejmuje  ona
              znaki odwrotnego ukośnika i nowej linii dla długich liczb.

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.  Upewnij się, że pole tematu wiadomości
       zawiera gdzieś słowo ``bc''.

AUTOR

       Philip A. Nelson
       phil@cs.wwu.edu

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.

ZOBACZ TAKŻE

       dc(1), expr(1), awk(1)

INFORMACJE O TŁUMACZENIU

       Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i może nie być aktualne.
       W razie zauważenia różnic między powyższym opisem a rzeczywistym  zachowaniem  opisywanego  programu  lub
       funkcji, prosimy o zapoznanie się z oryginalną (angielską) wersją strony podręcznika za pomocą polecenia:

              man --locale=C 1 bc

       Prosimy   o   pomoc   w   aktualizacji   stron   man  -  więcej  informacji  można  znaleźć  pod  adresem
       http://sourceforge.net/projects/manpages-pl/.

v1.06                                          Podręcznik poleceń                                          bc(1)