Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 19.08.2006, 00:11 Titel: Fließkommawerte: Darstellung von math.Err |
|
|
Hallo Leute!
Ich habe eine ganz interessante Beobachtung angestellt:
Wird in freeBASIC eine Zeile wie
ausführt, so läuft das Programm im Gegensatz zu QB ganz normal fort, ungeachtet des mathematischen Fehlers.
Mich hat dabei interessiert, was denn nun das Ergebnis ist.
Ergab aber nicht etwa 0, oder sonst irgendeine Zahl; nein, auf dem Bildschirm erschien
Zuerst hielt ich dies noch für ein forgotten feature von PRINT, trotzdem war meine Neugier geweckt, und ich fing an zu Experimentieren.
Code: | DIM a AS DOUBLE
a = 1 / 0
PRINT a |
Auch hier wieder das selbe Ergebnis. Folgerung: Die Darstellung des Ergebnisses als Fehlercode ist weniger ein Feature von PRINT; tatsächlich sind DOUBLEs selbst in der Lage, Fehlercodes zu speichern!
Um das genauer zu untersuchen, ist dieses Programm entstanden:
Code: | Dim As Single a
Dim As Double b
Dim As Byte Ptr pa, pb
pa = @a
pb = @b
? "1] Darstellung von LOG(-1)"
? "~~~~~~~~~~~~~~~~~~~~~~~~~~"
a = Log(-1)
b = Log(-1)
? "Direkt SINGLE:"; a
? "Direkt DOUBLE:"; b
? "Binaer SINGLE: "; String(32, 32); _
Bin(pa[0], 8); _
Bin(pa[1], 8); _
Bin(pa[2], 8); _
Bin(pa[3], 8)
? "Binaer DOUBLE: "; _
Bin(pb[0], 8); _
Bin(pb[1], 8); _
Bin(pb[2], 8); _
Bin(pb[3], 8); _
Bin(pb[4], 8); _
Bin(pb[5], 8); _
Bin(pb[6], 8); _
Bin(pb[7], 8)
?
? "2] Darstellung von LOG(0)"
? "~~~~~~~~~~~~~~~~~~~~~~~~~"
a = 0'Log(0)
b = Log(0)
? "Direkt SINGLE:"; " -- not available --"
? "Direkt DOUBLE:"; b
? "Binaer SINGLE: "; String(32, 32); _
Bin(pa[0], 8); _
Bin(pa[1], 8); _
Bin(pa[2], 8); _
Bin(pa[3], 8)
? "Binaer DOUBLE: "; _
Bin(pb[0], 8); _
Bin(pb[1], 8); _
Bin(pb[2], 8); _
Bin(pb[3], 8); _
Bin(pb[4], 8); _
Bin(pb[5], 8); _
Bin(pb[6], 8); _
Bin(pb[7], 8)
?
? "3] Darstellung von Sqr(-1)"
? "~~~~~~~~~~~~~~~~~~~~~~~~~~"
a = Sqr(-1)
b = Sqr(-1)
? "Direkt SINGLE:"; a
? "Direkt DOUBLE:"; b
? "Binaer SINGLE: "; String(32, 32); _
Bin(pa[0], 8); _
Bin(pa[1], 8); _
Bin(pa[2], 8); _
Bin(pa[3], 8)
? "Binaer DOUBLE: "; _
Bin(pb[0], 8); _
Bin(pb[1], 8); _
Bin(pb[2], 8); _
Bin(pb[3], 8); _
Bin(pb[4], 8); _
Bin(pb[5], 8); _
Bin(pb[6], 8); _
Bin(pb[7], 8)
?
GetKey |
Ausgabe:
Code: | 1] Darstellung von LOG(-1)
~~~~~~~~~~~~~~~~~~~~~~~~~~
Direkt SINGLE: 1.#QNAN
Direkt DOUBLE: 1.#QNAN
Binaer SINGLE: 00000000000000001100000001111111
Binaer DOUBLE: 0000000000000000000000000000000000000000000000001111100001111111
2] Darstellung von LOG(0)
~~~~~~~~~~~~~~~~~~~~~~~~~
Direkt SINGLE: -- not available --
Direkt DOUBLE:-1.#INF
Binaer SINGLE: 00000000000000000000000000000000
Binaer DOUBLE: 0000000000000000000000000000000000000000000000001111000011111111
3] Darstellung von Sqr(-1)
~~~~~~~~~~~~~~~~~~~~~~~~~~
Direkt SINGLE: 1.#QNAN
Direkt DOUBLE: 1.#QNAN
Binaer SINGLE: 00000000000000001100000001111111
Binaer DOUBLE: 0000000000000000000000000000000000000000000000001111100001111111 |
(sowie 2 Warnungen "Suspicious pointer assignment")
Bei Beispiel 2 brach FB die Ausführung mit Fehler 'math. Overflow' ab, als die SINGLE-Variable noch mitgetestet wurden. Anscheinend also reichen 32bit nicht aus, um alle Fehler darzustellen.
Ich denke, es ist jedenfalls ganz interessant zu wissen, dass man unter Verwendung von DOUBLEs auch nach der Berechnung noch prüfen kann, ob ein Fehler aufgetreten ist.
Have a nice day
Ciao
Dusky_Joe _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|