dc - tetszőleges pontosságú
számológép
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 szabványos
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 szabványos bemenetről. A kimenet a
szabványos kimenet, a hibák a szabványos 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.
- 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.
- +
- 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.
- 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.
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.
- sr
- A verem tetején levő értéket leveszi és
az r regiszterben eltárolja.
- lr
- 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.
- Sr
- 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.
- Lr
- 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
lr paranccsal elérhetővé
válik.
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.
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.
- !
- 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.
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. )
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ó.
Tevesz Tamás <ice@rulez.org>