Převod římských čísel na arabská a naopak - RPN

Motto: Cimrmanova hra Švestka je hrou o stáří. K neduhům stáří, postihujícím hlavně intelektuály, patří především dvě vady, komplementárně spojené. Je to: neschopnost udržet myšlenku a druhá vada: neschopnost myšlenku opustit.


Předmluva

  

Zejména druhá vada z úvodního citátu sužuje stránky RPNmania nejvíce. Jejich autor, i když není intelektuálem ani v nejmenším, přes veškeré uvědomění si vážnosti situace není schopen opustit myšlenku na postup převodu římských čísel na arabská a naopak. Posedlost tímto tématem je tak úporná, že zde předkládané řešení této úlohy je v pořadí již čtvrté! Pokud by byl někdo přemrštěným počtem opakovaných návratů ke stále stejnému problému konsternován natolik, že by se zdráhal této skutečnosti uvěřit, zde je výčet dosavadních pokusů o toto řešení:

  1. UserRPL verze pro HP-50g;
  2. Verze v jazyku C pro procesor ARM na HP-50g;
  3. Verze v assembleru pro procesor Saturn na HP-50g.
Bystré oko čtenářovo nemohlo přehlédnout nejen do očí bijící mantru "pro/na HP-50g", ale též použité programovací jazyky poplatné různým platformám, zcela pomíjející RPN. Předchozí souvětí je varováním pro ty, kdo nepřestali doufat v návrat RPN, a mají těšidla nastaveny na vysoký úhel náběhu: Bude to jízda, pořádně se držte. Zde předkládaná verze je totiž
RPN pro HP-35s!

Tak. A je to venku. Po dlouhodobém přešlapování (s jednou čestnou výjimkou) je tu pořádný RPN program! Přídavné jméno "pořádný" je v minulé větě použito oprávněně. Půst si vybral svou daň a projevil se velikostí nového přírůstku do stáda - 270 řádků kódu! Poručík Hamáček by na tomto místě dozajista položil svoji oblíbenou řečnickou otázku: „A z toho máme všichni co?“ Jako obvykle by se mu z řad mužstva nedostalo kýžené odezvy, odpověděl by si proto rezignovaně sám: „Z toho máme všichni radost.“


Řešení

  

Nadměrné množství euforie tryskající z předmluvy musí nutně budit podezření. Každý jistě ví, že zpracování římských čísel je na HP-50g snadné. Množství různých datových typů - včetně textových/znakových řetězců - umožňuje provádět téměř cokoliv. Co ale HP-35s? Vždyť v porovnání s tou RPL obludou je to pouze "mlejn na čísla"! Co tedy s těmi písmeny?

Náhrada písmen

Jako první se samozřejmě nabízela možnost využít zobrazení hexadecimálních číslic. Jenže z požadovaných sedmi I-V-X-L-C-D-M jsou k mání pouze dvě. Má smysl dva znaky ze sedmi ponechat a zbývající nahradit ciframi? To jistě ne. Nechť je tedy nahrazeno všech sedm znaků dekadickými ciframi. Následující tabulka zobrazuje příslušné náhrady.

Originál IVXLCDM
Hodnota 1510501005001000
Náhrada 1527394

Že písmeno I nahrazuje cifra 1 a že V je zastoupeno 5, se dá snadno pochopit. Další zdůvodnění náhrad už ale poněkud pokulhávají. Přesto nejsou zástupné cifry určeny "generátorem náhodných čísel" ani - v tomto případě rovnocennou - "střelbou od boku". Následující odstavec se pokouší zvolený systém náhrad obhájit.

Římské znaky I, X, C, M mají hodnoty vždy začínající cifrou 1. Jsou tedy prostě očíslovány 1, 2, 3, 4. (Tyto hodnoty zároveň určují počty cifer dekadických ekvivalentů.) Absolventu Matematicko-fyzikální fakulty by toto jednoduché zdůvodnění patrně nestačilo. Proto je zde výhradně pro něj nachystán vzorec definující vztah mezi zástupnou římskou cifrou r a její hodnotou v:
v = 10 r - 1
Vysvětlení volby zbývajících dvou zástupných cifer je ještě kostrbatější. Sedmička otočena vzhůru nohama připomíná literu L. Devítka má na pravé straně oblouk, podobně jako písmeno D. Žádnou slávu neznamená ani fonetická podobnost začátků slov čko - Devítka...

