Bug mit Floats, Beispiel   1.1e+27

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Bug mit Floats, Beispiel   1.1e+27

Beitrag von AND51 »

Hallo!

1.1 mal 10 hoch 27 müsste doch 1.100.000.000.000.000.000.000.000.000 (26 Nullen) sein, oder?
Ist es laut PB aber nicht:

Code: Alles auswählen

Debug 1.1e+27 ; Neue Schreibweise, eingeführt in PB 4.00
Debug 1.1*Pow(10, 27)
Debug 1.1*(10000000000*10000000000*10000000)
Debug 1.1*10000000000*10000000000*10000000
Interessant finde ich dabei, dass die letzten beiden Ergebnisse sich unterscheiden. Ist sicher wegen etwas PB internem...

Was sagt ihr dazu?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Bug mit Floats, Beispiel 1.1e+27

Beitrag von DarkDragon »

AND51 hat geschrieben:Hallo!

1.1 mal 10 hoch 27 müsste doch 1.100.000.000.000.000.000.000.000.000 (26 Nullen) sein, oder?
Ist es laut PB aber nicht:

Code: Alles auswählen

Debug 1.1e+27 ; Neue Schreibweise, eingeführt in PB 4.00
Debug 1.1*Pow(10, 27)
Debug 1.1*(10000000000*10000000000*10000000)
Debug 1.1*10000000000*10000000000*10000000
Interessant finde ich dabei, dass die letzten beiden Ergebnisse sich unterscheiden. Ist sicher wegen etwas PB internem...

Was sagt ihr dazu?
Das ist die Ungenauigkeit von Fließkommazahlen nach dem IEEE 754 Standard.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Aha. mein Beispiel geht nur bis 1e+27, aber macht es da überhaupt Sinn, in PureBasic den Breich 1e+308 anzubieten?? Wenn schon in diesem kleinen Bereich Ungenauigkeiten auftreten...
Variablen, Typen und Operatioren (ganz unten) hat geschrieben:Der genaue Wertebereich, in dessen Rahmen beim Rechnen mit Floats und Doubles korrekte Ergebnisse erzielt werden, sieht wie folgt aus:
Float: +- 1.175494e-38 bis +- 3.402823e+38
Double: +- 2.2250738585072013e-308 bis +- 1.7976931348623157e+308
Ich habe nämlich mal getestet:

Code: Alles auswählen

Debug 1.1e-51
gibt 0.0 (null) aus...

Oder habe ich etwas Grundlegendes nicht verstanden??
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

AND51 hat geschrieben:Aha. mein Beispiel geht nur bis 1e+27, aber macht es da überhaupt Sinn, in PureBasic den Breich 1e+308 anzubieten??
Variablen, Typen und Operatioren (ganz unten) hat geschrieben:Der genaue Wertebereich, in dessen Rahmen beim Rechnen mit Floats und Doubles korrekte Ergebnisse erzielt werden, sieht wie folgt aus:
Float: +- 1.175494e-38 bis +- 3.402823e+38
Double: +- 2.2250738585072013e-308 bis +- 1.7976931348623157e+308
Ja, denn man kann ja auch mit ungenauen Zahlen weiterrechnen. Einen festen Bereich, wie er in der Hilfe steht gibt es nicht, da es auch auf den Inhalt der Zahl ankommt.

PureBasic kann darin kaum etwas falsch machen. Wahrscheinlicher ist es, dass dein Prozessor etwas falsch macht, denn der rechnet damit, nicht PureBasic.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Aha Ja Ok Also...
Klingt einleuchtend!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Der in der Hilfe angegebene Wertebereich ist korrekt. PB (besser: die FPU) rechnet innerhalb dieses Wertebereiches mit den jeweiligen Genauigkeiten (Float=7 signifikante Stellen, Double =15) richtig. Der Anwender muss allerdings selber für die Anzeige sorgen:

Code: Alles auswählen

Debug StrD(1.1e-51,70)
Siehe auch:

Code: Alles auswählen

Debug StrD(1.1e-250,280)
Rechen-Beispiel:

Code: Alles auswählen

A.d=1.1e-300
B.d=4.4e100
C.d=A*B
Debug StrD(C,250)
Gruß
Helle
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Cool, danke für die Info!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten