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

Fragen und Bugreports zur PureBasic 4.0-Beta.
sobi
Beiträge: 170
Registriert: 05.02.2005 23:41
Wohnort: passau
Kontaktdaten:

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

Beitrag 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"?
Sorgen sind wie Blumen, wenn man sie nicht gießt, gehen sie ein.
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag von stbi »

nimm double statt float, dann kommt der Rundungsfehler nicht mehr
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
sobi
Beiträge: 170
Registriert: 05.02.2005 23:41
Wohnort: passau
Kontaktdaten:

Beitrag 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?
Sorgen sind wie Blumen, wenn man sie nicht gießt, gehen sie ein.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Ja
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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!
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
KeyPusher
Beiträge: 52
Registriert: 04.10.2006 10:56

Beitrag 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.
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Gesperrt