Seite 1 von 2

angeblicher Rechenfehler mit Floats -Natürlich Gelöst :)

Verfasst: 31.10.2006 00:20
von sobi
Folgender Code ergibt bei mir nur Mist...

Code: Alles auswählen

a.s="100.14"
Debug ValF(a) ;100.13999938964844
Liegt das an mir, an dem Rechner oder wieso fängt hier PB (4.00) auf einmal an, das zu "verwandeln"?

Verfasst: 31.10.2006 00:27
von stbi
nimm double statt float, dann kommt der Rundungsfehler nicht mehr

Verfasst: 31.10.2006 00:28
von Kaeru Gaman
weil ValF() nunmal in eine Float umwandelt.
und eine Float ist von ihrer genauigkeit her begrenzt.

> nimm double statt float, dann kommt der Rundungsfehler nicht mehr

vielleicht nicht da, aber irgendwann schon.

bitte mit variablen-typen und fließkomma-darstellung im allgemeinen auseinandersetzen.

Verfasst: 31.10.2006 00:33
von sobi
stbi hat geschrieben:nimm double statt float, dann kommt der Rundungsfehler nicht mehr
Aha... okay, intressant - dass wusste ich bis jetzt noch nicht.
Allgemeine Frage: Währe es nicht besser, ich speichere floats als long und bei der Bearbeitung setze ich einfach die Kommastelle?
Sprich, ich rechne alles in Cent, anstatt in Euro?

Verfasst: 31.10.2006 00:54
von Zaphod
Ja

Verfasst: 31.10.2006 01:24
von stbi
Kaeru Gaman hat geschrieben:weil ValF() nunmal in eine Float umwandelt.
und eine Float ist von ihrer genauigkeit her begrenzt.
@kaeru: ACK, aber dass Float schon 2 Stellen hinterm Komma solche Ungenauigkeit haben soll, kann ich mir nicht vorstellen :shock: . Ich vermute eher, dass die PB-Routinen an dieser Stelle etwas ungenau sind. Aber was solls, es gibt ja Double, da tritt der Fehler dann hoffentlich deutlich weiter rechts auf.

@sobi: wie Zaphod bereits bejahte, kannst Du vorsichtshalber in Cent rechnen. Aber je nachdem was Du da rechnest, macht es ggf. sogar Sinn, in Zehntel- oder Hundertstel-Cent zu rechnen. Beispiel: 1 Verpackungseinheit mit 8 Stück kostet in deiner Preisliste 1 EUR. Somit kostet 1 Stück 12,5 Cent.

Verfasst: 31.10.2006 01:31
von Kaeru Gaman
sobi hat geschrieben:...Sprich, ich rechne alles in Cent, anstatt in Euro?
Zaphod hat geschrieben:Ja
genau.
das nennt sich "fixkomma", und das propagiere ich seit langem.

rechne einfach in tausendstel Euro, das ist selbst für Zinsrechnungen wunderbar ausreichend.

bei der darstellung musst du daraus euro-kommastellen machen,
aber beim rechnen bist du mit tausenstel cent fuc genau!

Verfasst: 31.10.2006 11:56
von KeyPusher
@stbi: die pb-routinen sind nicht ungenau - bzw. nicht ungenauer wie der IEEE754 standard.

hier mal ein auszug aus der pb-hilfe:
Spezielle Informationen über Fließkommazahlen (Floats und Doubles)

Eine Fließkomma-Zahl (auch Gleitkomma-Zahl, englisch: Floating Point Number) wird in einer Art und Weise gespeichert, die den Binär-Punkt (trennt "Ganzzahlteil" vom "Kommateil") innerhalb der Zahl "gleiten" lässt, wodurch das Speichern sehr großer aber auch sehr kleiner Zahlen (mit vielen Nachkommastellen) möglich wird. Wie auch immer, Sie können nicht sehr große Zahlen mit gleichzeitig sehr hoher Genauigkeit (sozusagen große und kleine Zahlen zur selben Zeit) speichern.

Eine weitere Einschränkung von Fließkomma-Zahlen ist, dass sie stets im Binärmodus arbeiten, weshalb sie nur die Zahlen exakt speichern können, welche mittels Multiplikation oder Division mit 2 ermittelt werden können. Dies ist insbesondere wichtig zu wissen, wenn Sie versuchen, eine Fließkommazahl in einer visuell lesbaren Form darzustellen (oder mit ihr Rechenoperationen auszuführen) - das Speichern von Zahlen wie 0.5 oder 0.125 ist einfach, da sie Divisionen von 2 sind. Das Speichern von Zahlen wie 0.11 ist schwieriger, diese wird möglicherweise als Zahl 0.10999999 gespeichert. Sie können versuchen, nur eine begrenzte Anzahl an (Nachkomma-) Stellen darzustellen, seien Sie aber nicht überrascht, wenn die Darstellung der Zahl anders aussieht, als Sie dies erwarten!

Dies gilt für alle Fließkomma-Zahlen, nicht nur die in PureBasic.

Wie der Name schon sagt, haben Doubles eine doppelte Genauigkeit (64 Bit) gegenüber der einfachen Genauigkeit von Floats (32 Bit). Wenn Sie also genauere Ergebnisse mit Fließkommazahlen erwarten, verwenden Sie Doubles anstelle von Floats.

Weitere Informationen über den 'IEEE 754' Standard erhalten Sie auf Wikipedia.

Verfasst: 31.10.2006 13:07
von stbi
ja, ok, es ist kein PB-Problem ....

Aber da so gesehen selbst 0,1 als Float nicht sauber dargestellt wird, kann man Floats eigentlich komplett vergessen. Wieder was gelernt.

Verfasst: 31.10.2006 13:09
von Kaeru Gaman
was eben daran liegt, das die darstellung auf zehnerpotenzen basiert,
die interne rechnung jedoch auf zweierpotenzen.

ich empfehle nochmals ausdrücklich Fixkomma,
für die unterschiedlichsten anwendungsbereiche.