Fórum Root.cz
Hlavní témata => Software => Téma založeno: Xjmeno363 15. 01. 2011, 20:44:55
-
Ahoj,
snažím se zjistit, zda je v BC chyba ve výpočtu, nebo je chyba mezi klávesnicí a židlí.
Mám číslo v double IEEE 754: např. pi 3.1415926 -> uloženo jako 400921FB4D12D84A
po převodu by mělo být:
exponent: 2^1 (400)
a mantisa 1.5707963000000000 (1+.921FB4D12D84A)
kontrola např.: http://babbage.cs.qc.edu/IEEE-754/64bit.html
jenže když pomocí bc zkusím převod:
echo 'ibase=F;obase=2;1.921FB4D12D84A' | bc
tak vychází:
1.10011100000001101010100101000011110100010101
mělo by ale správně vycházet:
1.1001001000011111101101001101000100101101100001001010
tedy od 5. bitu špatně! (to je sakra velká nepřesnost)
navíc zpětný převod ukazuje, že to nesedí:
echo 'ibase=F;obase=2;.921FB4D12D84A' | bc
echo 'ibase=2;obase=F;.10011100000001101010100101000011110100010101' | bc
=.921EB4D12D7B780E538108E815B38920E69E42
tedy od EB...
je chyba u mě, že dělám něco blbě, nebo programátoři bc nezvládli převod do zlomkové části?
-
Hned prvni non-bug je tvuj pripad.
http://gcc.gnu.org/bugs/#nonbugs
-
F je 15, nema tam byt ibase=G (alebo ibase=16) namiesto ibase=F?
-
Re Hostovi: man bc tvrdi, ze je to "a language that supports arbitrary precision numbers ...", necekal bych ze by byl interne pouzity omezeny datovy typ.
-
2host
taky se mi to nezdá, protože kdyby byl v bc použit výpočet založený na double (i single) tak by chyba nebyla na 5. pozici, ale až někde na 13+. Navíc si myslím, že v bc mají vlastní algoritmus - mám totiž za to, že si lze předepsat přesnost třea na 1000 míst (teď už si nepamatuji jak se to dělalo)
-
Zkus
echo 'ibase=16;obase=2;.921FB4D12D84A' | bc
Luinar
-
dík, to je ono. Já bych se....a to jsem si jistý, že jsem to zkoušel
navíc koukám, že záleží na pořadí:
echo 'ibase=2;obase=16;1.10010010000111111011010011010001001011011000' | bc
dělá něco jiného než
echo 'obase=16;ibase=2;1.10010010000111111011010011010001001011011000' | bc
holt pořád mě bc překvapuje
dodatek:
je to vlastně také správně, protože ibase předepisuje formát i pro obase , které je uvedeno až za ním...
neznám lepší kalkulačku...
-
Ja bych spis doporucoval calc nebo GMP.
-
a umí některých z nich převádět desetinná čísla mezi soustavami? To je pro většinu SW problém na kterém si vylámou zuby. viz:
-0.3AB112e-FB -> Dec. apod.
-
GMP myslim vie kazdu sustavu od dvojkovej po 63
-
echo 'ibase=2;obase=10;11'| bc
11
echo 'ibase=2;obase=1010;11'| bc
3
Sranda :)
-
echo 'ibase=2;obase=10;11'| bc
11
echo 'ibase=2;obase=1010;11'| bc
3
Sranda :)
Však je to dobře. ibase=2;obase=10 znamená, že vstupní soustava je dvojková, výstupní také dvojková. Tedy 11 je opět 11.
ibase=2;obase=1010 znamená, že vstupní je dvojková, výstupní desítková. Tedy 11 se převede na 3.