[anfänger] vergleich von zwei double-werten



  • hallo,

    ich schreib grad ein kleines programm und eine radiokarte anzusteuern, die sender speichere ich in einer datei ab:

    sender \tab frequenz

    zuerst hatte ich für die frequenz float verwendet, aber dann ging alles daneben, dann habe ich double verwendet, dann klappt soweit alles wunderbar.

    jetzt das problem:

    wenn ich die frequenz ändere durchsuche ich meine struktur und vergleiche die frequenzen um an den sendernamen zu kommen:

    struct sender_s {
        char name[32];
        double freq;
    } sender[10];
    
    double aktuell;
    
    int i;
    
    for(i=0; i < 10; i++) {
        if(sender[i].freq == aktuell) {
            // mach was
            break;
        }
    }
    

    nur der vergleich der double werte funktionier nicht immer, keine ahnung warum. wenn ich die double werte mit rint() umwandle dann funktioniert is immer.

    kann mir jemand sagen warum das so ist?



  • Hallo,

    das funktioniert deswegen nicht, weil Gleitkommazahlen intern nicht korrekt
    dargestellt werden koennen. So wirst du bei einem 'double i = 2.74' wahrscheinlich
    nie nur '2.74' sondern '2.74000083' oder sowas haben. Was du daher machen
    kannst, ist einfach die Nachkommastellen in den Vorkommaanteil zu bringen.
    Da double 8 Nachkommastellen hat, multiplizierst du deine Zahl einfach mal
    100000000. Aus '2.74000083' wird dann 274000083 und ein Vergleich sollte ohne
    Probleme funktionieren.

    Das Problem haben wir bei uns auf der Arbeit uebrigens auch gehabt, allerdings
    mit float. Bei float muss man halt mit 10000 multiplizieren um den Nachkommaanteil
    in den Vorkommaanteil zu bekommen.

    Hoffe ich konnte dir helfen.

    mfg
    v R



  • ahaa, ja, jetzt ist klar.

    frage: hängt die sache auch vom system ab (prozessor, verwendete c-library) ? oder bin ich mit *100000000 immer auf der sicheren seite?



  • Hallo,

    damit solltest du immer auf der sicheren Seite sein.

    Ich wuesste nicht, wie man es sonst machen koennte, zumindest faellt mir im
    Moment keine andere Moeglichkeit ein.

    mfg
    v R


Anmelden zum Antworten