* CAD CATIA ... pri prepisu tohodle CAD/CAM systemu z unixu a fortranu do windows a C++ ... coz je double error ;-)) samozrejme spatne vypocty, spadlo letadlo, nastesti prototyp ... chyby dvojiho druhu:
1. pri samotnem prepisu, preci jen fortran prepisuje jen idiot (zde byl duvod chybejici spolehlive implemenatce f77 do windows) a samotneho microsoftiho c++ ktere taktez neumelo pocitat ... tak IBM udelala visualAGE c++ ... windows totiz neumi pocitat dodnes a na vypocty je terba tahat knihovny z unixu ... coz dela matehmatica, mapple etc.
* Chyba windows NT malem potopila lod, zde se jednalo o prostou BSOD a nutnost ji preisntalovat
* Chybne pocitani v metricke a palcove soustave zavina zniceni linuxoveho lunarniho vozitka poslaneho na mars ... pri pristavani se rozsekal a nebyl schopen se pohybovat
* Chyba ve win NT v3.x -4.sp* ... znicili pri instalaci OS/2 HPFS part, na ktere byl OS ... normlene tomu prekopala strukturu, tak, ze to neslo uz nicim obnovit ... a ja se divil, proc skoro 1 hod sroti disk a nic nedela, tuhle chybu povazuji za hackersky utok na moji osobu a od te doby je M$ muj osobni nepritel, nikdy jim tento utok neodpustim a jejich OS od te doby testuji jiz vyhradne ve virtualu a nikdy jej nenasadim na dulezite veci ... ani na moje domaci data.
* Chyba v exelu ... exel neumi scitat a to ani bezna cisla, kde je max. 1 desetinne cislo ... kdyz se dostanou do urcitych mezi, je treba zaokrouhlovat, nebot na nejakem 10. des. miste, i kdyz tam zadna takova cislice neni, vznikne chyba, clovek to pozna jen tak, ze da porovnavat stejna cisla ... chyba je zavisla na poctu scitanych cislech a na rozsahu, pritom rozsah je nekde v radu deseti tisicu ... tedy to nechapu ... dusledky:
spatne vypocty mnoha ekonomu, kteri misto profi nastroju pouzivaji exel, nebo statistiku ;-))
To je problem Excelu, protoze se v nem pouzivaji formaty podle IEEE 754, ktere vubec nejsou vhodne napriklad pro vypoctu s penezi atd. Mel by se pouzit fixed point popr. pro mnoho aplikaci by byly jeste vyhodnejsi zlomky, coz je sice trosku pomalejsi, ovsem mnoho problemu se tim odstrani (nebo jsou lepe predikovany).
Starsi Excely (nove neznam :-) mely napriklad problem s nasledujicim skriptem, schvalne si muzete zkusit tipnout, co vyjde, jestli skutecne jednicka:
Sub Main()
MySum = 0
For I% = 1 To 10000
MySum = MySum + 0.0001
Next I%
Debug.Print MySum
End Sub
Na BASIC mi nešahej, není to zdaleka jen jeho problém. Právě jsem zkusil v C tohle:
int i;
float n;
for(i=0,n=0;i<10000;++i,n+=.0001);
printf("%f\n",n);
a vyšlo mi 1.000054! Původní VisiCalc právě z tohohle důvodu počítal v BCD, takže chyba je rozhodně v Excelu, když počítá binárně ;-)
Ono to s těmi čísly nebude nikdy vyřešeno,protože počítače v podstatě
nepoužívají a neukládají čísla v desítkové soustavě.
Desetinné číslo které má určitý konečný počet míst se ve vnitřním formátu
čísel počítače vlastně ukládá v jiné číselné soustavě kde zákonitě pro některá desetinná čísla není počet míst konečný a ty nejnižší řády se prostě ztratí.
Takže některá desetinná čísla která ručně vložíte a následně přečtete nebudou stejná! Takže pokud blbě napíšete program který bude například desetiná čísla porovnávat a v závislosti na shodě či neshodě bude provádět různé věci tak se budete divit.
Řešení je triviální,stačí požít buď omezený počet míst za desetinnou čárkou nebo celočíselnou část.
Zaokrouhlení není dobrý nápad protože vnese další nepředvídatelnou změnu čísla. Např 0.5 versus 0.4, že?
Pro tento účel počítače a programovací jazyky disponují několika různými
formáty čísel např: celočíselná, reálná s celočíselnou a desetinou částí, jen desetinná, exponenciální a s čísly s různou pevně danou délkou.
Tyto čísla mají rozdílný vnitřní formát a lze je mezi sebou vzájemně převádět.
Ale pozor totéž číslo vložené do různého formátu čísla nedoporučuji porovnávat
na vzájemnou shodu,asi už víte proč.
Další lahůdka je přičítání příliš malých čísel k příliš velkým, možná že už chápete v čem je problém. Čísla mají omezený konečný počet číslic pro celočíselné i desetiné místa.
např. 1234567890.0123456789...... formát čísla s 20 platnými číslicemi
+ 123.4567890123456789 rovněž z 20 číslicemi
Je zřejmé že se čílice 456789 už nemají kam přičíst.
Takže pokud napíšete program který bude postupně sčítat obrovské množství
malých desetiných čísel nebude zpočátku chyba patrná ale jak se součet
bude zvětšovat bude chyba postupně narůstat až se nakonec nebude vůbec nic
přičítat. Například v bance by tohle udělalo docela chaos, že?
Řešení je triviální, je třeba dělat mezisoučet malých položek a ten občas
přičíst k celkovému součtu.
Doufám že sem neobtěžoval, děkuji za pozornost.