Diskuze: Chyba ve výpočtu
Zobrazeno 5 zpráv z 5.
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ší.
Při zobrazení se chyba neobjeví. Číslo 10,1 je ve skutečnosti uloženo v procesoru např. jako údaj 10,09999999999999998 a číslo 0,1 jako např. 0,10000000000000005. 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ů.
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.
Zobrazeno 5 zpráv z 5.