2009-08-06 12 views
2

Hier ist ein Problem, das mich völlig in den letzten paar Stunden ...Falsche Fließkomma-Mathematik?

ich eine Gleichung hart in meinem Programm codiert haben verwirrt hatte:

double s2; 

s2 = -(0*13)/84+6/42-0/84+24/12+(6*13)/42; 

Jedes Mal, wenn ich das Programm ausführen, der Computer spuckt 3 als Antwort aus, aber die Mathematik von Hand, ich bekomme 4. Noch weiter, nach der Eingabe der Gleichung in Matlab, bekomme ich auch die Antwort 4. Was ist hier los?

Das einzige, was ich denke, ist falsch hier wäre Rundung Fehler. Jedoch mit maximal 5 Rundungsfehlern, gekoppelt mit der Verwendung von Doppelpräzisionsmathematik, wäre mein maximaler Fehler sehr, sehr klein, so bezweifle ich, dass das das Problem ist.

Kann jemand Lösungen anbieten?

Vielen Dank im Voraus,

-Faken

Antwort

17

Du machst eigentlich keine Fließkomma-Mathematik, du machst Integer-Mathe, was die Ergebnisse von Divisionen überfluten wird.

In C++, 5/4 = 1, nicht 1,25 - 5 und 4, da beide ganzen Zahlen sind, so wird das Ergebnis eine ganze Zahl sein, und damit der Bruchteil des Ergebnisses wird weggeworfen.

Auf der anderen Seite wird 5.0/4.0 wird ca. entsprechen. 1.25, da mindestens eine von 5.0 und 4.0 eine Fließkommazahl ist, so dass das Ergebnis auch Gleitkommazahl ist.

+0

Hmm, vielen Dank für Ihre Hilfe. Hätte früher früher kommen sollen, na ja. – Faken

+2

1,25 ist in der Basis 2 darstellbar wie 4,0 und 5,0. Es sollte genau sein. – dmckee

+2

Da es ein beliebiges Beispiel dmckee war, entschied ich mich, mit der Safer-Anweisung zu gehen. :) – Amber

7

Du verwechselst Integer-Division mit Teilung Gleitkomma. 3 ist die richtige Antwort mit ganzzahliger Division. Sie erhalten 4, wenn Sie diese Werte in Gleitkommazahlen konvertieren.

3

Einige davon werden mit Ganzzahlarithmetik ausgewertet. Versuchen Sie, Ihren Zahlen eine Dezimalstelle hinzuzufügen, z. 6.0 statt 6, um dem Compiler mitzuteilen, dass Sie keine Integer-Arithmetik wollen.

+0

das Anbringen eines 'f' an ihnen sollte den Trick auch tun ... – Shog9

+1

Eigentlich wäre das ein' .f', nicht nur 'f'. – GManNickG

3
s2 = -(0*13)/84+6/42-0/84+24/12+(6*13)/42; 

ergibt 3

s2 = -(0.*13.)/84.+6./42.-0./84.+24./12.+(6.*13.)/42.; 

tut, was Sie erwarten.