2017-02-08 4 views
0

Warum nicht gleich 0 CGLOAT_MIN ist, wennWarum 0 == CGFLOAT_MIN ist falsch?

My-Code

float minVar = CGFLOAT_MIN; 

printf("CGFLOAT_MIN = %f\n\n", CGFLOAT_MIN); 
printf("0 == CGFLOAT_MIN \t%s\n", (0) == CGFLOAT_MIN ? "true" : "false"); 
printf("0 == minVar  \t%s\n", (0) == minVar ? "true" : "false"); 
printf("0 == 0.000000  \t%s\n", (0) == 0.000000 ? "true" : "false"); 

Der Ausgang ist

CGFLOAT_MIN = 0.000000 

0 == CGFLOAT_MIN false 
0 == minVar   true 
0 == 0.000000  true 
+1

Dokumentation: "Für 32-Bit-Code ist dieser Wert' 1.17549435e-38F'. Für 64-Bit-Code ist es '2.2250738585072014e-308'." – jtbandes

+0

sollten Sie Gleitkommawerte selten genau vergleichen; Verwende ein Epsilon. –

Antwort

4

Da CGFLOAT_MIN ist nicht gleich 0. Es ist die kleinste darstellbare positive nicht direkt vergleichen - Nullwert, den CGFloat halten kann.

printf("CGFLOAT_MIN = %f\n\n", CGFLOAT_MIN); 

Dies druckt 0.000000 weil die %f Spezifikationsvorgaben bis 6 Dezimalstellen gerundet wird. CGFLOAT_MIN wird bei dieser relativ groben Genauigkeitsstufe auf Null abgerundet.

float minVar = CGFLOAT_MIN; 
// ... 
printf("0 == minVar  \t%s\n", (0) == minVar ? "true" : "false"); 

Dies druckt wahr, weil, wenn sie für 64-Bit-Aufbau, CGFloat-double äquivalent ist, nicht float. float hat weniger Präzision; es kann den Wert CGFLOAT_MIN nicht richtig darstellen. Also, wieder, die Umwandlung zu float rundet es auf 0 ab. So ist minVar gleich 0, obwohl CGFLOAT_MIN nicht ist.