C++ Builder 6.0 : merkwürdiger Gleitkommaüberlauf



  • hallo,
    ich möchte im borland c++ 6.0 eine while-schleife solange durchlaufen wie double d größer als yMaximum[x][y] (double-array) ist. Also so:

    [code]
     double f = 0.001;
     double d = 100.0;
     while (d>yMaximum[x][y]) 
     {
        d *= 0.1;
        f *= 10.0;
     }
    [/code]
    

    da gibts aber einen Gleitkommaüberlauf.
    deshalb hab ichs einfach mal so probiert:

    [code]
     double f = 0.001;
     double d = 100.0;
     int z = 0;               
     bool p = true;
     while (p) 
     {
        p = d>yMaximum[x][y];
        z++;
        d *= 0.1;
        f *= 10.0;
     }
    [/code]
    

    wieder Gleitkommaüberlauf. und zwar genau dann wenn z = 4 ist.
    komischerweise gibts hiermit keinen Überlauf:

    [code]
     double f = 0.001;
     double d = 100.0;
     int z = 0;
     bool p = true;
     while (z<100) 
     {
        p = d>yMaximum[x][y];
        z++;
        d *= 0.1;
        f *= 10.0;
     }
    [/code]
    

    Versteh überhaupt nich wieso!!!!


  • Mod

    Hallo

    bei mir kommen bei beiden Varianten Fehler (Gleitkommaüberlauf)
    (irgendwann ist auch ein Gleitpunkt am Ende)

    mach mal einen try/catch Block und lass dir die Werte ausgeben

    MfG
    Klaus



  • yMaximum[x][y] = 50.342....

    Beim Fehler:
    z = 4;
    d = 0.01;
    f = 10.0;

    ...also bei den Werten ist ja wohl der Gleitpunkt eigentlich noch lange nicht am Ende



  • Hallo

    Also ich habe dies ausprobiert :

    double f = 0.001; 
     double d = 100.0; 
     int z = 0;               
     bool p = true;
     AnsiString Buffer;
     while (p)
     {
        p = d>(50.342);
        z++;
        d *= 0.1;
        f *= 10.0;
    // Ausgabe von d und f
     }
    

    und alles bestens, d.h. Ausgabe :
    d = 10, f = 0,01
    d = 1, f = 0,1
    Ich würde mal sagen, dein Array-Zugriff ist fehlerhaft oder der Wert im Array ist fehlerhaft

    bis bald
    akari


  • Mod

    Hallo

    double f = 0.001;
     double d = 100.0;
     int z = 0;              
     bool p = true;
     AnsiString Buffer;
     while (p)
     {
        p = d>(50.342);
        z++;
        d *= 0.1;
        f *= 10.0;
    // Ausgabe von d und f
     }
    

    Wenn du hergegangenn waerst und den Debugger angewofen haettest
    koenntest du feststellen was an deinem Beispiel falsch ist
    (while ist unnoetig)

    daher kann der Fehler bei dir auch nicht auftreten
    die Zeile

    p = d>(50.342);
     }
    

    wie niemals true

    also ......

    MfG
    Klaus



  • Hallo

    den Wert habe ich aus deinem Post als Beispiel, wenn es also bei mir läuft, was ist bei euch anders? Und ich habe auch 12; 2; 1,5;... ausprobiert, dann kommt eben eine Zeile mehr. Ändert aber nichts daran, das ein richtiger Wert unter 100 zu einem sauberen Egrbenis führt.
    (Über 100 natürlich auch)

    bis bald
    akari



  • Hallo

    okay, ich hab das Problem. Wenn yMaximum[x][y] kleiner als 0 ist, kommt der Überlauf. Warum? Weil die Multiplikation mit 0,1 für Float gegen 0 geht und das Ergebnis nie kleiner als 0 sein wird!

    /Edit muß natürlich 0 heißen

    bis bald
    akari


Log in to reply