PB kann nicht rechnen!

Anfängerfragen zum Programmieren mit PureBasic.
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

PB kann nicht rechnen!

Beitrag 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
Gruß
Markus
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag 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
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Beitrag 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.
Gruß
Markus
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag 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
Zuletzt geändert von helpy am 27.01.2006 11:27, insgesamt 2-mal geändert.
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag 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
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Wieso?

Code: Alles auswählen

a.f = 3.5
Debug a 
b.l = a 
Debug b
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Beitrag 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!
Gruß
Markus
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag 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
Zuletzt geändert von helpy am 27.01.2006 12:07, insgesamt 2-mal geändert.
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag 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
Antworten