Seite 1 von 1
[PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U.a.
Verfasst: 24.01.2015 18:39
von NicTheQuick
Hallo,
könnt ihr bitte mal schauen, ob der Bug bei euch auch auftritt? Ihr braucht ein 64-Bit System und natürlich auch PB in der 64-Bit Version.
Hier kommt ein falscher Wert raus.
Hier der richtige.
Außerdem kommt hier kein CompilerError wegen einer zu hohen Zahl:
Code: Alles auswählen
Define i.q = 123456789012345678901
Debug StrU(i, #PB_Quad)
Diese Zahl ist nämlich größer als 64 Bit und sollte vom Compiler zurück gewiesen werden. Schreibt man noch eine 2 dahinter, funktioniert das auch.
Andererseits geht das hier zwar nicht:
Aber so schon:
Und so auch:
Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U
Verfasst: 24.01.2015 18:48
von RSBasic
Getestet mit: PB 5.31 x64
NicTheQuick hat geschrieben:
Ausgabe hat geschrieben:
3755744309
NicTheQuick hat geschrieben:
Ausgabe hat geschrieben:
12345678901
NicTheQuick hat geschrieben:Code: Alles auswählen
Define i.q = 123456789012345678901
Debug StrU(i, #PB_Quad)
Ausgabe hat geschrieben:
12776324570088369205
NicTheQuick hat geschrieben:
Ausgabe hat geschrieben:
Numerical overflow: too many digits.
NicTheQuick hat geschrieben:
Ausgabe hat geschrieben:
123456789012345680000.0
NicTheQuick hat geschrieben:
Ausgabe hat geschrieben:
123456789012345670000.0
Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U
Verfasst: 24.01.2015 18:57
von NicTheQuick
Danke, RSBasic.
Das ist jetzt sogar noch interessanter geworden. Bei mir sieht es nämlich bei den letzten Tests so aus:
123456789012345667584.0
Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U
Verfasst: 24.01.2015 18:58
von Nino
NicTheQuick hat geschrieben:Hallo,
könnt ihr bitte mal schauen, ob der Bug bei euch auch auftritt? Ihr braucht ein 64-Bit System und natürlich auch PB in der 64-Bit Version.
Hier kommt ein falscher Wert raus.
Hier der richtige.
Das kann ich bestätigen (PB 5.31 x64) unter Windows 7).
Allerdings:
Hilfe zu StrU() hat geschrieben:Konvertiert eine vorzeichenlose Zahl in einen String.
Zwar ist 12345678901 vorzeichenlos, aber evtl. ist mit dem Satz in der Hilfe nicht die Zahl selbst gemeint, sondern der Variablentyp. Dieser ist in Deinem Beispiel ja Integer und damit vorzeichenbehaftet. Nur so eine Idee ...
Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U
Verfasst: 24.01.2015 19:03
von NicTheQuick
Nino hat geschrieben:Allerdings:
Hilfe zu StrU() hat geschrieben:Konvertiert eine vorzeichenlose Zahl in einen String.
Zwar ist 12345678901 vorzeichenlos, aber evtl. ist mit dem Satz in der Hilfe nicht die Zahl selbst gemeint, sondern der Variablentyp. Dieser ist in Deinem Beispiel ja Integer und damit vorzeichenbehaftet. Nur so eine Idee ...
'StrU()' wurde eingefügt um eigentlich negative Zahlenwerte so in einen String umwandeln zu können als ob sie in einer unsigned Variablen gespeichert wären. Siehe auch dieses Beispiel:
Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U
Verfasst: 24.01.2015 19:49
von Nino
@NickTheQuick:
Danke für die Erklärung!
Dann ist aber der Satz aus der Hilfe, den ich zitiert hatte, komplett irreführend. Ebenso wie dieser Satz:
Ganzzahlen (mit Vorzeichen) müssen mit dem Befehl Str() [...] konvertiert werden.
In der Hilfe zu StrU() sollte wohl besser etwa folgendes stehen:
"Konvertiert eine Ganzzahl (Quad) in einen String. Das Ergebnis der Konvertierung ist immer vorzeichenlos.
Um bei der Konvertierung einer vorzeichenbehafteten Ganzzahl in einen String das Vorzeichen zu erhalten, muss der Befehl Str() benutzt werden."
Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U
Verfasst: 24.01.2015 20:35
von STARGÅTE
- Für StrU() ist #PB_Integer garnicht definiert (zumindest laut Hilfe!)
- Ja hier stimme ich dir zu, es sollte wie bei Longs ein Fehler gemeldet werden.
- Hier kann ich wieder nicht zustimmen. PB erlaubt generell nur zwanzig Präzisionsstellen.
Klar kannst du mit Doubles sehr große Zahlen definieren, dann aber so:
Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U
Verfasst: 24.01.2015 22:30
von NicTheQuick
STARGÅTE hat geschrieben:Für StrU() ist #PB_Integer garnicht definiert (zumindest laut Hilfe!)
Du hast Recht. Da war ich wohl zu naiv.
STARGÅTE hat geschrieben:
Hier kann ich wieder nicht zustimmen. PB erlaubt generell nur zwanzig Präzisionsstellen.
Klar kannst du mit Doubles sehr große Zahlen definieren, dann aber so:
Ich finde es halt etwas inkonsequent, dass ValD() nichts gegen ewig lange Zahlenreihen hat, der Compiler selbst aber schon.