2016-03-31 7 views
-4

In einem speziellen Fall habe ich die Nummer 0.068404 in zwei Variablen (diese ändern, während das Programm läuft, damit ich nicht weiß, was drin ist).Eine Zahl minus selbst gibt unendlich

Wenn ich subtrahiere, gibt es das Unendliche oder genau eine Zahl an der Macht -9. Alle booleschen Operationen geben mir ein falsches Ergebnis.

Irgendwelche Ideen?

+0

Dies ist nur der Gleitkommadarstellung sehr nahe Null. Es ist nicht unendlich, es ist nur sehr klein. Das "-9", auf das Sie sich beziehen, ist "10^-9" und es ist die wissenschaftliche Notation der Zahl. –

+0

Sie sollten Gleitkommazahlen nicht für Gleichheit vergleichen. Fließkomma ist [ungenau] (https://isocpp.org/wiki/faq/newbie#floating-point-arith) – PaulMcKenzie

+0

Aber es sollte 0 geben, es ist komisch! Wenn ich es nicht mit einer Zahl zwischen 0 und 1 multipliziere (um die Vektorlänge zu ändern), funktioniert es – Render

Antwort

3

Sie haben wahrscheinlich Probleme mit Fließkomma-Rundungen, ein sehr häufiges Problem, das immer wieder behoben wurde. Betrachten Sie das folgende Programm:

float a, b, c; 

cin >> a; 
b = a; 
a = a*3; 
a = a/3; 
c = a - b; 
cout << c << " " << (c == 0) << endl; 

Durch alle Rechte Sie einen Druck aus 0 1 bekommen sollte, aber wenn Sie versuchen, es here. Sie erhalten:

2.48353e-09 0 

Dies liegt daran, Gleitkommazahlen nicht jede Basis 10 Nummer, so Rundungsfehler machen gerade Vergleiche eine schlechte Idee darstellen. Sie sollten immer ein Epsilon verwenden, das heißt:

abs(a - b) < eps 

wo eps ist so etwas wie 1e-6.

Here you can find many more examples.

+0

Ok danke! Zum ersten Mal beschäftige ich mich in 5 Jahren mit diesem Thema. Nochmals vielen Dank – Render

+0

@Render Ihre Frage wird geschlossen, wenn Sie nicht weiter ausführen. Sie sollten ein konkretes Beispiel angeben und diese Antwort dann akzeptieren. –