Új hozzászólás Aktív témák

  • dabadab

    titán

    válasz HussarF #13235 üzenetére

    "de miért csinálja azt, hogy float esetén kiegészíti a számot még random, kisebb helyi értékű számjegyekkel, hogy meglegyen a 10 számjegy?"

    Ez egy nagyon fontos kérdés a lebegőpontos számoknál!

    Mivel a lebegőpontos számok is binárisak, ezért egy csomó szám, ami tizes számrendszerben véges számú számjeggyel leírható, az (kettesre váltva) végtelen tizedes tört lesz. Például a tök egyszerűnek tűnő "0.1" 32 bites floatkén már "0.100000001490116119384765625" (itt van egy online tool, amivel nézhetsz még példákat). Természetesen double esetén is létezik ugyanez a probléma, csak a tíz tizedesre kerekítés ott már elrejtette ezt (mert a hiba kisebb volt a kerekítés értékénél), de egy precision(30) már biztos előhozná.

    Ezért (meg a lebegőpontos számítások eredő pontatlansága miatt*) van az, hogy lebegőpontos számoknál gyakorlatilag tilos ==-t használni, szimpla egyenlőségvizsgálat helyett azt kell megnézni, hogy elég közel vannak-e egymáshoz (ahol az "elég közel" az sajnos mindig kontextusfüggő, tudni kell, hogy milyen mértékű hibára kell ott számítanod).

    *: a pontatlanságra példa
    if ( (b > 0) && (a+b == a) ) printf("oops\n");

    Ez simán kiírhatja azt, hogy oops (annak ellenére, hogy tisztán matematika alapon nem lenne neki szabad), pl:
    a=10000000.0;
    b=00000000.1;

Új hozzászólás Aktív témák

Hirdetés