float Vergleich



  • Ich habe folgenden Float Vergleich:

    int desktopWidth  = GetSystemMetrics(SM_CXSCREEN); 
    int desktopHeight = GetSystemMetrics(SM_CYSCREEN); 
    float ratio1 = static_cast<float>(desktopWidth) / static_cast<float>(desktopHeight);
    float ratio2 = 4.0f / 3.0f;
    if(ratio1 == ratio2) {
       // Das hier ist true
    }
    
    if( static_cast<float>(desktopWidth) / static_cast<float>(desktopHeight) == 4.0f / 3.0f) { 
        // Das hier ist falsche
    }
    

    Das 1. if ist wahr, das 2. if hingegen false. Wie kann das sein? Das ist doch 2 Mal exakt der selbe Vergleich? 😕



  • Du solltest dich über fließkommazahlen einlesen.

    Die Genauigkeit zwischen Registervariablen und Stackvariablen kann unterschiedlich sein. Ausserdem hast du immer Rundungsfehler, sodass 800/600 nicht 4/3 sein muss.



  • Ich weiß wie Floats arbeiten und ich kenne die Rundungsproblematik. Mir geht es hier nur darum, wieso es einen Unterschied macht ob ich den Ausdruck VOR dem if erzeuge oder direkt im if.


  • Mod

    Innterr schrieb:

    Ich weiß wie Floats arbeiten und ich kenne die Rundungsproblematik. Mir geht es hier nur darum, wieso es einen Unterschied macht ob ich den Ausdruck VOR dem if erzeuge oder direkt im if.

    otze schrieb:

    Die Genauigkeit zwischen Registervariablen und Stackvariablen kann unterschiedlich sein.



  • Innterr schrieb:

    Ich weiß wie Floats arbeiten und ich kenne die Rundungsproblematik. Mir geht es hier nur darum, wieso es einen Unterschied macht ob ich den Ausdruck VOR dem if erzeuge oder direkt im if.

    Beide Male hat der Compiler den Audruck (4.0f / 3.0f) bereits vorher berechnet und abgespeichert. Das erste Mal allerdings als Float-Variable und das zweite Mal als Double-Konstante. Während der Vergleich mit der Float-Variablen noch (zufällig!) klappt, klappt er mit der Double-Konstante nicht.

    viele grüße
    ralph



  • int desktopWidth  = GetSystemMetrics(SM_CXSCREEN); 
    int desktopHeight = GetSystemMetrics(SM_CYSCREEN); 
    if( desktopWidth * 3 ==  desktopHeight * 4) { 
    
    }
    

Anmelden zum Antworten