PERL NEUMI POCITAT!!!

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Čtvrtek Září 28 13:54:30 CEST 2000


On Wed, 27 Sep 2000, Michal Krause wrote:

> Pokazde jsou to samozrejme takoveto drobne rozdily, ale pokud je to tak
> bezne, pak se ptam, proc tim jine jazyky netrpi?

Eh?

#include <stdio.h>
 
int
main()
{
  float f = 851.9 - 810.2;
  double d1 = 851.9 - 810.2;
  double d2 = 851.9L - 810.2L;
  printf("%.20f  %.20f  %.20f\n", f, d1, d2);
  return 0;
}


Vysledek:

41.70000076293945312500  41.69999999999993178790  41.70000000000000284217

Vtip je akorat v tom, ze vetsinou je vysledek vtipne zaokrouhlen, a tudiz
neni ta chyba videt.

Vysledek z Perlu je 41.6999999999999, coz by odpovidalo situaci, kdy je
prostredni z ceckovych vysledku zaokrouhlen na vhodne mnozstvi desetinnych
cislic. Je pravda, ze to indikuje, ze Perl asi pracuje nekdy s floaty a
nekdy s doubly, nasledkem ceho si presnost vysledku kazi (stejne
nechapu, proc pouzivat float, kdyz uz stejne vsichni maji hw FPU).

> Staci to jenom zkouset. Zvlastni je, ze to obvykle dela jenom odecitani
> dvou blizkych cisel. Vlastne nejvetsi rozdil, pri nemz se to jeste
> projevilo byl okolo jednoho sta.

To zrejme souvisi s tim, ze Perl vlastne nejspis vola pri konverzi
FPN na text funkci gcvt() a jako pocet cislic zadava 15. Kdyz je pred
desetinou teckou dost cislic, tak se to na druhe strane urizne tak, ze
se to zaokrouhli nahoru a tudiz to vypada dobre.

V kazdem pripade, jestli chcete dostavat dobre a rozumne presne vysledky,
tak bud pocitejte vyhradne celociselne, nebo si nastudujte aspon zaklady
numericke matematiky.

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux