dc(1)


NÉV

dc - tetszőleges pontosságú számológép

ÁTTEKINTÉS

dc

LEÍRÁS

A \*(dc egy korlátlan pontosságú számítások elvégzésére alkalmas fordított-lengyel (postfix) asztali számológép, amely lehetőséget ad makrók definiálására és végrehajtására. A bemenetet a standard bemenetről veszi; ha argumentumot adsz meg neki, azt fájlnévként értelmezi és azon fájlok tartalmát veszi és hajtja végre, majd ezután olvas a standard bemenetről. A kimenet a standard kimenet, a hibák a standard hibakimenetre íródnak.

A fordított-lengyel számológép a számokat egy veremben tárolja. Új szám bevitele esetén a szám a verem tetejére kerül. A műveletek az argumentumukat a verem tetejéről veszik, majd az eredményt visszateszik a verembe.

A bevitelhez a számot egyszerűen beírod, követheti opcionálisan tizedespont. A hatványalak használata nem támogatott. Negatív számok beviteléhez a számot ``_'' karakterrel kezdd. Az előjel nem lehet ``-'', mivel ez a kivonás műveleti operátora. Több számot egymástól szóközzel vagy új sorral elválasztva lehet bevinni, ezen karakterek nem parancsok.

KIÍRÓ PARANCSOK

p
Kiírja a verem tetején levő számot a verem megváltoztatása nélkül. A szám után egy újsor karakter is kiíródik.

P
Kiveszi a verem tetejéről a számot, kiírja, és nem ír utána újsor karaktert.

f
Kiírja a verem teljes tartalmát anélkül, hogy bármit változtatna. Akkor jó, ha teljesen eltévedtél, vagy ki akarod találni, hogy egy parancs vajon mit csinált.

SZÁMÍTÁSOK

+
Leveszi a verem két felső elemét, összeadja őket, és az eredményt a verembe helyezi. A pontosságot kizárólag az argumentumok értéke határozza meg.

-
Leveszi a verem két felső elemét, az elsőt (ami eredetileg felül volt) kivonja a másodikból, majd az eredményt a verembe helyezi.

*
Leveszi a verem két felső elemét, összeszorozza őket, majd az eredményt a verembe helyezi. A tizedesjegyek számát az aktuális pontosságérték (l. lentebb) határozza meg, és nem függ a szorzandóktól.

/
Leveszi a verem két felső elemét, az elsőt elosztja a másodikkal, majd az eredményt a verembe helyezi. A tizedesjegyek számát a pontosságérték határozza meg.

%
Leveszi a verem két felső elemét, a / által végzett osztás maradékát a verembe helyezi. Az osztás a pontosságérték által meghatározott pontossággal végződik el, és a maradék is ennek megfelelő számú jegyre számolódik ki.

~
Leveszi a verem két felső elemét, az elsőt elosztja a másodikkal. Először a hányadost, aztán a maradékot helyezi a verembe. Az osztásban használt tizedesjegyek értéke a pontosságértéktől függ. (A SdSn lnld/ LnLd% hatása hasonló, a hibakezelése más egy kicsit.)

^
Leveszi a verem két felső elemét, az elsőt (ami eredetilg felül volt) kitevőként, a másodikat alapként használva elvégzi a hatványozást. Ha a kitevőnek van törtrésze, azt figyelmen kívül hagyja. A pontosságérték határozza meg, hogy az eredmény hány tizedesjegyre számítódik ki.

|
Törtkitevős hatványozást végez. Leveszi a verem felső három elemét. Az első (ami eredetileg felül volt) lesz a kitevő nevezője, ez nem lehet nulla, és egésznek kell lennie. A második a kitevő számlálója, ez nem lehet negatív. Ha van tizedesjegye, azt figyelmen kívül hagyja. A harmadik szám lesz a hatványozás alapja. A pontosságérték határozza meg, hogy az eredmény hány tizedesjegyre számítódik ki. Kis számok esetén hasonlít hozzá a Sm lble^ Lm% szekvencia, de a ^-tól eltérően ez a parancs nem alkalmazható tetszőlegesen nagy kitevőkre.

v
Levesz egy elemet a veremről, kiszámítja a négyzetgyökét, majd az eredményt a verembe helyezi. A pontosságérték határozza meg, hogy hány tizedesjegyre végződik el a számítás.

A legtöbb számítás eredményét befolyásolja a k paranccsal beállítható pontosságérték. Ez alapértelmezésben nulla, ami azt jelenti, hogy az összeadás és a kivonás kivételével minden művelet erdménye egész lesz.

A % maradék-művelet kis magyarázatra szorul. Ha az argumentumai ``a'' és ``b'', akkor a művelet eredménye ``a - (b * (a / b))'', ahol ``a / b'' az aktuális pontosságérték szerint számítódik.

VEREMKARBANTARTÁS

c
Kitörli a verem minden elemét, a verem üres lesz.

d
A verem tetején levő elemet megduplázza és a verem tetejére helyezi, így a ``4d*p'' eredménye 16.

r
Megfordítja (kicseréli) a verem két felső elemét.

REGISZTEREK

A \*(dc 256 memóriaregisztert képes kezelni, mindegyikük neve egyetlen karakter. A regiszterben tárolható és később újrafelhasználható egy szám vagy egy karakterlánc.

s r
A verem tetején levő értéket leveszi és az r regiszterben eltárolja.

l r
Az r regiszter tartalmát a verembe helyezi. Ez a művelet nem változtatja meg az r regiszter tartalmát.

Minden regiszternek megvan a saját verme, az aktuális regiszterérték van a verem tetején.

S r
A (fő) verem tetején levő értéket leveszi és az r regiszter vermébe helyezi. A regiszter előző értéke így elérhetetlen.

L r
Az r regiszter verméből leveszi az elemet és a fő verembe helyezi. Ha az r regiszter vermében volt régebben valami érték, akkor az most a l r paranccsal elérhetővé válik.

PARAMÉTEREK

A \*(dc működését három paraméter befolyásolja: a pontosság, a beviteli alap és a kimeneti alap. A pontosság határozza meg, hogy a műveletek eredményéből hány tizedesjegy maradjon meg. A beviteli alap mutatja meg, hogy a begépelt számok hányas számrendszerben vannak; minden begépelt szám ebben a számrendszerben értelmeződik. Számok kiírásakor a számok a kimeneti alap szerinti számrendszerben íródnak ki.

A beviteli és a kimeneti alapok különböző paraméterek, nem kell feltétlenül egyenlőnek lenniük; ez lehet hasznos és zavaró is. A bemeneti alap legalább 2, legfeljebb 36 lehet. A kimeneti alapnak legalább 2-nek kell lennie. A pontosságnak nullának vagy nagyobbnak kell lennie. A pontosság a beviteli és kimeneti alaptól függetlenül mindig tizedesjegyeket jelent.

i
Leveszi a verem tetején levő számot és erre állítja a beviteli alapot.

o
Leveszi a verem tetején levő számot és erre állítja a kimeneti alapot.

k
Leveszi a verem tetején levő számot és erre állítja a pontosságot.

I
Az aktuális beviteli alapot a verem tetejére helyezi.

O
Az aktuális kimeneti alapot a verem tetejére helyezi.

K
A pontosság aktuális értékét a verem tetejére helyezi.

KARAKTERLÁNCOK

A \*(dc képes karakterláncokat is kezelni. A karakterláncokat csak tárolni vagy makróként végrehajtani (azaz a tartalmuk \*(dc parancsként értelmeződik) lehet. Karakterláncok tárolására minden regiszter és a verem is képes. Néhány parancs, mint például az aritmetikai műveletek számokat várnak argumentumként, és hibát jeleznek, ha karakterláncot találnak helyette. Más parancsok számot és karakterláncot is elfogadnak; ilyen például a p parancs, ami mindegyiket elfogadja és a típusának megfelelő módon írja ki.

[ karakterek ]
A karakterek -et tartalmazó karakterláncot (azokat a karaktereket, amik [ és ] karakterek között vannak) tartalmazó karakterláncot képez és a veremre helyezi. Például a [foo]P kiírja a foo szöveget és nem ír utána újsor karaktert.

a
Leveszi a verem legfelső elemét. Ha ez szám, akkor az alacsony helyiértékű bájtját karakterré konvertálja és a verembe helyezi. Ha ez karakterlánc, akkor ennek első karakterét helyezi vissza a verembe.

x
Leveszi a verem legfelső elemét és makróként végrehajtja. Normális esetben ez az elem egy karakterlánc; ha szám, akkor visszahelyezi a verembe. Például a [1p]x végrhajtja a 1p makrót, ami egy 1 -est tesz a verembe és új sorban kiírja az 1 -et.

A makrókat leggyakrabban regiszterekben tároljuk; a [1p]sa az a regiszterbe tesz egy olyan makrót, ami egy 1 -est ír ki. A lax parancs hajtja végre ezt a makrót.

> r
Leveszi a verem két felső elemét, feltételezi, hogy ezek számok, összehasonlítja őket, és végrehajtja az r regiszterben lévő makrót, ha az eredetileg a verem tetején levő szám nagyobb. Az 1 2>a parancs végrehajtja az a regiszterben tárolt makrót, míg a 2 1>a parancs nem.

< r
Hasonló, de akkor hajtja végre a makrót, ha az eredetileg a verem tetején levő szám kisebb.

= r
Hasonló, de akkor hajtja végre a makrót, ha a két levett elem egyenlő.

?
Beolvas egy sort a terminálról és végrehajtja. Ezzel a paranccsal lehet felhasználói bevitelt kérni.

q
Kilép a makróból és az azt hívó makróból is. Ha a legfelső szinten hajtod végre, a q parancs kilép a \*(dc -ből.

Q
Leveszi a verem legfelső elemét és ennyi szintet lép ki a makrókból. A Q parancs soha nem lép ki a \*(dc -ből.

ÁLLAPOTLEKÉRDEZÉS

Z
Leveszi a verem tetején levő elemet, megszámolja hány jegyű (ha szám) vagy hány karakterből áll (ha karakterlánc), és ezt a számot teszi a verembe.

X
Leveszi a verem tetején levő elemet, megszámolja, hány tizedesjegye van, majd ezt a számot teszi a verembe. Ha a levett elem karakterlánc, akkor 0 -t tesz a verembe.

z
A verembe teszi a verem aktuális mélységét; azt, hogy a z parancs végrehajtása előtt hány elem volt a veremben.

EGYÉB

!
A sor többi részét mint rendszerparancsot futtatja.

#
A sor többi részét megjegyzésként kezeli.

: r
A verem két felső elemét leveszi. A második elemet az r tömbbe helyezi, amit az első elemmel indexel.

; r
Leveszi a verem felső elemét és az r tömb indexeként használja. A kiválasztott elem a verembe kerül.

MEGJEGYZÉSEK

A : és a ; tömbműveteket általában csak a bc hagyományos implementációi használják. (A GNU bc ezt tartalmazza, nem szükséges a futásához a \*(dc. )

HIBÁK

A hibákat e-mail-ben jelentsd a bug-gnu-utils@prep.ai.mit.edu címen. A levél tárgyában valahol legyen benne a ``dc'' szó.

MAGYAR FORDÍTÁS

Tevesz Tamás <ice@rulez.org>