if-Anweisung mit double



  • Hallo zusammen,

    warum funktioniert die if-Anweisung nicht richtig?

    double so;
      so=1.0;
      for(int i=0;i<5;i++)
    	so=so+0.1;
      if(so==1.5)
    	ShowMessage("LJKDJA");
    

    ShowMessage wird nie aufgerufen.



  • fieser Fehler;
    änder mal den Datentyp von so auf float und schau Dir die Werte im Debugger an. (mit double wird der Effekt imho nicht sichtbar)
    if in Verbindung mit Gleitkommazahlen erfordert immer ein bisschen mehr Arbeit



  • Hallo

    Die Problematik der (Un-) Genauigkeit von Fließkommazahlen ist hier schon öfters besprochen wurden, z.B. im Verlaufe dieses Beitrags

    bis bald
    akari



  • if-Abfragen mit Fliesskommazahlen brauchen etwas mehr Aufwand, weil nie eine exakte Gleichheit (hier so == 1.5) erzielbar ist. Das liegt an der binären Darstellung dieses Datentyps. Üblicherweise macht man das mit der Abfrage des Absolutwertes kleiner als eine vorgegebene Genauigkeit eps. Also:

    double eps = 0.001;
    if (fabsl(so-1.5) < eps)
    { 
    .....
    }
    

    Edit: Wieviele Jahre wird schon programmiert - 50 Jahre? Und neuerdings zunehmend wird gerade nach den kleinen Unterschieden zwischen integer und float, deren Genauigkeit gefragt und manchmal unsinniges dazu mitgeteilt. Das 1 x 1 wurde allen in der Grundschule beigebracht, genauso wie die Bruchrechnung im Dezimalsystem. Da weiss man doch, dass z.B. 2 geteilt durch 3 keinen exakt abfragbaren Wert liefert.


Anmelden zum Antworten