Pozn.: Pokud by někdo za náhradu písmen I-V-X-L-C-D-M preferoval jiná čísla, než 1-5-2-7-3-9-4, může program v tomto ohledu modifikovat velmi snadno. Podprogram na adrese R269 (symbolicky označený sub_sromt) vrací jako sortiment náhrad číslo 4937251. Může však vracet libovolné jiné sedmiciferné číslo neobsahující nulu.

Rozlišení vstupní hodnoty

Dalším úskalím v případě HP-35s je nemožnost rozlišení vstupní hodnoty. Tady nelze nějakým způsobem otestovat typ objektu v X-registru RPN stacku. Je tam prostě nějaké číslo a basta. I kdyby tam bylo něco jiného (komplexní číslo nebo vektor), nebude jednoduché to rozlišit. Nejjednodušším řešením bylo rozdělení číselného oboru na dvě poloviny:

  1. čísla větší než nula budou chápána jako arabská,
  2. čísla menší než nula budou vyhrazena pro římskou notaci.

Stavba programu

Navzdory očekávání vzorem pro RPN program nebyla UserRPL verze, ale zbývající dvě podoby: v jazyku C a v assembleru (všechny zmíněné v Předmluvě). Pokud tímto konstatováním někdo zůstal zcela nevzrušen, nesetrvá v takovém blazeovaném stavu dlouho. Stačí si uvědomit, že veškeré bitové (nebo nibbleové) posuny a logické operace AND/OR jsou zde nahrazeny exponenciální funkcí 10 x, různým násobením, dělením a oddělování tu celé jindy desetinné části čísel. Výsledek tomu odpovídá: program je neúměrně dlouhý (to rozhodně nepotěší - por. Hamáček neměl tak úplně pravdu :-) a jeho provádění trvá naprosto nesmyslně dlouhou dobu. Ale o to naštěstí nejde - času na blbosti máme dost a "pětatřicítka" má paměti na rozdávání!

Program má dvě hlavní větve. Podle očekávaní to jsou PŘEVOD A→R a PŘEVOD R→A. Kromě toho je na úplném začátku rozskok podle typu vstupní hodnoty a na samém konci lze nalézt shluk podprogramů využívaných oběma hlavními větvemi. Převod A→R v podstatě kopíruje funkci a2r() z modulu roman.c. Opačný převod R→A vychází z funkce r2a2(), k vidění je v r2a2.c. Následující odstavce upozorňují na zvláštnosti těchto programových bloků. Před začátkem těchto odstavců je třeba vyzdvihnout důležitý fakt: Celý program používá jedinou statickou/globální proměnnou (nebo postaru paměťový registr) - I. Ostatní mezivýsledky jsou ukládány v obou hlavních větvích odlišně.

PŘEVOD A→R je tím jednodušším z dvojice převodů. V RPN realizaci je počet lokálních proměnných nižší, než naznačuje zmiňovaná funkce a2r(), předobraz tohoto řešení. Proměnné divisor, sidx a ridx zde nemají ekvivalent. Poli result[] odpovídá proměnná I. Ostatní mezivýsledky jsou sdruženy (a USCHOVÁNY) do vektoru, který je ve výpisu programu označen identifikátorem SAFE, a stále se "potlouká" někde v RPN stacku. Hodnoty ve vektoru jsou:
c . . . . . Aktuální cifra ze zadání. Je to cifra nejvyššího řádu.
v . . . . . Zbývající hodnota (bez cifry c).
k2 . . . . Kvadrát dekadického násobku nejvyššího řádu. (Na jeden dekadický řád připadají dvě římské cifry.)

PŘEVOD R→A je složitější a tomu odpovídají i zvýšené nároky na počet lokálních proměnných. Zde jejich počet a účel takřka kopíruje obsah funkce r2a2(): aidx, pidx, less a dvě pole addt a subt nemohou být vměstnány ani do dvou vektorů, natož ponechávány na RPN stacku. Ke slovu se nutně musela dostat u jiných kalkulátorů ne zcela obvyklá vlastnost: "bazén" (v originále pool) plný bezejmenných, nepřímo adresovatelných registrů. Zde je jejich obsazení:

Index/adresa 0 1..4 5..8 9 10 11 12
Význam římská cifra addt[] subt[] less předchozí index zbývající hodnota zadání

Pozn.: Využití nepřímo adresovatelných registrů vysvětluje, proč jedinou veřejnou proměnnou v celém programu není třeba R, ale právě I (ještě tak J by přicházelo v úvahu :-).

Pozn.: Program v módu R→A zabere prvních 13 bezejmenných registrů bez ohledu na jejich možné aktuální zaplnění. Testovat zaplněnost "bazénu" registrů pro stanovení bázové adresy by bylo asi samoúčelné. Premisa ať si každý program dělá co chce bez ohledu na ostatní přináší nezanedbatelnou výhodu: bázová adresa bude vždy 0. Po ukončení běhu programu (úspěšném i havarijním) je alokované místo použitých registrů uvolněno (viz podprogram r2a_clean).

Chybová hlášení

Při nesprávně zadané vstupní hodnotě (příliš velké číslo při převodu A→R, neznámé zástupné znaky, nesprávné pořadí znaku atd. v případě R→A) zobrazí displej HP-35s dvě hodnoty. V Y-registru RPN stacku je nezměněné zadání, v X-registru je chybová hodnota. Pozná se podle toho, že je to číslo s desetinnou částí. Celá část určuje index (dekadický řád, pořadí) chybného znaku v zadání. Desetinná část rozlišuje chybu. Významy jsou zachyceny v následující tabulce:

Převod Hodnota Význam
A→R 0.1 Zadaná hodnota je mimo rozsah 1 až 3999
R→A 0.2 Neznámá římská cifra
0.3 Neočekávaná římská cifra
0.4 Příliš mnoho předchozích římských cifer stejného řádu

RPN program

  

ADDRCODEXYZTI
Vstupní bod pro obě varianty převodu
R001LBL RA nebo R



R002IPvždy celé číslo



R003x=0?chybné zadání?



R004RTN-ano



R005x<0?je to R→A?



R006GTO R090 r2a_start-ano



PŘEVOD A→R
v = hodnota,  c = cifra,  k = dekadický násobek,  d = římská cifra
R0074E34000v


R008x>=y?je zadání v rozsahu?



R009GTO R013 a2r_rng_ok-ano



CHYBA: mimo rozsah
R010CLx0v


R0110.10.1v


R012RTN




*** a2r_rng_ok *** Zadaná hodnota je v rozsahu
R013CLx0v


R014STO I0 → výsledekv


R015R↓v



*** a2r_req_lp *** Cyklus přes všechny cifry zadání
R016XEQ R245 sub_get_msdvkcc
R017x<>ykvcc
R018k2vcc
SAFE = [c,v,k2]
R019[REGZ,REGY,REGX]SAFEk2vc
R020R↑cSAFEk2v
R02122cSAFEk2
R022x<>yc2SAFEk2
R023yx1 << cSAFEk2

R0245281 << 4 | 1 << 91 << cSAFEk2
R025AND(test)SAFEk2

R026x=0?je to 4 nebo 9?



R027GTO R045 a2r_other-ne



Cifry 4 nebo 9
R028R↓SAFEk2


R029XEQ R269 sub_sromtsromt[]SAFEk2

R030REGZk2sromt[]SAFE

R031XEQ R260 sub_get_by_kdk2SAFE

R032XEQ R084 a2r_res_addk2SAFE


R033REGYSAFEk2SAFE

R034[1,0,0][1,0,0]SAFEk2SAFE
R035×c: 4 nebo 9k2SAFE

R03644ck2SAFE
R037INT÷1 nebo 2k2SAFE

R03810xq: 10 nebo 100k2SAFE

R039×q k2SAFE


R040XEQ R269 sub_sromtsromt[]q k2SAFE

R041x<>yq k2sromt[]SAFE

R042XEQ R260 sub_get_by_kdk2SAFE

R043XEQ R084 a2r_res_addk2SAFE


R044GTO R076 a2r_contk2SAFE


*** a2r_other *** Ostatní cifry kromě 4 nebo 9
R045CLx0SAFE


R046[0,0,1][0,0,1]SAFE


R047REGYSAFE[0,0,1]SAFE

R048×k2SAFE


R049[1,0,0][1,0,0]k2SAFE

R050REGZSAFE[1,0,0]k2SAFE
R051×ck2SAFESAFE
R05244ck2SAFE
R053-c - 4k2SAFESAFE
R054x<0?1..3?



R055GTO R063 a2r_oth_13-ano



Cifry >= 5
R056[-4,0,0][-4,0,0]?k2SAFE
R057R↑SAFE[-4,0,0]?k2
R058+SAFE (c-=4)?k2k2
R059R↑k2SAFE


