Hlavní navigace

Vlákno názorů k článku Perličky: přetěžování operátorů od lol - hmm... jak skusam, tak skusam... ale: perl -e '$a=1.7;...

  • Článek je starý, nové názory již nelze přidávat.
  • 29. 8. 2008 3:31

    lol (neregistrovaný)
    hmm... jak skusam, tak skusam... ale:

    perl -e '$a=1.7; $a+=0.2; printf "%.65f\n%.65f\n", $a, 1.9;'
    1.89999999999999991118215802998747676610946655273437500000000000000
    1.89999999999999991118215802998747676610946655273437500000000000000

    najprv som myslel ze to je 64 bitovym prostredim, ale
    Linux localhost 2.6.24 #5 SMP Wed Mar 26 04:24:24 CET 2008 x86_64 Intel(R) Xeon(R) CPU E5335 @ 2.00GHz GNU/Linux
    Linux localhost 2.6.26.2 #3 Fri Aug 22 09:47:54 CEST 2008 i686 AMD Duron(tm) processor GNU/Linux
    Linux localhost 2.6.17.8 #2 Thu Aug 10 12:13:53 BST 2006 i686 Intel(R) Celeron(TM) CPU 1200MHz GNU/Linux

    vsade to je rovnake... vsade je perl v5.8.8
  • 29. 8. 2008 6:49

    Michal Svoboda

    Neni to 64-bitovym prostredim, ale reprezentaci cisel, kterou vas perl zvolil. V tomto pripade je to ceckovske 'double' (u mne je to 'long double'). Pokud se podivate na perl -V, tak by v sekci 'Compile-time options' melo chybet USE_LONG_DOUBLE.

    Samozrejme to Vas pred danym fenomenem nezachrani, zkuste treba kombinaci cislel 19,08 a 2,01, ktere by se po secteni "mely" rovnat 21,09. (Tato kombinace zase "nefunguje" s long double.) A stejneho vysledku se dopracujete i v jinych verzich Perlu, i v jinych programovacich jazycich, na jinych PC...

  • 29. 8. 2008 6:58

    lol (neregistrovaný)
    jj je to tak ... perl -e '$a=19.08; $a+=2.01; printf "%.65f\n%.65f\n", $a, 21.09;'
    21.08999999999999630517777404747903347015380859375000000000000000000
    21.08999999999999985789145284797996282577514648437500000000000000000

    velmi zaujimave :)