Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

Rechenfehler?

hasw / 3 Antworten / Baumansicht Nickles

Moin,

ich hab hier folgende simple Funktion:

uchar calc_vid(double vt) {
printf("%.03f\\n", vt);
return(((1.85 - vt) / 0.025));
}

Wenn ich diese nun mit 1.600 fuettere (wobei rechnerisch 1.85-1.6 = 0.25, 0.25/0.025 = 10 rauskommen muesste), spuckt sie nur 9 aus.

Wo ist mein (Denk)fehler?

bei Antwort benachrichtigen
mr.escape hasw „Rechenfehler?“
Optionen

Dezimalzahlen können im internen format (auch als double) nicht immer genau abgebildet werden. Bei vorliegender berechnung kommt nun wohl durch rundungsfehler sowas wie 9.9999999999 raus, was auf uchar gerundet eben 9 ergibt. Einfach noch ein "+0.5" hinter die 0.025 setzen und gut.

return(((1.85 - vt) / 0.025 + 0.5));


mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
hasw mr.escape „Dezimalzahlen können im internen format auch als double nicht immer genau...“
Optionen

Ok, thx. Hatte gedacht das bei so simplen Rechenaufgaben Rundungsfehler nicht ueblich waeren, dass kann ja sogar ich im Kopf ohne Rundungsfehler ;-)

bei Antwort benachrichtigen
mr.escape hasw „Ok, thx. Hatte gedacht das bei so simplen Rechenaufgaben Rundungsfehler nicht...“
Optionen

Du arbeitest ja auch im dezimalsystem, der rechner nicht.
0.3 z.b. ist 0x3FD3333333333333
1.85 ist 0xFD99999999999A
1.6 ist 0xF999999999999A
0.025 ist 0x9999999999999A
d.h. alles zahlen, die in binärer form periodisch werden, d.h. unedlich viele bits bräuchten. Kriegen sie nicht -> rundungsfehler!

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen