Zivan píše:... tak se zobrazi a pricte 0,1. Spravne by se tedy melo zobrazit 0-0,9.
Ne, nemělo. Uvědom si, že počítač počítá ve dvojkové soustavě, a v ní je dělení deseti značně netriviální záležitost, podobně jako bys v té desítkové ručně na papíře dělil třeba sedmnácti.
Na rozdíl od desítkové je totiž binární 1/10 číslo
s nekonečným desetinným rozvojem, podobně jako třeba Pí, ale počítač počítá jenom
s konečnou přesností. Pročež jsem už od konce osmdesátých let v každé dobré učebnici programování
(tehdy v BASICu) četl, že
desetinné číslo se v cyklu přičítat nesmí! A ze stejného důvodu se desetinná čísla také nedají porovnávat pomocí =.
Takže takhle to bude nesprávně v Céčku:
Kód: Vybrat vše
n=0;
while (n<1)
{
n+=.1;
printf("%.16f\n",n);
}
A zcela chybný výsledek vypsaný s vyšší přesností:
Kód: Vybrat vše
0.1000000000000000
0.2000000000000000
0.3000000000000000
0.4000000000000000
0.4999999999999999
0.6000000000000000
0.7000000000000000
0.7999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999
Zatímco správný způsob by byl:
Kód: Vybrat vše
n=0;
while (n<10)
{
n+=1;
printf("%.16f\n",n/10);
}
S očekávaným výsledkem:
Kód: Vybrat vše
0.1000000000000000
0.2000000000000000
0.3000000000000000
0.4000000000000000
0.5000000000000000
0.6000000000000000
0.7000000000000000
0.8000000000000000
0.9000000000000000
1.0000000000000000
Příčinu zjistíš takhle:
Všechny ty výsledky jsou samozřejmě pouze přibližné, protože převodem z dvojkové do desetinné soustavy dochází k dalším odchylkám. Jediný způsob jak se tomu vyhnout je použít jazyk COBOL, určený pro bankovní operace, který počítá desítkově a všechna čísla ukládá v kódu BCD. Ale věř mi že to nechceš, programátoři v COBOLu jsou sice už přes šedesát let placení nejlépe ze všech, ale jsou to krvavě vydřené peníze