(10.4-3)*2=14.799999?
-
Hallo Community,
ich habe heute angefangen (in C) zu programmieren, dabei bn ich auf diese Seite gestossen http://www.c-programmieren.com/C-Lernen.html#Rechnen.
Hier bei Abschnitt Rechnen ist dann eine Rechnung mit Variablen.#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { float i = 10.4; int r = 3; float Ergebnis; Ergebnis=(i-r)*2; //heißt also (10.4-3)*2 printf("Das Ergebnis ist %f\n",Ergebnis); system("PAUSE"); return 0; }
Wenn ich es Ausführe gibt es mir als Lösung 14.799999 an obwohl ja (i-r)*2=(10.4-3)*2=14.8 stimmen würde. Woran liegt das?
Danke schonmal für die Antwort!
Grüsse
R3lay
-
10.4 lässt sich nicht exakt als float oder double darstellen.
-
Rundungsfehler und nicht exakt darstellbare Zalen.
So wie im Dezimalsystem 1.0/3.0 = 0.3333333333 nicht exakt darstellbar ist,
so gibt es auch solche Zahlen im Dualsystem.Du kannst dir das ein bisschen verschönern, indem du die Nachkommastellen bei der Ausgabe begrenzt:
printf("Das Ergebnis ist %.1f\n", Ergebnis); /* Prozent Punkt Eins EFF */
Du kannst das Problem ein bisschen verschieben, indem du mit
double
rechnest.
-
10.4 ist als Fließkommazahl (für alle üblichen Arten und Weisen, wie im Computer Fließkommazahlen behandelt werden) nicht exakt darstellbar. Stattdessen wird mit dem nächstbesten Wert gerechnet. Bei IEEE754 (der Fließkommastandard, den fast alle Computer auf der Welt benutzen) ist der nächstbeste Wert für einen (single precision) float 10.3999996185302734375. Dieser kleine Fehler wird dann durch die Rechnung mitgeschleppt und man bekommt einen kleinen Fehler im Endergebnis.
Der Grund, warum 10.4 nicht darstellbar ist, hat mit der Basis der Zahlendarstellung zu tun. Der Computer arbeitet intern mit einem Binärsystem und kann daher nur Zweierpotenzen (auch negative Potenzen!) und Summen und Vielfache davon exakt darstellen. In 10.4 ist aber ein Primfaktor 5 drin: 10.4 = 10 + 2*5^(-1). Daher kann man es in unserem Dezimalsystem (Basis 10 = 2*5) exakt (d.h. mit endlich vielen Stellen) darstellen, in einem reinen Binärsystem hingegen nicht. In etwa so, wie man im Dezimalsystem die Zahl 1/3 = 0.333... nicht exakt darstellen kann, da dafür ein Primfaktor 3 in der Zahlenbasis nötig wäre. Im Dreiersystem wäre das ganz einfach die Zahl 0.1.