Díky za článek.
Chápu správně, že zatímco u celých čísel s neomezenou přesností prostě provádím operace a číslo je "přesně", u toho dnešního si předem musím manuálně nastavit chtěnou přesnost a je na mně aby se počítalo "dostatečně přesně", přičemž "neomezeně přesně" to třeba u zlomků s nebinárním jmenovatelem stejně nebude nikdy?
S tím, že systém bez uzardění vypísuje i cifry za hranicí přesnosti (viz ten příklad s 1/99, která není .01 periodicky).
Mimochodem, kdy dojde k tomu že big.Float.Rat dá něco neexaktního (above nebo below)? Ten zlomek se přeci dá udělat exact, ne?
Ten Float má “nekonečnou” přesnost, ale pořád (logicky) konečnou reprezentaci, takže se chová stejně jako normální float64, akorát si drží více “sigfigs” (něco jako float1024 například). V některých jazycích jdou naprosto přesně reprezentovat i iracionální čísla (e, π…), ale to jsou specializované jazyky pro matematiky, ne pro běžné počítání.
pokud bude jeste dil o decimalu,
tak dobrou zkusenost mam s github.com/ericlagergren/decimal
i kdyz ma to api takove ... clovek si musi zvyknout
naopak u github.com/shopspring/decimal jsem narazil na problem s funkci BigFloat(), kde provadi prevod pres string, coz u velkych cisel nebylo uplne idealni:)
28. 4. 2023, 14:42 editováno autorem komentáře
Prepsal jsem si program z kapitoly 4 pro opakovane nasobeni x(n) = x(n-1)*99 do Forthu a zkompiloval do assembleru a spustil na ZX Spectru a vysledky byly jinak.
V clanku:
99 9801 970299 96059601 9509900499 941480149401 93206534790699 9227446944279200 !!! 913517247483640832 90438207500880445440 8953382542587163836416 886384871716129238679552 87752102299896794226622464 8687458127689782216118763520 860058354641288373425059921920 85145777109487544324743816544256 8429431933839266852120840818917376 834513761450087363019731019944165376 82616862383558650267118944281560088576 8179069375972306130881718374652897656832 809727868221258357732174542905062205685760 80163058953904576641772755194238486550937600
Jake bylo me prekvapeni, kdyz jsem zjistil ze to asi mam spravne a spatne je to ve vypisu ukazky...
Uz u sedmeho nasobeni vysledek konci ...201 a ne 200.
93 206 534 790 699 × 99 = 9 227 446 944 279 201
9 227 446 944 279 201 × 99 = 913 517 247 483 640 899
atd.
M4 Forth: https://pastebin.com/PvY3EDri
Asm: https://pastebin.com/z2Rv1fvr
Prvne jsem myslel ze jsi vyzkousel znovu ten program, ale pak si vsimnul ze tam mas "integer" a ne "float". Pak me doslo, ze ani nevim i kdyz je to citelne co je to vlastne z jazyk! C to neni, ani nic co z C vzeslo. Awk, Bash, Forth, Python, ZX Spectrum basic, QBasic, Boriel Basic, Visual Basic, Pascal, BrainF*ck, Perl... proste nic v cem jsem se kdy aspon trochu vrtal.
Julia?
PS: Jinak ze je ten vypis spatne mohlo trknout vsechny i bez kalkulacky, protoze jak se jednou dostane nula na konec, tak nejde pomoci nasobeni odstranit. Nuly jen pribivaji...
Ještě jedna varianta :)
def main : IO Unit := do let mut x := 1. let y := 99. for _ in [:10] do x := x * y IO.println s!"{x}"
Jinak ty "chybné" výsledky jsou prostě jen důsledek použití přesnosti float64
.
99.000000
9801.000000
970299.000000
96059601.000000
9509900499.000000
941480149401.000000
93206534790699.000000
9227446944279200.000000
913517247483640832.000000
90438207500880445440.000000