3 Stimmen

C Programmiergrundlagen

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");    
    }
}

3voto

dhein Punkte 6063

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

2voto

Vladp Punkte 4133

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.

0voto

Chinna Punkte 3930

Gleitkommazahl in c ist standardmäßig double. Wenn Sie es als float verwenden möchten, müssen Sie f am Ende der Zahl hinzufügen. Versuchen Sie den folgenden Code, er gibt a aus.

#include
main()
{
    float a = 5.6;
    if(a == 5.6f)
    {
        printf("a");
    }
    else
    {
        printf("b");    
    }

CodeJaeger.com

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.

Powered by:

X