2014-01-28 2 views
13

Ich habe gelernt, dass der Vergleich eines Doppel mit == ist keine weise Übung. Ich habe mich allerdings gefragt, ob es gefährlich sein kann, zu überprüfen, ob ein Double initialisiert wurde. Wenn zum Beispiel bekannt ist, dass eine Variable doubleVar nicht Null sein kann, wenn sie initialisiert wurde, ist dies sicher?Ist es korrekt, ein Double mit Null zu vergleichen, wenn Sie es vorher auf Null initialisiert haben?

Foo::Foo(){ 
    doubleVar = 0.0; // of type double 
} 

void Foo::Bar(){ 
    if(doubleVar == 0){ // has been initialized? 
     //... 
    }else{ 
     //... 
    } 
} 
+4

Die a) nicht auf 0 initialisiert wird, ist es 0 bis es zuweisen, und b) Vergleichen Sie es mit einem "int" 0, nicht einem "double" 0.0 wie es zugewiesen wurde. – chris

+0

Ja. Für diesen Fall ist es sicher. – haccks

+0

Ich bin verwirrt. Warum kann eine 'doubleVar 'nicht null sein, wenn sie initialisiert wurde? Kannst du es nicht als Null initialisieren? Wer hat dir gesagt, dass es keine kluge Methode ist, ein Double mit == zu vergleichen? Was war der Grund, den sie gaben? – crush

Antwort

10

In IEEE-754, lange Geschichte kurz:

double d; 

d = 0.0; 
d == 0.0 // guaranteed to evaluate to true, 0.0 can be represented exactly in double 

aber

double d; 

d = 0.1; 
d == 0.1 // not guaranteed to evaluate to true 
+4

Warum ist letzteres * nicht * garantiert? Es ist der * gleiche * Wert (der bei Bedarf die gleichen Werbeaktionen durchlaufen sollte). – user2864740

+1

@ user2864740 '0.1' kann nicht genau in' double' dargestellt werden (IEEE-754 binary64 type) und C sagt: * (C99, 5.2.4.2.2p8) "Außer Zuweisung und Besetzung (die alle zusätzlichen Bereich und Genauigkeit entfernen) Die Werte von Operationen mit Gleitoperanden und Werten, die den üblichen arithmetischen Konvertierungen und Gleitkommakonstanten unterliegen, werden in einem Format ausgewertet, dessen Bereich und Genauigkeit größer sein können als vom Typ gefordert. "* – ouah

+3

@ HAL9000 Ich argumentiere, dass * doesn ' t matter * weil der gleiche Wert in * beiden Orten * verwendet wird und somit intern das * gleiche * Bitmuster hat. Dies steht im Gegensatz zu etwas wie 0,3 + 0,2 = 0,5. – user2864740

Verwandte Themen