Warum wird der folgende Code b auf dem Bildschirm gedruckt?
#include
main()
{
float a = 5.6;
if(a == 5.6)
{
printf("a");
}
else
{
printf("b");
}
}
Warum wird der folgende Code b auf dem Bildschirm gedruckt?
#include
main()
{
float a = 5.6;
if(a == 5.6)
{
printf("a");
}
else
{
printf("b");
}
}
Da Gleitkommazahlen nicht genau übereinstimmen können (weil zwischen zwei von Ihnen gewählten Zahlen unendlich viele andere Zahlen liegen). Eine Maschine kann sie nicht alle darstellen und ist gezwungen, sie mit einem Modell nur einiger Gleitkommazahlen darzustellen, die sie darstellen kann.
Also in Ihrem Fall speichert das System wahrscheinlich nicht 5.6
, weil das eine Zahl ist, die Ihre Maschine nicht darstellen möchte. Stattdessen wird etwas gespeichert, das ziemlich nah an 5.6
im Speicher ist.
Wenn Sie also Vergleiche mit Gleitkommazahlen durchführen, sollten Sie niemals nach Äquivalenz prüfen. Verwenden Sie stattdessen die System-C-Definition FLT_EPSILON
und überprüfen Sie
if (((a - 5.6) > -FLT_EPSILON) && ((a - 5.6) < FLT_EPSILON))
{
...
}
Wo FLT_EPSILON
der kleinste darstellbare Fließkommawert ist. Wenn der Unterschied von a zu 5.6 absolut kleiner als EPSILON ist, können Sie sicher sein, dass es GLEICH war, aber die Maschine hat die nächste Zahl gewählt, die sie kennt, anstatt von 5.6
.
Dasselbe gilt für DBL_EPSILON für den Double-Typ.
Diese Typen sind in float.h
definiert
Wenn Sie einen Gleitkommawert möchten, vergessen Sie nicht, f
hinzuzufügen
#include
main()
{
float a = 5.6f;
if(a == 5.6f)
{
printf("a");
}
else
{
printf("b");
}
}
gibt wie erwartet a
aus.
Das Problem war, dass sowohl 5.6
als double
-Literale definiert sind und das a
in einen float
konvertiert wurde. Während es im if
immer noch mit einem double
-Wert verglichen wird, sodass Sie false erhalten.
Eigentlich würde es ausreichen, f
nur innerhalb des if hinzuzufügen. Aber besser sicher als sorry.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.