R0601010k2SAFE

R061×10 k2SAFE


R062R↑?10 k2SAFE

*** a2r_oth_13 *** Pokračování po zpracování cifer >= 5
R063R↓q k2SAFE


R064XEQ R269 sub_sromtsromt[]q k2SAFE

R065x<>yq k2sromt[]SAFE

R066XEQ R260 sub_get_by_kdq k2SAFE

R067XEQ R084 a2r_res_addq k2SAFE


R068CLx0SAFE


R069[1,0,0][1,0,0]SAFE


R070-SAFE (--c)



R071LASTx[1,0,0]SAFE


R072REGYSAFE[1,0,0]SAFE

R073×cSAFE


R074x>0?daší znak?



R075GTO R045 a2r_other-ano



*** a2r_cont *** Pokračování po zpracování jedné cifry
R076CLx0SAFE


R077[0,1,0][0,1,0]SAFE


R078×v



R079x!=0?je tam další cifra?



R080GTO R016 a2r_req_lp-ano



Cifry došly, je třeba zobrazit výsledek
R081RCL I




R082+/-výsledek



R083RTN




*** a2r_res_add *** Zařazení cifry do výsledku :: (c) → ()
R0841010d?1?2
R085STO× I10d?1?2
R086R↓d?1?2

R087STO+ Id?1?2

R088R↓?1?2


R089RTN




PŘEVOD R→A
v = hodnota,  d = římská cifra,  k = dekadický násobek,  i = aktuální index (k = 10^i),  p = předchozí index,  e = chybová hodnota
s = sromt[] s postupným odebíráním,  f = cifra ze sromt[]
I[0] = d,  I[1..4] = addt[],  I[5..8] = subt[],  I[9] = less,  I[10] = p,  I[11] = v,  I[12] = zadání
*** r2a_start ***
R09012&zadánízadání


R091STO I&zadánízadání

12
R092R↓zadání



R093STO (I)zadání → I[12]



R094+/-v



R095DSE II - 1 → I


11
R096STO (I)v → I[11]



R0977pv


R098DSE II - 1 → I


10
R099STO (I)p → I[10]



R100DSE II - 1 → I


9
(Předchozí 3 DSE nikdy nezpůsobí přeskok následující instrukce)
Vynulovat "addt[]", "subt[]" a "less"
R101CLx0v

9
R102STO (I)0 → I[]v


R103DSE Ivynulováno?



R104GTO R102-ne



R10511&v0v
0
R106STO I&v0v
11
R107REGZv



*** r2a_req_lp *** Cyklus přes všechny cifry zadání
R108XEQ R245 sub_get_msdvkdd11
R109STO (I)v → I[11]



R110CLx&dkdd
R111STO I&dkdd0
R112R↑d



R113STO (I)d → I[0]



R114XEQ R269 sub_sromts



*** r2a_srom_lp *** Cyklus přes všechny cifry "sromt[]"
R115XEQ R245 sub_get_msdskff0
R116RCL (I)d ← I[0]skf
R117R↑fdsk
R118x=y?je to tahle cifra?



R119GTO R141 r2a_srom_fnd-ano



Zkusit další cifry, jsou-li nějaké
R120R↓dsk

R121R↓sk


R122x!=0?je v čem hledat?



R123GTO R115 r2a_srom_lp-ano



CHYBA: neznámá římská cifra
R1240.20.e



CHYBA: VSTUPNÍ BOD
*** r2a_exit ***
R12512&zadání0.e


R126STO I&zadání0.e

12
R127R↓0.e



R128RCL (I)zadání ← I[12]0.e


R129x<>y0.ezadání


R130DSE I0.ezadání

11
R13110




R132RCL× (I)v ← I[11]×100.ezadání

R13300v0.ezadání
R134STO I&dv0.ezadání0
R135R↓v0.ezadání

R136RCL+ (I)v ← v+I[0]0.ezadání

R137LOGlog(v)0.ezadání

R138IPi0.ezadání

R139+i.ezadání


R140GTO R219 r2a_clean




*** r2a_srom_fnd *** Nalezena cifra ze zadání v "sromt[]"
R141R↑k



R142LOGi



R14310&pi


R144STO I&pi

10
R145R↓i



R146x<> (I)p ↔ I[10]



R147ENTERpp


R148RCL- (I)p - ip


R14911p - ip

R150RCL (I)i ← I[10]1p - ip
R151R↓1p - ipi
R152-p - i - 1pii
R153SGNsign(p - i - 1)pii
R154x>0?je > 0?



