bc

bc(1)                        General Commands Manual                       bc(1)



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
       Numbers are stored in two types of variables, simple variables and
       arrays.  Both simple variables and array variables are named.  Names
       begin with a letter followed by any number of letters, digits and
       underscores.  All letters must be lower case.  (Full alpha-numeric names
       are an extension. In POSIX bc all names are a single lower case letter.)
       The type of variable is clear by the context because all array variable
       names will be followed by brackets ([]).

       There are four special variables, scale, ibase, obase, and last.  scale
       defines how some operations use digits after the decimal point.  The
       default value of scale is 0. ibase and obase define the conversion base
       for input and output numbers.  The default for both input and output is
       base 10.  last (an extension) is a variable that has the value of the
       last printed number.  These will be discussed in further detail where
       appropriate.  All of these variables may have values assigned to them as
       well as used in expressions.

   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
              The result of the expression is the value of the first raised to
              the second. The second expression must be an integer.  (If the
              second expression is not an integer, a warning is generated and
              the expression is truncated to get an integer value.)  The scale
              of the result is scale if the exponent is negative.  If the
              exponent is positive the scale of the result is the minimum of the
              scale of the first expression times the value of the exponent and
              the maximum of scale and the scale of the first expression.  (e.g.
              scale(a^b)  = min(scale(a)*b, max( scale, scale(a))).)  It should
              be noted that expr^0 will always return the value of 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.

       Boolean operations are also legal.  (POSIX bc does NOT have boolean
       operations). The result of all boolean operations are 0 and 1 (for false
       and true) as in relational expressions.  The boolean operators are:

       !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

       This precedence was chosen so that POSIX compliant bc programs will run
       correctly. This will cause the use of the relational and logical
       operators to have some unusual behavior when used with assignment
       expressions.  Consider the expression:
              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.

       There are a few more special expressions that are provided in bc.  These
       have to do with user defined functions and standard functions.  They all
       appear as "name(parameters)".  See the section on functions for user
       defined functions.  The standard functions are:

       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
       Statements (as in most algebraic languages) provide the sequencing of
       expression evaluation.  In bc statements are executed "as soon as
       possible." Execution happens when a newline in encountered and there is
       one or more complete statements.  Due to this immediate execution,
       newlines are very important in bc. In fact, both a semicolon and a
       newline are used as statement separators.  An improperly placed newline
       will cause a syntax error.  Because newlines are statement separators, it
       is possible to hide a newline by using the backslash character.  The
       sequence "\<nl>", where <nl> is the newline appears to bc as whitespace
       instead of a newline.  A statement list is a series of statements
       separated by semicolons and newlines.  The following is a list of bc
       statements and what they do: (Things enclosed in brackets ([]) are
       optional parts of the statement.)

       wyrażenie
              This statement does one of two things.  If the expression starts
              with "<variable> <assignment> ...", it is considered to be an
              assignment statement.  If the expression is not an assignment
              statement, the expression is evaluated and printed to the output.
              After the number is printed, a newline is printed.  For example,
              "a=1" is an assignment statement and "(a=1)" is an expression that
              has an embedded assignment.  All numbers that are printed are
              printed in the base specified by the variable obase. The legal
              values for  obase are 2 through BC_BASE_MAX.  (See the section
              LIMITS.)  For bases 2 through 16, the usual method of writing
              numbers is used.  For bases greater than 16, bc uses a
              multi-character digit method of printing the numbers where each
              higher base digit is printed as a base 10 number.  The
              multi-character digits are separated by spaces.  Each digit
              contains the number of characters required to represent the base
              ten value of "obase-1".  Since numbers are of arbitrary precision,
              some numbers may not be printable on a single output line.  These
              long numbers will be split across lines using the "\" as the last
              character on a line.  The maximum number of characters printed per
              line is 70.  Due to the interactive nature of bc, printing a
              number causes the side effect of assigning the printed value to
              the special variable last. This allows the user to recover the
              last value printed without having to retype the expression that
              printed the number.  Assigning to last is legal and will overwrite
              the last printed value with the assigned value.  The newly
              assigned value will remain until the next number is printed or
              another value is assigned to last.  (Some installations may allow
              the use of a single period (.) which is not part of a number as a
              short hand notation for for 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
              The print statement (an extension) provides another method of
              output.  The "list" is a list of strings and expressions separated
              by commas.  Each string or expression is printed in the order of
              the list.  No terminating newline is printed.  Expressions are
              evaluated and their value is printed and assigned to the variable
              last. Strings in the print statement are printed to the output and
              may contain special characters.  Special characters start with the
              backslash character (\).  The special characters recognized by bc
              are "a" (alert or bell), "b" (backspace), "f" (form feed), "n"
              (newline), "r" (carriage return), "q" (double quote), "t" (tab),
              and "\" (backslash).  Any other character following the backslash
              will be ignored.

       { 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
              The for statement controls repeated execution of the statement.
              Expression1 is evaluated before the loop.  Expression2 is
              evaluated before each execution of the statement.  If it is
              non-zero, the statement is evaluated.  If it is zero, the loop is
              terminated.  After each execution of the statement, expression3 is
              evaluated before the reevaluation of expression2.  If expression1
              or expression3 are missing, nothing is evaluated at the point they
              would be evaluated.  If expression2 is missing, it is the same as
              substituting the value 1 for expression2.  (The optional
              expressions are an extension. POSIX bc requires all three
              expressions.)  The following is equivalent code for the for
              statement:
              wyrażenie1;
              while (wyrażenie2) {
                 instrukcja;
                 wyrażenie3;
              }

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

       continue
              The continue statement (an extension)  causes the most recent
              enclosing for statement to start the next iteration.

       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 }
       A function call is just an expression of the form "name(parameters)".

       Parameters are numbers or arrays (an extension).  In the function
       definition, zero or more parameters are defined by listing their names
       separated by commas.  All parameters are call by value parameters.
       Arrays are specified in the parameter definition by the notation
       "name[]".  In the function call, actual parameters are full expressions
       for number parameters.  The same notation is used for passing arrays as
       for defining array parameters.  The named array is passed by value to the
       function.  Since function definitions are dynamic, parameter numbers and
       types are checked when a function is called.  Any mismatch in number or
       types of parameters will cause a runtime error.  A runtime error will
       also occur for the call to an undefined function.

       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); }


       Functions may be defined as void.  A void funtion returns no value and
       thus may not be used in any place that needs a value.  A void function
       does not produce any output when called by itself on an input line.  The
       key word void is placed between the key word define and the function
       name.  For example, consider the following session.
              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.

       Also, call by variable for arrays was added.  To declare a call by
       variable array, the declaration of the array parameter in the function
       definition looks like "*name[]".  The call to the function remains the
       same as call by value arrays.

   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

                /* Check the sign of 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 can be compiled (via a configure option) to use the GNU readline
       input editor library or the BSD libedit library.  This allows the user to
       do editing of lines before sending them to bc.  It also allows for a
       history of previous lines typed.  When this option is selected, bc has
       one more special variable.  This special variable, history is the number
       of lines of history retained.  For readline, a value of -1 means that an
       unlimited number of history lines are retained.  Setting the value of
       history to a positive number restricts the number of history lines to the
       number given.  The value of 0 disables the history feature.  The default
       value is 100. For more information, read the user manuals for the GNU
       readline, history and BSD libedit libraries.  One can not enable both
       readline and libedit at the same time.

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

       last   POSIX bc does not have a last variable.  Some implementations of
              bc use the period (.) in a similar way.

       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 does not have a print statement .

       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
              This should be an integer specifying the number of characters in
              an output line for numbers. This includes the backslash and
              newline characters for long numbers.  As an extension, the value
              of zero disables the multi-line feature.  Any other value of this
              variable that is less than 3 sets the line length to 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
       manpages-pl-list@lists.sourceforge.net ⟨⟩.



Projekt GNU                    11 czerwca 2006 r.                          bc(1)