Veröffentlicht 26. Mai 200421 j Hallo, ich habe ein Problem mit dem float-Datentyp: Ich gebe -123.45 ein und spiltte diese Zahl in Vor- und Nachkommazahl, also: zahl_1 = 123 und zahl_2 = 0.45 Wenn ich diese beiden Zahlen zusammenrechne, habe ich 123.45. Die eingegebene Zahl war aber negativ, daher rechne ich ergebnis = 0 - (zahl_1 + zahl_2); bzw. ergebnis = (zahl_1 + zahl_2) * (-1.0); In beiden Fällen bekomme ich als Ergebnis: -123.4499992 Was soll das denn? Kann mir jemand helfen? Oder hat jemand eine tolle Idee wie man einen String (char) in float umwandelt, ohne die Standard-Funktion atof verwendet? Danke schonmal!
26. Mai 200421 j Also es gibt schon Rundungsfehler bei Gleitkommaberechnungen, allerdings nicht bei so wenig Stellen. Zeig mal wie du das machst. Bei funktioniert es folgendermaßen ohne Fehler #include <stdio.h> int main() { float i=123, o=0.45, t=0; t= 0 - i - o; printf("%f\n",t); return 0; } [/PHP]
26. Mai 200421 j Naja quasi könnte ja schon DER Unterschied sein Hast du alle Variablen als float deklariert? Was passiert wenn du stattdessen double nimmst? Was wird bei dir ausgegeben wenn du mein Programm übersetzt?
26. Mai 200421 j 1. Ja, alles float! 2. Mit double funktioniert alles wunderbar... 3. Dein Programm funktioniert auch wunderbar... Das einzige Problem ist jetzt, dass meine Aufgabe folgende war: Umwandlung eines Strings in float ohne atof... jetzt hab ich aber nen double :-( Noch ne Idee??? (Danke schonmal!!!)
26. Mai 200421 j Hallo, Also es gibt schon Rundungsfehler bei Gleitkommaberechnungen, allerdings nicht bei so wenig Stellen. Doch, auch dann. Das Problem tritt auf, wenn es für eine Floating-Point Zahl keine Eindeutige Repräsentation auf Maschinenebene gibt. In der Regel ist das dann der Fall, wenn sich eine Fliesskommazahl nicht als Summe von Zweierpotenzen bzw. 1/Zweierpotenzen (für den Nachkommateil) darstellen läßt bzw. die Annäherung ausreichend genau ist. Im oben genannten Fall trifft das für die Zahl 0.45 zu (bzw. auf 0.2, da 0.25 eindeutig repräsentiert werden kann). Das kann man auch leicht per Hand ausprobieren, in dem man versucht, 0.45 (Mantisse) aus Elementen der folgenden Serie zu berechnen 0.50000 + 0.25000 + 0.12500 + 0.06250 + 0.03125 usw. Nic
26. Mai 200421 j Das kann man auch leicht per Hand ausprobieren, in dem man versucht, 0.45 (Mantisse) aus Elementen der folgenden Serie zu berechnen Alternativ kann man die Zahl auch als Bruch darstellen: 0.45 = 45/100 = 9/20. Nur wenn der Nenner eine Potenz von 2 ist, lässt sich die Zahl als float/double ohne Fehler speichern.
26. Mai 200421 j Hallo, eine etwas ausführlichere Beschreibung findest Du hier: http://www.nuvisionmiami.com/books/asm/workbook/floating_tut.htm http://research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html Nic
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.