Risiko von logischen Operationen auf Gleitkomma-Variablen in C ++

Rundungsfehler in Floating-Point-Berechnung können verheerend mit logischen Operationen in C ++ erstellen, so dass Sie auf Gleitkomma-Variablen sorgfältige Durchführung logischer Operationen sein muss. Betrachten Sie das folgende Beispiel:

schweben f1 = 10,0-float f2 = f1 / 3-Bool b1 = (f1 == (f2 * 3.0)) - // sind diese beiden gleich?

Auch wenn dann ist es für uns klar, dass f1 entspricht f2 3-fache, der resultierende Wert von b1 ist nicht unbedingt wahr. Ein Floating-Point-Variable kann nicht eine unbegrenzte Anzahl von signifikanten Stellen zu halten. So, f2 ist, dass wir nennen würde auf die Zahl nicht gleich # 147-drei-und-ein-Drittel, # 148- sondern auf 3.3333 # 133-, nach einer Anzahl von Dezimalstellen zu stoppen.

EIN schweben Variable unterstützt etwa 7 Stellen an Genauigkeit, während ein doppelt 16 Stellen unterstützt eine skosh über. Diese Zahlen sind Näherungswerte, da der Computer ist wahrscheinlich eine Zahl wie 3.3333347 aufgrund Launen in Gleitkommarechnungen zu erzeugen.

Nun, in der reinen Mathematik, die Zahl der 3s nach dem Komma ist unendlich, aber kein Computer gebaut kann eine unendliche Anzahl von Ziffern behandeln. Also, nach 3.3333 von 3 multiplizieren, haben Sie 9,9999 anstelle der 10 erhalten würden Sie erhalten, wenn Sie multipliziert # 147-drei-und-ein-Drittel # 148- - in der Tat ein Rundungsfehler. Solche kleinen Abweichungen können zu einer Person nicht wahrnehmbar, aber nicht auf den Computer. Gleichheit bedeutet genau das - genau Gleichberechtigung.

Moderne Prozessoren sind anspruchsvoll in solche Berechnungen durchführen. Der Prozessor kann in der Tat, Urlaub mit der Rundungsfehler, sondern von innen C ++, können Sie nicht genau vorhersagen, was jeder gegebenen Prozessor zu tun.

Je sicherer Vergleich folgt:

schweben f1 = 10,0-float f2 = f1 / 3-Float-f3 = f2 * 3,0-float delta = f1 - f3-Bool bEqual = -0,0001 lt; Delta Delta lt; 0.0001-

Dieser Vergleich ist wahr ob f1 und f3 sind innerhalb eines gewissen kleinen delta voneinander, die noch sein sollte wahr auch wenn Sie einige kleine Rundungsfehler zu berücksichtigen.

Die logische UND und logische ODER || Operatoren in C ++ ausführen, was genannt wird Kurzauswertung. Folgendes berücksichtigen:

condition1 condition2

Ob condition1 ist nicht wahr, Das Gesamtergebnis ist nicht wahr, egal, was der Wert von condition2. (Beispielsweise, condition2 könnte sein wahr oder falsch ., Ohne das Ergebnis zu verändern) tritt die gleiche Situation in der folgenden:

condition1 || condition2

Ob condition1 ist wahr, Das Ergebnis ist wahr, egal, was der Wert von condition2 ist.

Um Zeit zu sparen, ist C ++ nicht bewerten condition2 wenn es muss nicht. Beispielsweise in dem Expressions condition1 condition2 C ++ nicht bewerten condition2 ob condition1 ist falsch. Ebenfalls in den Expressions condition1 || condition2 C ++ nicht bewerten condition2 ob condition1 ist wahr. Dies wird als Kurzauswertung bekannt.

Kurzschlussauswertung kann bedeuten, dass condition2 ist auch nicht, wenn diese Bedingung hat Nebenwirkungen bewertet. Betrachten Sie das folgende zugegebenermaßen ersonnen Code-Schnipsel:

int nArg1 = 1-int nArg2 = 2-int nArg3 = 3-bool b = (nArg1> nArg2) (NArg2 ++> nArg3) -

die Variable nArg2 wird nie, weil der Vergleich erhöht nArg2 ++> nArg3 nicht durchgeführt. Es gibt keine Notwendigkeit, weil nArg1> nArg2 schon wieder ein falsch so dass der Gesamtausdruck muss sein falsch.

Menü