typecast von float nach int



  • Hallo,

    ich habe folgendes Problem beim typecast von float nach int, das ich mir einfach nicht erklären kann:

    float f = (868.0/20.0-19.0-24.0)*64000.0;
    int a = int(f);
    int b = int((868.0/20.0-19.0-24.0)*64000.0);
    

    Als Ausgabe erhalte ich f = 25600.0000, a = 25600 und b = 25599. Warum ist b um 1 kleiner als a und f??



  • Fließkommazahlen sind keine genauen Datentypen, und 868.0 / 20.0 kann binär halt nicht genau dargestellt werden. Die Umwandlung in int schneidet Nachkommastellen dann stumpf ab, und so kommt die 25599 rund 25599.9999999foo zustande.

    Warum das im einen Fall glatt 25600 ergibt und im anderen knapp darunter, wird an der Zwischenspeicherung als float liegen -- der ursprüngliche Ausdruck ist vom Typ double. Im Zweifel ist der float-Wert 25600.0f näher an der ungenauen double-Darstellung als der nächstkleinere Wert, so dass du hier zufällig auf den höheren, richtigen Wert kommst. Das kann bei anderen Rechnungen natürlich anders sein.



  • Ah ok, ich verstehe. Vielen Dank für deine schnelle Hilfe. Da muss ich mir dann wohl noch was gescheites einfallen lassen 😉



  • Ich vermute, dass du etwas in dieser Art willst:

    zahl_als_int = (int) floor(zahl_als_double + 0.5);
    

    ...das ist dann kaufmännisch gerundet.



  • theoretisch ja, ich kann in meinem fall die 20 aber auch einfach vor die klammer ziehen, dann komme ich garnicht in die verlegenheit mit fließkommazahlen arbeiten zu müssen. also in etwa so

    int a = (868 + 19*20 + 24*20)*3200
    

    trotzdem nochmal danke!



  • orn schrieb:

    int a = (868 + 19*20 + 24*20)*3200
    

    Super: mit int-Arithmetrik scheinbar sauber um floating-point herumgemogelt! 😮
    Bleibt offen: Wonach hattest du gefragt? 😕



  • wieso scheinbar sauber?
    meine frage war, wieso ich bei scheinbar gleichen zuweisungen unterschiedliche ergebnisse erhalte. nicht bedachte hatte ich, dass c fließkommaoperationen mit doubles durchführt und bei der zuweisung von f ein impliziter typecast von double nach float vorgenommen wird.


Anmelden zum Antworten