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:

Ein kleiner Bug in FB? mit neuer FB 0.14b *erledigt*

 
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
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 26.05.2005, 21:51    Titel: Ein kleiner Bug in FB? mit neuer FB 0.14b *erledigt* Antworten mit Zitat

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, 19:02, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



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

BeitragVerfasst am: 27.05.2005, 09:49    Titel: Antworten mit Zitat

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 zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 27.05.2005, 15:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



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

BeitragVerfasst am: 27.05.2005, 19:20    Titel: Antworten mit Zitat

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 zwinkern
ich schätze mal, du hast dich vertippt zwinkern

Bin mal gespannt, was dabei rauskommt.
Was bei mir war, siehst du ja zwinkern
_________________
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
PeterHarder



Anmeldungsdatum: 27.03.2005
Beiträge: 45
Wohnort: Deutschland

BeitragVerfasst am: 27.05.2005, 22:09    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 28.05.2005, 10:21    Titel: Das Problem hat sich mit der neusten Version 0.14b erledigt. Antworten mit Zitat

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... zwinkern 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
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