Gleitkomma



  • Hi,

    Laut unserem Professor ist es problematisch Gleitkommazahlen in C zu vergleichen. Bis jetzt hatte ich aber das Problem nicht und nach dem Compiling funktioniert es auch. Wo also ist denn genau das Problem? Kann mir das einer erläutern?

    mfg


  • Mod

    #include <stdio.h>
    
    int main()
    {
     int i = 0;
     double d = 0;
     for(; i < 10; ++i)
      d += 0.1;
    
     if (d == 1)
      puts("passt\n");
     else
      prinf("Oh, nein! %.16f != %.16f", d ,1);
    }
    

    Das dahinter stehende Problem ist, dass Fließkommazahlen endlich viele Stellen in einem Binärsystem speichern. Und daher bekommst du Ungenuigkeiten, wenn du mit Zahlen rechnest, die mit diesem System nicht exakt darstellbar sind (z.B. sqrt(2), pi, all die Zahlen mit denen das auch im Dezimalsystem schiefgehen würde). Das sind teilweise auch Zahlen, von denen man dies nicht erwartet, z.B. wie hier gezeigt die 0.1. Da läuft man im Binärsystem nämlich in das gleiche Problem wie man im Dezimalsystem mit 1/3 hat. 1/3 im Dreiersystem wäre nämlich einfach 0.1, im Dezimalsystem ist es bekanntlich 0.3(Periode) und daher mit endlich vielen Stellen nicht darstellbar.



  • Und was kann ich stattdessen machen, wenn ich nun überprüfen will ob die Variable doch den Wert 1.0 hat??



  • Du kannst eine hinreichend kleine Epsilonumgebung einführen. Liegt der Wert in etwa bei 1 akzeptierst du es als 1.



  • Du kannst ein epsilon definieren und schauen ob die Abweichung zwischen den Vergleichsvariablen kleiner als das epsilon ist.

    double epsilon 0.000001
    
    if (fabs(d-1.0) <= epsilon)
    { 
      printf "d ist gleich 1"
    }
    

    Je nach Genauigkeit kannst du das epsilon anpassen.

    ~Sei epsilon < 0 🤡~




Anmelden zum Antworten