|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 26.05.2005, 22:51 Titel: Ein kleiner Bug in FB? mit neuer FB 0.14b *erledigt* |
|
|
Hallo FB Freaks,
auf der Suche nach einem erklärenden Beispiel für die ULONGINT-Zahlen (das sind vorzeichenlose 64-bit-Ganzzahlen) bekam ich ein ungewöhnliches Ergebnis:
Code: | Dim x As ULongInt
Print "Diese Zuweisung geht leider nicht"
x = (2^64) -1
Print x
Print
Print "kleiner Trick und es geht"
x = (2^63)
x = x - 1 + x
Print x
Print
Print"Diese Zuweisung macht die Ungenauigkeit von Gleitkommazahlen deutlich!"
Dim y As Double
y = (2^64)-1
x = CuLngInt(y)
Print x,y," ";Hex$(x)
Print
Print "Diese Zuweisung liefert ein falsches Ergebnis,"
x = &hffffffffffffffff
Print x," ",Hex$(x)
Print
Print "aber bis &hfffffffffffffff1 wird es richtig angezeigt!"
x = &hfffffffffffffff1
Print x," ",Hex$(x)
Print
Print "Diese Zuweisung geht auch!"
x = -1
Print x," ",Hex$(x)
Sleep |
Ist das wirklich ein Bug, oder mache ich hier einen Gedankenfehler?
Hat jemand ähnliche Ungereimtheiten in FB gefunden?
Gruß
Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Zuletzt bearbeitet von volta am 28.05.2005, 20:02, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 27.05.2005, 10:49 Titel: |
|
|
Dass die erste Zuweisung nicht geht, ist nicht ungewöhnlich. Denn der Formellöser von FB bearbeitet jeden Term erst einmal einzeln, speichert zwischen und rechnet dann weiter. Da du zur Speicherung der Zahl 2^64 schon 65 bits bräuchtest, kann der Prozessor die Zahl nicht berechnen.
In ASM würde normalerweise die Zahl berechnet. Sobald der Prozessor dann feststellt, dass die Zahl nicht auf die reservierte Speicherzelle passt, würde das Overflow-Bit gesetzt, das als 65. bit funktionieren würde.
So etwas geht aber anscheinend nur bis 32bit, die der Prozessor noch "in einem Rutsch" bearbeiten kann. Für 64bit-Zahlen ist wohl etwas mehr Aufwand nötig.
Ansonsten würde er als nächstes versuchten, 0 - 1 zu berechnen (0 ist das Ergebnis von 2^64, ohne das gesetzte Overflowbit).
Und im letzten Zuweisungsbeispiel sieht man ja, dass -1 richtig interpretiert werden kann.
Dass es mit Gleitkommazahlen Probleme geben kann, ist ja schon allen bekannt
Bei deinem vierten Beispiel funktioniert aber alles so wie es soll, zumindest bei mir:
(Ausgabefenster des Programms)
Code: | Diese Zuweisung geht leider nicht
0
kleiner Trick und es geht
18446744073709551615
Diese Zuweisung macht die Ungenauigkeit von Gleitkommazahlen deutlich!
18446744073709549568 1.844674407370955e+019 fffff800
Diese Zuweisung liefert ein falsches Ergebnis,
18446744073709551615 ffffffff
aber bis &hfffffffffffffff1 wird es richtig angezeigt!
18446744073709551601 fffffff1
Diese Zuweisung geht auch!
18446744073709551615 ffffffff |
Allerdings ist es mir auch schon passiert, dass ein Programm, das auf meinem Rechner einwandfrei läuft, auf einem anderen unerwartete Ergebnisse erzielt (bzw schlicht und einfach nicht lauffähig ist...).
Könnte an hardwarespezifischen Befehlen im ASM-Code liegen... _________________ 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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 27.05.2005, 16:56 Titel: |
|
|
Hallo,
ja ich hätte meine Anzeige dazu setzen sollen.
(Auch die FB - Version 0.14b)
Code: | Diese Zuweisung geht leider nicht
0
kleiner Trick und es geht
18446744073709551615
Diese Zuweisung macht die Ungenauigkeit von Gleitkommazahlen deutlich!
18446744073709549568 1.844674407370955e+019 fffffffffffff800
Diese Zuweisung liefert ein falsches Ergebnis,
68719476735 fffffffff
aber bis &hfffffffffffffff1 wird es richtig angezeigt!
18446744073709551601 fffffffffffffff1
Diese Zuweisung geht auch!
18446744073709551615 ffffffffffffffff |
Das wird bei mir angezeigt.
Fall 1: richtig, das muss ein Overflow ergeben!
Fall 4: erstaunlich, das du da zwar die richtige Zahl, aber die falsche Hexdarstellung hast?
Fall 5: Versuch doch mal Code: | x = &hfffffffffffffff2 |
Da liegt meiner Meinung nach der Bug.
Zitat: | Könnte an hardwarespezifischen Befehlen im ASM-Code liegen... |
Mmmm...,das käme mir das erste mal unter, aber man kann es nicht ausschließen.
Am Montag werde ich das mal auf verschiedenen Rechnern / Windowsversionen testen!
Gruß
Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 27.05.2005, 20:20 Titel: |
|
|
volta hat Folgendes geschrieben: | Hallo,
ja ich hätte meine Anzeige dazu setzen sollen.
(Auch die FB - Version 0.14b)
... |
0.14b?
Wo haste die denn her
ich schätze mal, du hast dich vertippt
Bin mal gespannt, was dabei rauskommt.
Was bei mir war, siehst du ja _________________ 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 |
|
|
PeterHarder
Anmeldungsdatum: 27.03.2005 Beiträge: 45 Wohnort: Deutschland
|
Verfasst am: 27.05.2005, 23:09 Titel: |
|
|
Hallo Volta,
also, ich habe folgendes gerade mal mit GFA-Basic probiert (LonInt ist dort Large):
Code: | Dim x As Large
Print "Diese Zuweisung geht leider nicht"
x = (2 ^ 63) - 1
Print x
Stop |
Ergebnis: Dort geht es auch nicht (Overflow). Es seht dort "63" statt "64", weil Large unter GFA immer Vorzeichenbehaftet ist, aber im Prinzip kommt es auf diese Art ja auf das selbe raus.
Gruß, Peter _________________ Deutsche Mailingliste für freeBASIC: de.groups.yahoo.com/group/free-basic.
Zum Anmelden einfach eine leere E-Mail an free-basic-subscribe@yahoogroups.de senden. |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 28.05.2005, 11:21 Titel: Das Problem hat sich mit der neusten Version 0.14b erledigt. |
|
|
Hallo,
@Dusky_Joe, nein, kein Schreibfehler siehe
http://sourceforge.net/project/showfiles.php?group_id=122342 ganz unten...
(oh, beim Test der URL sehe ich gerade, daß am 27.05. eine neuererere... Version 014b raus gekommen ist.)
@PeterHarder, ja das ist bei dieser Zuweisung an ULongInt = (2^64)-1 mein Fehler gewesen, Dusky_Joe hat das oben gut beschrieben.
Bei LongInt in FB = ( 2^63 ) -1 klappt es einwandfrei.
Gruß
Volta
Ergänzung:
Das Problem hat sich mit der neusten Version 0.14b erledigt.
Alle Zuweisungen einer ULongInt werden wie erwartet richtig angezeigt.
FB Scheint nur in der Vorgängerversion falsch reagiert zu haben. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
|
|
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.
|
|