Probleme mit der logarithmus funktion



  • Hi,

    ich frag mich gerade, warum ich ein log ergebnis ( in double ) ich nicht in ein integer casten kann ...

    folgender Code:

    double x1=8.0;
    double x2=2.0;
    double res = log(x1)/log(x2);
    
    so nun kommt hier aber 2 raus ( als integer ). wenn ich das ganze in double lass kommt 3.0000 raus..
    
    Jetzt müsste ich schon gerne warum ??  :rolling_eyes: 
    
    Wäre nett wenn mir ja jemanden helfen könnte !
    

    Cu



  • double benutzt eine andere interne umrechnung als integer(wenn ich mich nich irre).
    desweiteren ist double auf 32 bit systemenen 64 bit lang, und ein integer nur 32, dh du liest immer nur die ersten 32 bit deines doubles aus.



  • Hm, dürfe doch egal sein, wenn er nur 32 bits benutzt schneidet er halt den rest ab, .. aber ist ja in meinem fall nicht so o ?



  • er schneidet "nur" die wichtigen nämlich die hinteren 32 bits ab.



  • #include <iostream>
    #include <conio.h>
    using namespace std;
    
    int main()
    {
        double x1 = 8.0;
        double x2 = 2.0;
        double dRes = log(x1)/log(x2); 
        cout << "double:   " << dRes << endl;
        int iRes = log(x1)/log(x2); 
        cout << "int:      " << iRes << endl;
        int iRes_plus = log(x1)/log(x2) + 0.00000000000001; 
        cout << "int_plus: " << iRes_plus << endl;
        cout << "int_cast: " << (int)dRes << endl;
        getch();
    }
    

    Damit könnt ihr ein wenig spielen. Dann seht ihr, woran es liegt. Daher dürft ihr den Fließkommazahlen nie trauen. 😉



  • kommt bei mir überall 3 raus...



  • otze schrieb:

    dh du liest immer nur die ersten 32 bit deines doubles aus.

    So ein Quatsch!



  • kommt bei mir überall 3 raus...

    Beim Dev-C++ kommt allerdings auch mal 2 heraus.



  • Hab mir jetzt eine "Round" funktion geschrieben. Damit funtzt alles.

    Aber ich wüsste doch gerne was hier falsch ist ...

    Wie gesagt, liest er ja nun wirklich die ersten wichtigen 32 bits aus ...
    ??

    Oder klährt mich mal bitte auf !!



  • Ich emphele dir Knut (Buch II) zu lesen. Im kurzem:
    Alle Fluesskommazahalen Berechnungen sind ungenau ausgefuehrt. Deswegen liegt das Ergebniss im Bereich von etwa 2.999999 zu etw 3.000000...1. Nach dem Konvertierung zu Int ist alle bits nach dem Komma geloesht. Wann das Ergebniss ist weniger als 3 Konvertierung-Resultat ist 2 wann groeseer als 3 - 3. So muss mann Funktion "round" benutzten.


Anmelden zum Antworten