dc
NAZWA
dc - kalkulator dowolnej precyzji
SKŁADNIA
dc [-V] [--version] [-h] [--help] [-e wyraż-skryptowe] [--expression=
wyraż-skryptowe] [-f plik-skryptu] [--file= plik-skryptu] [plik...]
OPIS
Dokument ten opisuje dc w wersji 1.06, z listopada 2000.
dc jest kalkulatorem pracującym w odwrotnej notacji polskiej,
obsługującym arytmetykę nieograniczonej precyzji. Pozwala również na
definiowanie i wywoływanie makr. Zwykle dc czyta ze standardowego
wejścia. Jeśli użyto argumentów polecenia dc, to są one traktowane jak
nazwy plików. Zawartość tych plików jest odczytywana i wykonywana przez
dc przed odczytem standardowego wejścia. Wszystkie zwykłe wyniki
kierowane są na standardowe wyjście; wszystkie komunikaty o błędach
kierowane są na standardowe wyjście błędów.
Kalkulator odwrotnej notacji polskiej przechowuje liczby na stosie.
Wprowadzenie liczby odkłada ją na stos. Operacje arytmetyczne
pobierają argumenty ze stosu i odkładają na nim wyniki.
W celu wprowadzenia liczby do dc wpisujemy cyfry z opcjonalną kropką
dziesiętną. Nie jest rozpoznawana notacja wykładnicza. Liczbę ujemną
poprzedzamy znakiem podkreślenia ``_"". Nie można posłużyć się w tym
celu znakiem ``-"" (minus), gdyż jest to dwuargumentowy operator odej-
mowania. Dwie kolejne liczby wprowadzamy oddzielając je spacjami lub
znakami nowej linii. Nie mają one znaczenia jako polecenia.
OPCJE
Dc można wywoływać z następującymi opcjami wiersza poleceń:
-V
--version
Wypisuje numer wersji uruchomionego dc i informację o prawach
autorskich, a następnie kończy działanie.
-h
--help Wypisuje komunikat o sposobie wywołania, podając w skrócie opcje
wiersza poleceń i adres, na który należy zgłaszać błędy, a
następnie kończy działanie.
-e skrypt
--expression=skrypt
Dodaje polecenia ze skryptu do zestawu poleceń, jakie mają być
wykonane podczas przetwarzania wejścia.
-f plik-skryptu
--file=plik-skryptu
Dodaje polecenia zawarte w pliku-skryptu do zestawu poleceń,
jakie mają być wykonane podczas przetwarzania wejścia.
Jeżeli po przetworzeniu powyższych opcji pozostaną jeszcze jakieś
parametry wiersza poleceń, to są one interpretowane jako nazwy plików
wejściowych, które należy wykonać. Nazwa - odnosi się do standardowego
strumienia wejściowego. Jeśli nie podano ani opcji -e ani żadnych
plików, to polecenia do wykonania będą czytane ze standardowego
wejścia.
Polecenia wypisywania
p Wypisuje wartość z wierzchołka stosu, bez jego zmiany. Po
wartości wypisywany jest znak nowej linii.
n Wypisuje wartość z wierzchołka stosu, zdejmując ją równocześnie
ze stosu. Nie wypisuje po niej znaku nowej linii. P Zdejmuje
wartość z wierzchołka stosu. Jeśli jest to łańcuch, to jest on
po prostu wypisywany bez końcowego znaku nowej linii. W przeci-
wnym razie jest to liczba, a część całkowita jej wartości
bezwzględnej wypisywana jest jako strumień bajtów "o podstawie
(UCHAR_MAX+1)". Zakładając, że (UCHAR_MAX+1) wynosi 256 (jak to
jest w większości maszyn o 8-bitowych bajtach), funkcję tę real-
izuje także sekwencja KSK 0k1/ [_1*]sx d0>x [256~aPd0 sxLKk, z wyjątkiem skutku ubocznego, jakim jest nadpisanie
wartości z rejestru x.
f Wypisuje całą zawartość stosu nie zmieniając niczego. Jest
polecenie przydatne w sytuacji, gdy się pogubiliśmy lub chcemy
się zorientować, jaki był efekt pewnych poleceń.
Arytmetyka
+ Zdejmuje ze stosu dwie wartości, dodaje je i odkłada wynik na
stos. Dokładność wyniku zależy wyłącznie od wartości argumentów
i jest wystarczająco ścisła.
- Zdejmuje ze stosu dwie wartości, odejmuje pierwszą zdjętą od
drugiej i składa wynik ponownie na stos.
* Zdejmuje ze stosu dwie wartości, mnoży je i odkłada wynik na
stos. Liczba cyfr ułamkowych wyniku jest kontrolowana przez
aktualną wartość dokładności (patrz niżej) i liczby cyfr
ułamkowych mnożonych wartości.
/ Zdejmuje ze stosu dwie wartości, dzieli drugą zdjętą przez pier-
wszą i odkłada wynik ponownie na stos. Liczba cyfr ułamkowych
wyniku określana jest przez wartość dokładności.
% Zdejmuje ze stosu dwie wartości, oblicza resztę z dzielenia,
jakie byłoby wykonane przez / i odkłada wynik na stos. Oblic-
zona wartość jest tą samą, co otrzymana z sekwencji Sd dld/
Ld*-.
~ Zdejmuje ze stosu dwie wartości, dzieli drugą zdjętą przez pier-
wszą. Odkłada na stos iloraz, a następnie resztę z dzielenia.
Dzielenie wykonywane jest z liczbą cyfr ułamkowych określoną
wartością dokładności. (Funkcję tę może też spełniać sekwencja
SdSn lnld/ LnLd%, z nieco odmiennym sprawdzaniem błędów.)
^ Zdejmuje ze stosu dwie wartości i wykonuje potęgowanie,
posługując się pierwszą zdjętą jako wykładnikiem, zaś drugą jako
podstawą potęgowania. Ułamkowa część wykładnika jest
ignorowana. Wartość dokładności określa liczbę cyfr ułamkowych
wyniku.
| Zdejmuje ze stosu trzy wartości i oblicza potęgowanie modulo [od
tłum: modular exponentiation == (a^b) mod c].
Pierwsza ze zdjętych wartości używana jest jako dzielnik oper-
acji (reduction modulus). Wartość ta musi być niezerowa i
powinna być liczbą całkowitą. Druga używana jest jako wykładnik
i musi być liczbą nieujemną, a jej część ułamkowa zostanie zig-
norowana. Trzecia z pobranych ze stosu wartości określa pod-
stawę potęgowania, powinna ona być całkowita. Dla małych liczb
jest to zbliżone do sekwencji Sm^Lm%, ale, w odróżnieniu od ^,
polecenie to działa z dowolnie dużymi wykładnikami.
v Zdejmuje ze stosu pojedynczą wartość, oblicza jej pierwiastek
kwadratowy i odkłada go na stos. Wartość dokładności określa
liczbę cyfr ułamkowych wyniku.
Na większość operacji arytmetycznych wpływa ``wartość dokładności"",
którą ustala się za pomocą polecenia k. Domyślną wartością dokładności
jest zero, co oznacza, że wszystkie działania arytmetyczne z wyjątkiem
dodawania i odejmowania dają wyniki całkowite.
Operacja reszty % wymaga pewnego wyjaśnienia: zastosowana do argumentów
``a"" i ``b"" daje w wyniku ``a - (b * (a / b))"", gdzie ``a/b""
obliczane jest z bieżącą dokładnością.
Kontrola stosu
c Czyści stos, powoduje, że będzie on pusty.
d Powiela wartość na wierzchołku stosu, odkładając na stos jej
kopię. Zatem ``4d*p"" oblicza 4 podniesione do kwadratu i wyp-
isuje wynik.
r Zamienia miejscami dwie górne wartości na stosie.
Rejestry
dc udostępnia 256 rejestrów pamięciowych, każdy nazwany pojedynczym
znakiem. W rejestrze można przechować liczbę lub łańcuch znakowy i
później je odtworzyć.
sr Zdejmuje wartość z wierzchołka stosu i zapisuje w rejestrze r.
lr Kopiuje wartość zawartą w rejestrze r i odkłada ją na stos. Nie
zmienia to zawartości r.
Każdy z rejestrów posiada również swój własny stos. Bieżącą wartością
rejestru jest wierzchołek stosu rejestru.
Sr Zdejmuje wartość z wierzchołka stosu (głównego) i odkłada ją na
stosie rejestru r. Poprzednia wartość rejestru staje się
niedostępna.
Lr Zdejmuje wartość z wierzchołka stosu rejestru r i odkłada ją na
głównym stosie. Poprzednia wartość stosu rejestru r, jeśli była
takowa, jest teraz dostępna poprzez polecenie lr.
Parametry
dc posiada trzy parametry kontrolujące jego pracę: dokładność, podstawę
systemu pozycyjnego wejścia i podstawę wyjścia. Dokładność określa
liczbę cyfr dziesiętnych, jaka będzie zachowana w wyniku większości
operacji arytmetycznych. Podstawa wejścia odpowiada za interpretację
wprowadzanych liczb; wszystkie wprowadzane liczby używają tej podstawy.
Podstawa wyjścia używana jest do wypisywania liczb.
Podstawa wejścia i wyjścia są odrębnymi parametrami; można spowodować,
że będą różne, co może być użyteczne lub mylące. Podstawa wejścia musi
być liczbą z zakresu od 2 do 16. Podstawa wyjścia musi wynosić co
najmniej 2. Dokładność musi być równa zeru lub większa. Dokładność
zawsze określana jest jako liczba cyfr dziesiętnych, niezależnie od
bieżącej podstawy wejścia czy wyjścia.
i Zdejmuje wartość z wierzchołka stosu i posługuje się nią do
ustawienia podstawy wejścia.
o Zdejmuje wartość z wierzchołka stosu i posługuje się nią do
ustawienia podstawy wyjścia.
k Zdejmuje wartość z wierzchołka stosu i posługuje się nią do
ustawienia dokładności.
I Odkłada bieżącą wartość podstawy wejścia na stosie.
O Odkłada bieżącą wartość podstawy wyjścia na stosie.
K Odkłada bieżącą dokładność na stosie.
Ła�ńcuchy znakowe
dc oprócz pracy z liczbami może też działać na łańcuchach znakowych.
Łańcuchy można jedynie wypisywać i wykonywać jako makra (co oznacza, że
zawartość łańcucha przetwarzana jest jako polecenia dc). Stos i wszys-
tkie rejestry mogą przechowywać łańcuchy, a dc zawsze wie, czy dany
obiekt jest łańcuchem czy liczbą. Niektóre z poleceń, jak np. operacje
arytmetyczne, wymagają liczb jako swych argumentów i wyświetlają błędy,
jeśli dostarczono im łańcuch. Inne akceptują zarówno liczby, jak i
łańcuchy znakowe. Na przykład, polecenie p akceptuje oba rodzaje argu-
mentów i wypisuje obiekt stosownie do jego typu.
[znaki]
Tworzy łańcuch zawierający znaki (zawarte pomiędzy nawiasami
kwadratowymi [ i ]) i odkłada go na stos. Na przykład, [foo]P
wypisuje znaki foo (bez zakończenia znakiem nowej linii).
a Zdejmowany jest wierzchołek stosu. Jeżeli jest to liczba, to
młodszy bajt (low-order byte) tej liczby zamieniany jest na
łańcuch i odkładany na stos. W przeciwnym przypadku, wierzchołek
stosu był łańcuchem, a z powrotem na stos odkładany jest pier-
wszy znak tego łańcucha.
x Zdejmuje wartość ze stosu i wykonuje ją jako makro. Zwykle
powinien to być łańcuch znakowy. Jeżeli jest to liczba, to
zostanie po prostu zwrócona na stos. Na przykład, [1p]x
wykonuje makro 1p, które odkłada 1 na stosie i wypisuje 1 w
osobnym wierszu.
Makra są najczęściej przechowywane w rejestrach: [1p]sa składuje makro
do wypisania 1 w rejestrze a, zaś lax wywołuje to makro.
>r Zdejmuje dwie wartości ze stosu i porównuje je, zakładając, że
są one liczbami, wykonując zawartość rejestru r jako makro,
jeśli pierwotny wierzchołek stosu jest większy. Tak więc, 1 2>a
wywoła zawartość rejestru a zaś 2 1>a nie wywoła.
!>r Podobnie, ale wywołuje makro jeśli pierwotny wierzchołek stosu
nie jest większy (jest mniejszy bądź równy) od liczby
występującej pod nim.
jest mniejszy od liczby występującej pod nim. ! wywołuje makro jeśli pierwotny wierzchołek stosu nie jest
mniejszy (jest większy bądź równy) od liczby występującej pod
nim.
=r Podobnie, ale wywołuje makro, gdy obie zdjęte ze stosu liczby są
równe.
!=r Podobnie, ale wywołuje makro, gdy obie zdjęte ze stosu liczby
nie są równe.
? Czyta wiersz z terminala i wykonuje go. Polecenie to umożliwia
makru pobieranie danych od użytkownika.
q powoduje zakończenie pracy makra i makra, z którego było ono
wywołane. Polecenie to wywołane na najwyższym poziomie lub z
makra wywołanego bezpośrednio z najwyższego poziomu spowoduje
zakończenie pracy dc.
Q Zdejmuje ze stosu wartość i używa jej jako liczby poziomów wyko-
nania makr, jakie mają zostać zakończone. Tak więc, 3Q kończy
pracę trzech poziomów makr. Polecenie Q nigdy nie powoduje
zakończenia pracy dc.
Informacja o stanie
Z Zdejmuje wartość ze stosu, oblicza liczbę jej cyfr (lub liczbę
znaków, jeśli jest to łańcuch) i odkłada tę liczbę na stos.
X Zdejmuje wartość ze stosu, oblicza liczbę jej cyfr ułamkowych i
odkłada tę liczbę na stos. Dla łańcuchów wartością odkładaną na
stos jest 0.
z Odkłada na stos bieżącą wysokość stosu: liczbę obiektów na
stosie przed wykonaniem polecenia z.
R�ó�żne
! Uruchamia resztę wiersza jako polecenie systemu. Zauważ, że
pierwszeństwo w analizie składni mają polecenia !<, != i !>,
więc jeśli chcemy uruchomić polecenie systemu zaczynające się od
<, > lub =, to po ! musimy dodać odstęp.
# Interpretuje resztę wiersza jako komentarz.
:r Zdejmuje ze stosu dwie górne wartości. Wartość, która była drugą
od góry stosu zostanie zachowana w tablicy r, indeksowanej
wartością byłego wierzchołka stosu.
;r Zdejmuje wierzchołek stosu i posługuje się nim jako indeksem
tablicy r. Wybrana w ten sposób wartość jest następnie
odkładana na stos. Zauważ, że każda ze składowanych na stosie
instancji rejestru ma swoją własną, skojarzoną z nią tablicę.
Zatem, 1 0:a 0Sa 2 0:a La 0;ap wypisze 1, gdyż 2 zostało
zapamiętane w instancji 0:a, która została później odłożona na
stos.
UWAGI
Operacje tablicowe : oraz ; są zwykle używane wyłącznie przez trady-
cyjne implementacje bc. (Program bc w wersji GNU jest samowystarczalny
i nie potrzebuje dc by działać.)
BŁĘDY
Błędy proszę zgłaszać (w jęz.angielskim) na adres bug-dc@gnu.org.