Rundungsfehler beim konvertieren von float nach int?



  • float ist nie ganz exakt - und vermutlich wird durch die internen Rundungen aus dem 0.16 ein 0.159999... (setz doch mal die precision von cerr etwas höher, dann sieht su auch die Nackommastellen der Zahlen).



  • jau, ging in der 5ten Nachkommastelle dann irgendwann daneben - also doch auf double umsteigen 🙂



  • Wie CStoll schon sagte, sond Fliesskommawerte technisch ungenau. Aber dafür rasend schnell. Wenn floats genau und schnell wären, würde keiner mehr integer benutzen. Mußt also immer mit ungenauen Werten bei float und double rechnen.



  • Artchi schrieb:

    Wenn floats genau und schnell wären, würde keiner mehr integer benutzen.

    Außer wenn man Ganzzahlen benötigt 😉



  • pumuckl schrieb:

    jau, ging in der 5ten Nachkommastelle dann irgendwann daneben - also doch auf double umsteigen 🙂

    Das würde den Fehler auch nur aufschieben, double kann genausowenig exakte Werte speichern wie float (nur mit dem Unterschied, daß es ein wenig exakter ist).

    *grübelt* wenn du einen Gleitkommawert an den Stream übergibst, wird er korrekt gerundet, wenn du ihn nach int konvertierst und dann übergibst, wird er streng abgerundet - also lass doch mal den Cast aus der Anweisung 'valstr<<(int)val;' weg.



  • Ich habe gerade das gleiche.
    Funktion mit dem Namen
    CString FloatToCString(float dValue)
    soll, wie zu erkennen ist, eine Konvertierung vornehmen.
    Der Übergabewert ist float mit dem Wert 0.7
    Springt der Debugger jetzt in die Funktion rein, ist dValue plötzlich 0.699999.
    Warum ? Was kann man dagegen machen ?
    Ich mein, der Wert der übergeben wird ist float, der Datentyp in der Funktion ist float und sowieso.



  • float speichert seine Werte in Binärdarstellung - und da ist 0.7 eine periodische Zahl. Und die passt nicht ganz in den endlichen Platz, den float bereitstellt, deswegen wird sie auf die entsprechende Größe zusammengestutzt.



  • floating point operationen sind immer verlustbehaftet. wenn man wirklich exakte ergebnisse braucht, dann sollte man mit integer werten arbeiten.



  • schau dir mal iomanip an, da kannst du in streams für fließkommatypen festlegen, wie sie dort gespeichert werden sollen, u.a. kann man da anzahl der Stellen,oder anzahl der nachkommastellen festlegen. Da muss man sich eigentlich nichts mehr selberschreiben.



  • Krux schrieb:

    ... wie sie dort gespeichert werden sollen ...

    gespeichert ? eher wie sie bei der ausgabe gerundet werden, oder?

    Meep Meep


Anmelden zum Antworten