Seite 1 von 1
1.0 * Float oder Double?
Verfasst: 02.06.2014 17:16
von es_91
Hi.
Mir ist gerade aufgefallen, dass ich gar nicht weiß, ob folgende Rechnungsanweisung von PureBasic als Float oder mit doppelter Genauigkeit berechnet wird:
Könnt Ihr mir da aushelfen? Als Programmierer kommt man doch oft an den Punkt, wo man doppelte Genauigkeit braucht und dann währe es ja sinnvoll, zu wissen, ob man durch einfaches Voranschreiben von "1.0 * " eine doppelte oder einfache Genauigkeit bewirkt.
So sieht die Debugger-Ausgabe in dem Beispiel aus:
Debugger hat geschrieben:
0.66666666666666663
Das sieht mir zwar nach doppelter Genauigkeit aus, aber ich frage lieber mal nach.
Danke!

Re: 1.0 * Float oder Double?
Verfasst: 02.06.2014 18:02
von NicTheQuick
Im Normalfall nutzt du ja Variablen zum Rechnen. Dann ist ja klar mit was gerechnet wird, da du einen Typ angeben musst.
Wenn du eine konstante Rechnung über den Debugger ausgibst, kann es ja sogar sein, dass der Compiler das schon berechnet und das Ergebnis einfach hinter die Debug-Anweisung schreibt.
Also wenn du wirklich sicher gehen willst, dann nutze korrekt Typen:
Code: Alles auswählen
f.f = 1.0 * 2/3
Debug f
d.d = 1.0 * 2/3
Debug d
Debug 1.0 * 2/3
Ergibt bei mir:
0.66666668653488
0.6666666666666666296592325
0.6666666666666666296592325
Re: 1.0 * Float oder Double?
Verfasst: 02.06.2014 18:33
von STARGÅTE
hat ein bisschen von
Schrödingers Katze.
Bis zur Verwendung, ist dieser Ausdruck weder Float noch Double, denn er taucht im ASM-Code garnicht als Rechnung auf.
Erst bei der Verwendung in Rechnungen wird vom Kompiler entschieden, welchen Typ gebraucht wird.
Bei folgendem Code:
ist es sogar so, dass im ASM Code zwei "verschiedene" Konstanten verwendet werden.
für f.f wird die Float-Konstante genutzt,
für d.d wird die Double-Konstante genutzt.
Der Debugger also "Debug" benutzt immer Doubles oder Quads für Rechnungen.
Re: 1.0 * Float oder Double?
Verfasst: 04.06.2014 07:46
von Regenduft
Gerade am Quantenmechanik studieren?
Is' ja doof, dass PB nicht erst am Ende beim pushen nach Float wandelt... Gibt (manchmal) unnötige Rundungsfehler...
Ich habe das mal mit "extra krummen Werten simuliert" (keine Konstanten, damit PB nicht durch vorberechnen optimiert)
Code: Alles auswählen
EnableASM
a_d.d = 1.123
b_d.d = 2.345
c_d.d = 3.678
a_f.f = 1.123
b_f.f = 2.345
c_f.f = 3.678
f.f
; via Doubles nach Float
f = a_d * b_d / c_d
Debug f
; via Floats nach Float
f = a_f * b_f / c_f
Debug f
Debug ""
; So sieht der erzeugte FASM-Code aus:
; (hier aber Inline-Syntax für bessere Lesbarkeit)
; via Doubles nach Float
FLD a_d
FMUL b_d
FDIV c_d
FSTP f
Debug f
; via Floats nach Float
FLD a_f
FMUL b_f
FDIV c_f
FSTP f
Debug f
Re: 1.0 * Float oder Double?
Verfasst: 04.06.2014 08:45
von kernadec
Hallo
Ich hatte dieses Problem auf dem französischen forum
Das kommt von der Debugger die Ergebnisse abschneidet
die Ergebnisse sind gut mit dem Befehl StrD() oder StrF():
Herzliche Grüße
Re: 1.0 * Float oder Double?
Verfasst: 04.06.2014 09:10
von Regenduft
Falls Du Dich auf meinen Code beziehst: Da gibt's trotzdem (kleine) Rundungsfehler. Aber grundsätzlich hast Du schon recht, dass das eine Falle ist!