Seite 1 von 4

PB kann nicht rechnen!

Verfasst: 27.01.2006 10:20
von Gimbly
Hallo,

habe ziemlich lange einen vermeintlichen Bug in meinem Code gesucht, bis ich feststellte, das PB 3.94 doch tatsächlich 100 * 0.6 = 60.000004 rechnet!

Code: Alles auswählen

Debug 100 * 0.6

Verfasst: 27.01.2006 10:58
von helpy
Und so stimmts wieder:

Code: Alles auswählen

Debug 100.0*0.6 - 60
:-)

Mal im Ernst: Das ist wohl die ganz normale Rechenungenauigkeit, die bei Fließkommezahlen nun mal auftritt!

cu, helpy

Verfasst: 27.01.2006 11:11
von Gimbly
Das ist überhaupt nicht normal.

Probier mal folgendes:

Code: Alles auswählen

Debug Round(100.0*0.6,1)
PB errechnet dann 61!

Das gibts in keiner anderen Programmiersprache.

Verfasst: 27.01.2006 11:21
von remi_meier
Doch das ist normal, aber benutz nicht den Round() Befehl, der macht nicht,
was er sagt! Weise den Wert einfach einer Long-Variable zu und er wird
richtig gerundet:

Code: Alles auswählen

a.f = 100 * 0.6
Debug a
b.l = a
Debug b

Verfasst: 27.01.2006 11:23
von helpy
Gimbly hat geschrieben:Das ist überhaupt nicht normal.

Probier mal folgendes:

Code: Alles auswählen

Debug Round(100.0*0.6,1)
PB errechnet dann 61!

Das gibts in keiner anderen Programmiersprache.
Schau Dir mal die Beschreibung der Funktion Round() an!

Code: Alles auswählen

Result.f = Round(Number.f, Mode)
Wenn Mode=1, dann wird aufgerundet!
Wenn Mode=0, dann wird abgerundet!

Round() ist lt. PB-Hilfe keine intelligente Runden-Funktion, die Zahlen abhängig vom Nachkomma-Anteil auf- oder abrunden.

cu, helpy

Verfasst: 27.01.2006 11:26
von helpy
remi_meier hat geschrieben:Doch das ist normal, aber benutz nicht den Round() Befehl, der macht nicht,
was er sagt! Weise den Wert einfach einer Long-Variable zu und er wird
richtig gerundet:

Code: Alles auswählen

a.f = 100 * 0.6
Debug a
b.l = a
Debug b
Naja, mit einer "intelligenten" Runden-Funktion ist das nicht vergleichbar! ... entspricht eher der Int() Funktion!

cu, helpy

Verfasst: 27.01.2006 11:45
von remi_meier
Wieso?

Code: Alles auswählen

a.f = 3.5
Debug a 
b.l = a 
Debug b

Verfasst: 27.01.2006 11:53
von Gimbly
helpy hat geschrieben:Wenn Mode=1, dann wird aufgerundet!
Wenn Mode=0, dann wird abgerundet!
Was in der Hilfe steht ist mir schon klar.

100.0 * 0.6 ergibt 60, und 60 aufgerundet ergibt immer noch 60 und nicht 61.

Das ist ganz klar ein Bug!

Danke remi_meier, so funktioniert es, ist aber nur ne Notlösung!

Verfasst: 27.01.2006 12:00
von helpy
Gimbly hat geschrieben:
helpy hat geschrieben:Wenn Mode=1, dann wird aufgerundet!
Wenn Mode=0, dann wird abgerundet!
Was in der Hilfe steht ist mir schon klar.

100.0 * 0.6 ergibt 60, und 60 aufgerundet ergibt immer noch 60 und nicht 61.

Das ist ganz klar ein Bug!
Seh' ich nicht so!

Wenn das Ergebnis von [c]100.0 * 0.6 = 60.000004[/c] ist, dann ist diese Zahl aufgerundet 61!

Woher soll der Befehl Round() wissen, dass das Ergebnis eigentlich 60.0 sein soll, wenn durch die einfache Fließkommagenauigkeit (eigentlich ist es ja eine Fließkommaungenauigkeit) der Wert 60.000004 entsteht, und somit der Befehl Round() eben nicht den Wert 60.0 erhält?

Code: Alles auswählen

a.f = 60.123450
Debug a ; ergibt 60.123451
cu, helpy

Verfasst: 27.01.2006 12:03
von helpy
remi_meier hat geschrieben:Wieso?

Code: Alles auswählen

a.f = 3.5
Debug a 
b.l = a 
Debug b
Wow!!!

Dann ist [c]b.l = a.f[/c] besser zum Runden geeignet als Round() !!!

cu, helpy