kerekitesi hiba

Fórumok

kerekitesi hiba

Hozzászólások

[quote:82bc648247="Elbandi"]regen egy ilyenrol hallottam:

ez pl egeszekre kerekit
trunc(szam+0.5)

amugy olvasd at a double tarolasi modjat es akkor megtudod miert van a vegen az a sok nemnulla szam

Szerintem most nem errol van szo (valoszinuleg az un. "bankár" kerekítésre gondoltal - a kereken 5 tizedes értékeket a legközelebbi páros számra kerekíti), hanem inkabb a lebegopontos szamabrazolas veges pontossagarol.

szerintem a .5-öt éppenhogy pontosan kéne tárolnia, lévén 2 hatvány.

A 0.5 valoban az, azonban itt 865.005 -rol volt szo...

Szerencsere keznel volt Gyakorlati C++ c. konyvem lebegopontos szamok gepi abrazolasanak korlatairol szolo fejezetenek szemlelteto peldaprogramja :wink: , ami a kovetkezo eredmenyt produkalta:

1) 0.5
(1).0 x 2 E -1
IEEE szabvany szerinti gepi abrazolas
S[0]E[01111110]M[00000000000000000000000]

A szam pontos abrazolasahoz elegseges az egyszeres pontossagu lebegopontos formatum (float)

2) 865.005
Kerek egy tortet:
865.005
(1).101100001000000010100011110101110000101000111101011 x 2 E 9
IEEE szabvany szerinti gepi abrazolas
S[0]E[10000001000]M[1011000010000000101000111101011100001010001111010110]

A szam pontos abrazolasahoz a dupla pontossagu lebegopontos formatum (double) SEM ELEGSEGES!

Mellesleg a konyv peldaprogramjai - pontosabban a forrasok - letolthetoek a http://nkari.uw.hu/konyv.php cimrol.

[quote:bf1faf93a0="Carlos"]A 0.5 valoban az, azonban itt 865.005 -rol volt szo...

Bocsi, rosszul emlékeztem :D

A kovetkezo program hibasan kerekiti 865.005 ket tizedes jegyre. Milyen altalanos modszer van a kovetkezo szamabrazolasbol szarmazo kerekitesi hiba kijavitasara ?

$cat ./real.c
#include <stdio.h>

/**/int main(void)
{
double x=888885.005;
double y=865.005;
double z=8.005;

printf("%.2f (%.20f)\n",x,x);
printf("%.2f (%.20f)\n",y,y);
printf("%.2f (%.20f)\n",z,z);

return 0;
}

$./a.out
888885.01 (888885.00500000000465661287)
865.00 (865.00499999999999545253)
8.01 (8.00500000000000078160)

regen egy ilyenrol hallottam:

ez pl egeszekre kerekit
trunc(szam+0.5)

amugy olvasd at a double tarolasi modjat es akkor megtudod miert van a vegen az a sok nemnulla szam