R155CLx-ano, vynulovat



smask  =  i <= p  ?  -1  :  0;
R156DSE Ismaskpii9
R157RCL (I)less ← I[9]smaskpi
R158x<>ysmasklesspi
R159-less - smaskpii
R160LASTxsmaskless - smaskpi
R161ANDlesspii
R162STO (I)less → I[9]



less  =  i <= p  ?  less + 1  :  0;
R16333lesspi
R164-less - 3pi

R165x>0?less > 3?



R166GTO R177 r2a_unexpect-anopi

Počet stejných nebo menších předchozích římských cifer není větší než 3
R167R↓pi


R168x<>yip


R169x<=yi <= p?



R170GTO R190 r2a_lesseq-ano



Aktuální římská cifra je větší než předchozí
R171R↓p



R172RCL (I)less ← I[9]p


R17311lessp

R174-less - 1p


R175x<=0?less <= 1?



R176GTO R179 r2a_sub1-ano



Více než 1 cifra pro odečtení
CHYBA: neočekávaná římská cifra
*** r2a_unexpect ***
R1770.30.e



R178GTO R125 r2a_exit




*** r2a_sub1 *** Odečítá se nejvýš 1 předchozí cifra (IX = 10 - 1)
R179R↓p



R180XEQ R237 r2a_get_ordaddt[_ORD]


&addt[_ORD]
R18100addt[_ORD]


R182STO (I)0 → I[1+_ORD]



R1834&subt[]-&addt[]0addt[_ORD]

R184STO+ I?0addt[_ORD]
&subt[_ORD]
R185REGZaddt[_ORD]



R186STO (I)addt[] → subt[]



R18710&i



R188STO I&i


10
R189RCL (I)i ← I[10]



*** r2a_lesseq *** Pokračování po obsluze menší předchozí římské cifry
R190ENTERii


R191XEQ R237 r2a_get_ordaddt[_ORD]i

&addt[_ORD]
R192x<>yiaddt[_ORD]


R19311iaddt[_ORD]

R194ANDi & 01addt[_ORD]


R19544i & 01addt[_ORD]

R196×(idx & 01) << 2addt[_ORD]


R197101(idx & 01) << 2addt[_ORD]

R198OR_INCaddt[_ORD]


inc  =  (idx & 001) << 2  |  001;
R199+addt[_ORD] + _INC



R20099addt[_ORD]


R201x>=y?addt[_ORD] < 9?



R202GTO R205 r2a_final-ano



CHYBA: přiliš mnoho předchozích římských cifer stejného řádu
R2030.40.e



R204GTO R125 r2a_exit




*** r2a_final *** Římských cifer stejného řádu je přiměřené množství
R205R↓addt[_ORD]


&addt[_ORD]
R206STO (I)addt[_ORD] → I[]



R20711&v



R208STO I&v


11
R209RCL (I)v ← I[11]



R210x!=0?je tam další cifra?



R211GTO R108 r2a_req_lp-ano



Římské cifry došly, je třeba vypočíst a zobrazit výsledek a zahladit stopy
R2124LCN


4.000
R213XEQ R228 r2a_get_valaddt[]



R2148.004LCNaddt[]

8.004
R215XEQ R228 r2a_get_valsubt[]addt[]


R216-výsledek



R21700výsledek


R218x<>yvýsledek0


*** r2a_clean *** Vynulování (uvolnění) použité paměti :: (x, y) → (x, y)
R2191212X-regY-reg

R220STO I12X-regY-reg
12
R221CLx0X-regY-reg

R222STO (I)0 → I[]X-regY-reg

R223DSE Ivynulováno?



R224GTO R222-ne



R225STO (I)0 → I[0]X-regY-reg
0
R226R↓X-regY-reg


R227RTN




*** r2a_get_val *** Vyčtení hodnot v "addt[]" nebo "subt[]" :: (LCN) → (value)
R228STO ILCN?


R229R↓?



R23000 → v?


R2311010v?

R232×10 v?


R233RCL+ (I)10 v + c?


R234DSE Ihotovo?



R235GTO R231-ne



R236RTNvalue?


*** r2a_get_ord *** Zjištěni "_ORD" podle indexu :: (i) → (addt[_ORD])
R23722i?

R238INT÷_ORD?


R2391&addt[]_ORD?

R240+&addt[_ORD]?


R241STO I&addt[_ORD]?

