Hlavní navigace

Názor k článku Deset největších softwarových chyb v historii lidstva od Nezůčastněný - Ono to s těmi čísly nebude nikdy vyřešeno,protože...

Článek je starý, nové názory již nelze přidávat.

  • 28. 10. 2010 21:07

    Nezůčastněný (neregistrovaný) 88.146.221.---

    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.45678901234­56789 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.