dc - kalkulator dowolnej precyzji
dc [-V] [--version] [-h]
[--help]
[-e wyrażenie-skryptu]
[--expression=wyrażenie-skryptu]
[-f wyrażenie-pliku]
[--file=wyrażenie-pliku]
[plik ...]
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 (wielkie
litery od A do F są „cyframi”, przy pracy
z systemami liczbowymi o podstawie większej niż
dziesięć) 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 odejmowania. Dwie kolejne liczby wprowadzamy
oddzielając je spacjami lub znakami nowej linii. Nie mają one
znaczenia jako polecenia.
dc można wywołać 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
plików skryptów ani żadnych wyrażeń, to
polecenia do wykonania będą czytane ze standardowego
wejścia.
- 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 przeciwnym 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ę realizuje
także sekwencja KSK0k1/_1Ss [ls*]Sxd0>x
[256~Ssd0<x]dsxxsx[q]Sq[Lsd0>qaPlxx] dsxxsx0sqLqsxLxLK+k
(większość stopnia skomplikowania tego kodu,
natywnego dla dc, wynika z odwrotnego obliczania znaków
przez ~ oraz chęci upewnienia się, że wszystkie
rejestry znajdą się na koniec z powrotem w swoich
pierwotnych stanach).
- 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ń.
- +
- 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 zależy od aktualnej
wartość dokładności i liczby cyfr
ułamkowych w obu argumentach.
- /
- Zdejmuje ze stosu dwie wartości, dzieli drugą
zdjętą przez pierwszą 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. Obliczona wartość jest tą samą, co
otrzymana z sekwencji Sd dld/ Ld*-.
- ~
- Zdejmuje ze stosu dwie wartości, dzieli drugą
zdjętą przez pierwszą. 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 operacji
(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 zignorowana. Trzecia z pobranych ze stosu wartości
określa podstawę 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. Maksymalna
wartość dokładności i
dokładności argumentu służy do
określenia liczby 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.
- 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 wypisuje
wynik.
- r
- Zamienia miejscami dwie górne wartości na stosie
(można to uczynić również sekwencją
SaSbLaLb).
- R
- Zdejmuje z wierzchołka stosu liczbę n. Cyklicznie
rotuje n elementów z wierzchołka stosu na
zaktualizowany stos. Jeśli n jest dodatnie, kierunek rotacji
spowoduje, że najwyższy element stosu stanie się
drugim elementem, jeśli n jest ujemne, to kierunek rotacji
spowoduje, że najwyższym elementem stosu stanie się
n-ty element licząc od góry stosu. Jeśli stos
ma głębokość mniejszą niż
n, to cały stos jest rotowany (w odpowiednim kierunku) bez
zgłaszania błędu.
dc udostępnia co najmniej 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. Jeśli rejestr jest
niezainicjowany, pobierana jest wartość 0. 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.
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ć, w ograniczonym zakresie, 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
wszystkie 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 argumentó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 pierwszy 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 mniejszy (jest większy
bądź równy) od liczby występującej pod
nim.
- <r
- Podobnie, ale 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 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 wykonania 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.
- Z
- Zdejmuje wartość ze stosu, oblicza liczbę jej cyfr
dziesiętnych (lub liczbę znaków, jeśli jest to
łańcuch) i odkłada tę liczbę na stos.
Liczba cyfr liczby nie obejmuje początkowych zer, w tym
jedynego zera przed kropką oddzielającą
część całkowitą od
ułamkowej.
- 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.
- !
- Wykona resztę wiersza jako polecenie systemowe. Proszę
zauważyć, że przetwarzanie poleceń !<, != i
!> ma pierwszeństwo, dlatego jeśli chce się
wykonać polecenie zaczynające się od <, = lub
>, konieczne jest dodanie spacji po znaku !.
- #
- 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.
Proszę zauważyć, że każdy
rejestr ze stosu ma swoją własną,
powiązaną z nim, tablicę. Zatem 1 0:a 0Sa 2 0:a La
0;ap wypisze 1, ponieważ 2 było zachowane w rejestrze 0:a,
który został następnie zdjęty.
- ~/.dcrc
- Polecenia z tego pliku zostaną wykonane przy uruchomieniu
dc.
Tłumaczenie niniejszej strony podręcznika: Wojtek
Kotwica <wkotwica@post.pl> i Michał Kułach
<michal.kulach@gmail.com>
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 lub nowszej. Nie przyjmuje się
ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika
prosimy zgłaszać na adres listy dyskusyjnej
manpages-pl-list@lists.sourceforge.net.