&addt[_ORD]
R242R↓?



R243RCL (I)addt[_ORD]?


R244RTN




SPOLEČNÉ PODPROGRAMY
v = hodnota, c = cifra, X = libovolná cifra, k = dekadický násobek, n = nová hodnota
*** sub_get_msd *** Vyjmutí nejvyšší cifry :: (v) → (v, k, c)
R245ENTERvv


R246ENTERvvv

R247LOGlog(v)vv

R248IPdekadický řádvv

R24910xkvv

R250XEQ R260 sub_get_by_kckvv
R251REGYkckv
R252x<>yckkv
R253×c kkvv
R254R↑vc kkv
R255x<>yc kvkv
R256LASTxcc kvk
R257R↓c kvkc
R258-v - c k → v



R259RTNvkcc
*** sub_get_by_k *** Vyčtení cifry dané dekadickým násobkem :: (k, v) → (c, k)
R260INT÷XXXc.0?


R261LASTxkXXXc.0?

R262x<>yXXXc.0k?

R2631010XXXc.0k?
R264÷XXX.ck??
R265FP0.ck??
R26610100.ck?
R267×ck??
R268RTN




*** sub_sromt *** Tabulka "sromt[]" :: () → (sromt[])
R2694937251sromt[]



R270RTNs



LN=944, CK=84E2

Použití programu:
Stisk klávesČinnostDisplay
1 9 7 8 zadání 0.0000
1978_
XEQ R ENTER spuštění programu
RUNNING
výsledek... 0.0000
-4,347,225,111.00
XEQ R ENTER ...použit jako zadání
RUNNING
výsledek 0.0000
1,978.0000
4 5 6 7 chybné zadání 1,978.0000
4567_
XEQ R ENTER spuštění programu
RUNNING
chybové hlášení 4,567.0000
0.1000
2 7 8 5 1 1 +/-další chybné zadání 0.1000
-278511_
XEQ R ENTER spuštění programu
RUNNING
chybové hlášení -278,511.0000
3.2000
2 7 5 1 1 +/- správné zadání 3.2000
-27511_
XEQ R ENTER spuštění programu
RUNNING
výsledek 0.0000
47.0000


Závěr

  

Prezentovaný program je bezkonkurenčně nejnepoužitelnější z toho, co stránky RPNmania nabízejí. Všechny předchozí tvořily více či méně roztomilé krátké ukázky, které bylo snadné do kalkulátoru zadat a doba jejich provádění byla tak krátká, že kalkulátorův uživatel se ani nestihl začít nudit. Zato tenhle moloch! Hanba mluvit... Ale nad tím by se dalo mávnout rukou, kdyby ten program byl alespoň trochu použitelný. V praktické použitelnosti snad nebrání dlouhá doba výpočtu. Ani nahrazení písmen číslicemi by tolik nevadilo. Hlavní nevýhodou programu je to, že ve stanoveném rozsahu 1..3999 nelze ani zadat ani zobrazit všechna čísla v římské notaci! Maximální počet cifer mantisy u HP-35s je 12. Nejdelší římské číslo je 3888 = MMMDCCCLXXXVIII, tedy řetězec o délce 15 znaků. Vzhledem k charakteru zápisu římských čísel nelze ani stanovit souvislý rozsah číselné hodnoty vyjádřený čísly arabskými. Ověřit si správnost obou převodů lze opakovanými převody tam a zpět. Pokud se při opakovaném převodu dosáhne hdonoty shodné se zadáním, je vše v pořádku. V opačném případě má uživatel smůlu a zbývá mu poslední možnost: přestat blbnout a vytáhnout HP-50g.

Pozn.: Samozřejmě by bylo možné čísla římské notace s délkou větší než 15 znaků rozdělit do dvou či více hodnot. Ale to už by byla magořina dalece přesahující zdejší poměry. Obzvláště zadávání takového vstupního údaje by pro obsluhu mohlo být velmi dobrodružné!

Jistě se někomu bude zdát pošetilé vytváření programů, které už z principu nemohou plnohodnotně fungovat. V tom však není hlavní problém stránek RPNmania. Na hranici použitelnosti (ne-li hluboko pod ní) je všechno, co je zde prezentováno, i když to regulérně funguje. Na zřeteli je však třeba mít důležitou myšlenku: O funkčnost ani užitečnost zde nikdy nešlo! Proč tedy celé to běsnění? Je to přece "čelinž", ne?!