[C/C++] splint meckert über vergleich von Float Variablen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Leon, 19. November 2008 .

  1. 19. November 2008
    splint meckert über vergleich von Float Variablen

    Bin gerade dabei ein C-Programm mit splint zu überprüfen und er meckert bei einem Vergleich zwischne 2 Float werten z.b
    Code:
    float i;
    if(i==0)
     irgendetwas;
    
    Dann gibt splint folgende Fehlermeldung aus:
    Code:
    test.c:03:19: Dangerous comparison involving float types:
     zahlen[0] > 0
     Two real (float, double, or long double) values are compared directly using a
     C primitive. This may produce unexpected results since floating point
     representations are inexact. Instead, compare the difference to FLT_EPSILON
     or DBL_EPSILON. (Use -realcompare to inhibit warning)
    
    Wie muss ich den Vergleich umschreiben, damit splint das durchgehen lässt?
     
  2. 19. November 2008
    AW: splint meckert über vergleich von Float Variablen

    Wenn i eine Laufvariable ist, dann würde ich sie als long deklarieren, falls nicht musst du um diese Warnung wegzubekommen etwas in die Fehlerrechnung einsteigen.

    Die Behandlung von Fließkommazahlen im Binärsystem füllt ganze Bücher, denn 0 muss nicht gleich 0 sein, da viele Nachkommastellen verwendet werden, kann es auch mal vorkommen, dass statt der erwarteten 0 die Variable den Wert 0.00000001 hat und wenn du die mit 0 verlgeichst, dann kommt nicht true heraus.

    In C gibt es definierte Werte, wie z.B. DBL_MAX, DBL_MIN und DBL_EPSILON
    DBL_MAX und DBL_MIN stehen für die größt mögliche und für die kleinst mögliche double Zahl in C.
    DBL_EPSILON steht für die Differenz zwischen 1 und der kleinsten Zahl größer als 1, d.h. die kleinste Zahl, die man zu 1 dazuaddieren kann, so dass nicht wieder 1 herauskommt.

    Um dein Problem jetzt zu umgehen kannst du folgenden Vergleich machen:

    Code:
    if ((X) - (Y) < DBL_EPSILON) 
    {}
    
    X ist in deinem Fall dein i und Y ist 0.
    Der Vergleich bedeutet, falls X-Y kleiner ist, als die kleinste dazuaddierbare Zahl, dann ist sind die 2 Variablen gleich.
    Um nicht ständig diesen Vergleich schreiben zu müssen könntest du auch eine Präprozessorkonstante deklarieren, die in etwa so aussieht:

    Code:
    #define DBL_EQ(X,Y) ( (X) - (Y) < DBL_EPSILON )
    
    dann brauchst du nur mehr DBL_EQ(X,Y) schreiben anstatt (X) - (Y) < DBL_EPSILON zu schreiben.

    Manchmal hilft es auch anstatt i==0 i==0.0 zu schreiben. Dann ist garantiert, dass mit einer double Zahl verglichen wird. Manche Kompiler spinnen da ein bissl.


    Ich hoffe ich konnte helfen

    mfg duddl
     
  3. 19. November 2008
    AW: splint meckert über vergleich von Float Variablen

    Danke für die Hilfe, bei "==" hat das splint beruhigt, jetzt fehlt mir noch der Workaround für > und < .
    Kann ich da mit FLTMAX und FLTMIN arbeiten und wenn ja , wie?
     
  4. 20. November 2008
    AW: splint meckert über vergleich von Float Variablen

    Nja mit ein bisschen Überlegen sollte das nun auch nicht mehr allzu schwer sein. Funktioniert auf dieselbe Art.


    Code:
    #define DBL_EQ(X,Y) ( (X) - (Y) < DBL_EPSILON ) /* X == Y */
    #define DBL_LT(X,Y) ( (X) - (Y) > DBL_EPSILON ) /* X > Y */
    #define DBL_GT(X,Y) ( (Y) - (X) > DBL_EPSILON ) /* Y > X */
    
    mfg duddl
     
  5. 20. November 2008
    AW: splint meckert über vergleich von Float Variablen

    öhm denk ich grade falsch oder würde ein cast da nicht auch helfen?

    Code:
    float x = 0.213;
    
    if (x < (float)0) {
    
     //bla
    }
    
     
  6. 20. November 2008
    AW: splint meckert über vergleich von Float Variablen

    Also soweit ich mitbekommen hab gehts da nicht darum, dass x<0 ist, sondern dass der Compiler oder Code Checker meckert, wenn man einen Vergleich schreibt, da Float != Float ist. Auch wenns den vorderen Stellen nach den Anschein hat.

    Ich hab dein Mini - Prog jetzt zwar nicht getestet, aba anstatt den langen Cast von (float) zu schreiben, ist es doch viel kürzer 0.0 oder .0 oder 0. zu schreiben, was alles dieselbe bedeutung hat in diesem Fall.

    mfg duddl
     
  7. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.