Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Fließkommawerte: Darstellung von math.Err

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 19.08.2006, 00:11    Titel: Fließkommawerte: Darstellung von math.Err Antworten mit Zitat

Hallo Leute!

Ich habe eine ganz interessante Beobachtung angestellt:
Wird in freeBASIC eine Zeile wie
Code:
a = 1 / 0

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.
Code:
? 1 / 0

Ergab aber nicht etwa 0, oder sonst irgendeine Zahl; nein, auf dem Bildschirm erschien
Code:
 1.#INF


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.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
marzec



Anmeldungsdatum: 13.10.2004
Beiträge: 267

BeitragVerfasst am: 19.08.2006, 02:04    Titel: Antworten mit Zitat

joah, das nennt man nan aka. siehe

http://de.wikipedia.org/wiki/NaN

bei qb wars so das ein interrupt geschmissen wurde wenn du durch 0 dividiert hast ( cpu seitig ) der umgeleitet wurde auf eine kleine routine die die entsprechende fehlermeldung ausgab und das program beendete.
_________________
Yagl - yet another gameprogramming library
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz