[PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U.a.

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

[PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U.a.

Beitrag 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.

Code: Alles auswählen

Define i.i = 12345678901
Debug StrU(i, #PB_Integer)
Hier der richtige.

Code: Alles auswählen

Define i.i = 12345678901
Debug StrU(i, #PB_Quad)
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:

Code: Alles auswählen

Define i.d = 123456789012345670000.0
Debug i
Aber so schon:

Code: Alles auswählen

Define i.d = 12345678901234567.0
i * 10000
Debug i
Und so auch:

Code: Alles auswählen

Define i.d = ValD("123456789012345670000.0")
Debug i
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U

Beitrag von RSBasic »

Getestet mit: PB 5.31 x64
NicTheQuick hat geschrieben:

Code: Alles auswählen

Define i.i = 12345678901
Debug StrU(i, #PB_Integer)
Ausgabe hat geschrieben: 3755744309
NicTheQuick hat geschrieben:

Code: Alles auswählen

Define i.i = 12345678901
Debug StrU(i, #PB_Quad)
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:

Code: Alles auswählen

Define i.d = 123456789012345670000.0
Debug i
Ausgabe hat geschrieben: Numerical overflow: too many digits.
NicTheQuick hat geschrieben:

Code: Alles auswählen

Define i.d = 12345678901234567.0
i * 10000
Debug i
Ausgabe hat geschrieben: 123456789012345680000.0
NicTheQuick hat geschrieben:

Code: Alles auswählen

Define i.d = ValD("123456789012345670000.0")
Debug i
Ausgabe hat geschrieben: 123456789012345670000.0
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U

Beitrag von NicTheQuick »

Danke, RSBasic.

Das ist jetzt sogar noch interessanter geworden. Bei mir sieht es nämlich bei den letzten Tests so aus:

Code: Alles auswählen

Define i.d = ValD("123456789012345670000.0")
Debug i
123456789012345667584.0
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U

Beitrag 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.

Code: Alles auswählen

Define i.i = 12345678901
Debug StrU(i, #PB_Integer)
Hier der richtige.

Code: Alles auswählen

Define i.i = 12345678901
Debug StrU(i, #PB_Quad)
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 ...
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U

Beitrag 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:

Code: Alles auswählen

Define i.l = -1
Debug Str(i)
Debug StrU(i, #PB_Long)
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U

Beitrag 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."
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U

Beitrag von STARGÅTE »

  1. Code: Alles auswählen

    Define i.i = 12345678901
    Debug StrU(i, #PB_Integer)
    Für StrU() ist #PB_Integer garnicht definiert (zumindest laut Hilfe!)
  2. Code: Alles auswählen

    Define i.q = 123456789012345678901
    Ja hier stimme ich dir zu, es sollte wie bei Longs ein Fehler gemeldet werden.
  3. Code: Alles auswählen

    Define i.d = 123456789012345670000.0
    Debug i
    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:

    Code: Alles auswählen

    Define i.d = 12345678901234567e4
    Debug i
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: [PB 5.30 x64] StrU(i, #PB_Integer): falsches Ergebnis. U

Beitrag von NicTheQuick »

STARGÅTE hat geschrieben:

Code: Alles auswählen

Define i.i = 12345678901
Debug StrU(i, #PB_Integer)
Für StrU() ist #PB_Integer garnicht definiert (zumindest laut Hilfe!)
Du hast Recht. Da war ich wohl zu naiv. :mrgreen:
STARGÅTE hat geschrieben:

Code: Alles auswählen

Define i.d = 123456789012345670000.0
Debug i
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:

Code: Alles auswählen

Define i.d = 12345678901234567e4
Debug i
Ich finde es halt etwas inkonsequent, dass ValD() nichts gegen ewig lange Zahlenreihen hat, der Compiler selbst aber schon.
Antworten