Diskuze: Chyba ve výpočtu

Ostatní jazyky Petr Lite Petr Chyba ve výpočtu

Avatar
jargry
Člen
Avatar
jargry:

Dobrý den,
v jedné aplikaci jsem zjistil, že 10,1-10 není 0,1. Dala by se tato chyba v PETROVI nějak opravit?

 
Odpovědět 7.6.2012 19:34
Avatar
matesax
Redaktor
Avatar
Odpovídá na jargry
matesax:

Odzkoušeno - funguje - můžeš upřesnit?

 
Nahoru Odpovědět 7.6.2012 22:06
Avatar
Panda38
Redaktor
Avatar
Odpovídá na jargry
Panda38:

To není chyba, to je princip počítání s desetinnými čísly v matematickém koprocesoru. Čísla (i desetinná) se v procesoru vyjadřují v binární soustavě, pomocí binárních zlomků (např. 0.75 = 1/2 + 1/4). Číslo 0,1 se nedá vyjádřit přesně, v binární soustavě obsahuje nekonečný počet desetinných (binárních) číslic. Přesnost koprocesoru je asi 18 dekadických číslic (exponent + mantisa). Proto když od čísla 10,1 odečtete hodnotu 10, posune se řád a v mantise se objeví někde na 18. pozici chyba. Výsledek se tak liší od hodnoty, která by vznikla přímým zadáním čísla 0,1.

Nebo zkráceně - při výpočtech s desetinnými čísly v reálném procesoru vznikají na vzdálených desetinných místech chyby, kvůli kterým se nedají výsledky porovnávat přesně na shodu. Je možné přesně porovnávat jen operace s celými čísly. Např. 101 - 100 = 1, to funguje. Desetinná čísla se musí vyhodnocovat pomocí intervalu, např. 0,09999999 < n < 1,000000001.

Je to běžný problém, se kterým musí programátoři počítačů počítat když pracují s desetinnými čísly. Tento problém by nevznikal u procesorů s dekadickou matematikou, kde se desetiny vyjadřují přesně číslicemi - ale takové matematiky se nepoužívají, protože by byly mnohem pomalejší.

 
Nahoru Odpovědět  +2 7.6.2012 22:11
Avatar
Panda38
Redaktor
Avatar
Odpovídá na jargry
Panda38:

Při zobrazení se chyba neobjeví. Číslo 10,1 je ve skutečnosti uloženo v procesoru např. jako údaj 10,0999999999­9999998 a číslo 0,1 jako např. 0,10000000000­000005. Při zobrazování údaje se hodnota zaokrouhluje na nějaký počet číslic, v Petrovi je to na 15 platných číslic, proto se tato zaokrouhlovací chyba při výpisech neobjeví.

Ještě jedna možnost porovnávání je - převést číslo na text a pak porovnávat texty, pak bude platit, že str(10,1 - 10) = str(0,1). To by bylo asi nejjednodušší obejítí zaokrouhlovacích problémů.

 
Nahoru Odpovědět 7.6.2012 22:16
Avatar
jargry
Člen
Avatar
jargry:

Dobrý den,
děkuji za vysvětlení. Když něco zkouším, tak si výsledky zobrazuji v informačním řádku, byl jsem z toho vedle, když se mi místo 0,1 objevilo 0,9 pak ještě moc devítek a na konci 7. Zatím jsem nepožádal o redaktorská práva, časem dám ukázku, aby i ostatní věděli co jsem měl na mysli.

 
Nahoru Odpovědět 10.6.2012 20:09
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.