FloatBug in Proceduren

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Nur sind es eben nicht nur Zweierpotenzen...

Siehe:

Code: Alles auswählen

#Start = 2147483647*2
z.q = #Start
s.l = 1
Repeat
	f.f = z
	If IntQ(f) = z
		Debug Str(s) + "." + StrQ(z)
		s + 1
	EndIf
	z + 1
Until z = #Start + 20000
40 Zahlen von 20000 überlonggrössen getesteten sind fehlerfrei speicherbar.

Aber wir sollten das jetzt so langsam lassen :mrgreen:
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

100%-ig sicher kann eine Integer-Zahl mit
- Float : auf 7 Stellen
- Double : auf 15 Stellen
- Extended : auf 19 Stellen (Extended = die 80-Bit der FPU)
dargestellt werden.
Her mit 80-Bit-Variablen in PB :D !

Gruss
Helle
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ja, ist mir auch grad aufgefallen, dass es nicht nur die zweierpotenzen sind.

[edit]
@Helle
> - Float : auf 7 Stellen
> - Double : auf 15 Stellen
signifikante Stellen.
[/edit]

es müssten alle sein, bei denen nur 23 signifikante bits hintereinander stehen.

das sind dann also 2^23 zahlen für die signifikanten bits, und die
multipliziert mit der bitzahl um die ich sie shiften kann, also 42 (0-41)

also sind es 42*(2^23) = 352321536
für meinen geschmack immer noch ein verschwindend geringer teil von 18trillonen.

mir geht es auch nicht darum, mit dir zu streiten.


ich störe mich nur daran, dass in der Help "unlimitiert" steht bei floats,
und die meisten glauben das einfach so.

aber es ist schlicht und einfach unlogisch, dass man in 32bit mehr daten speichern kann, wenn man eine andere formatierung wählt.

in 32bit passen genau 32bit informationen.
mit float kann ich zwar einen wesentlich größeren zahlenbereich abdecken,
aber dafür habe ich auch einen rasant zunehmenden ungenauigkeitsbereich
wenn die zahlen größer werden.

das gleiche gilt analog für Double.

man muss sich dessen einfach bewußt sein beim programmieren,
sonst wird man bestimmte bugs niemals nicht finden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Na sicher meine ich signifikante Stellen :mrgreen: !
Hier noch ein paar Zahlen:

Code: Alles auswählen

;Float
a.l=16777216 
b.l=1
c.l=a+b
Debug c
a1.f=16777216         ;Bei Float (Single) grösste sicher darstellbare Zahl  
b1.f=1
c1.f=a1+b1
Debug c1

;Double
a2.q=9007199254740992 
b2.q=1
c2.q=a2+b2
Debug c2
a3.d=9007199254740992 ;Bei Double grösste sicher darstellbare Zahl
b3.d=1
c3.d=a3+b3
Debug c3
Gruss
Helle
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

Beitrag von NicTheQuick »

Hab den selben oder so einen ähnlichen Fehler auch gerade bekommen.

Code: Alles auswählen

Procedure test()
  q.q = 12345678

  d.d = q
EndProcedure

a = test()  ;diese Zeil auch mal auskommentieren
Debug test()
Am besten mit Debugger starten und dann auch mal die eine Zeile
auskommentieren.

Einmal entsteht ein "Invalid memory acces.", einmal bleibt das Programm
einfach stehen.

Kann mir jemand eine Lösung dafür zeigen?
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

vielleicht bin ich ja nicht ganz auf der höhe, aber eine lösung für unfug?
wieso kein procedurereturn wenn einem der rüchgabewert lieb ist?
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

@NTQ
wurde vor kurzem im englischen Board besprochen:

Code: Alles auswählen

Procedure test() 
  q.q = 12345678 
  
  d.d = PeekQ(@q )
EndProcedure 

a = test()  ;diese Zeil auch mal auskommentieren 
Debug test()
Workaround :freak:
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

Beitrag von NicTheQuick »

Fakt ist, das der Fehler nicht auftreten sollte. Wenn ich keine Quads und
Doubles in der Procedure verwende, gibt es auch keinen Fehler. Und ein
[c]ProcedureReturn[/c] bringt den selben Fehler.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

is ja gruselig...


> wurde vor kurzem im englischen Board besprochen

na hoffentlich wird auch was unternommen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Ich hoffe auch. Wir hatten ja an anderer Stelle ähnliches Problem mit Floats und Quads innerhalb einer Procedure.
Bild
Win11 Pro 64-Bit, PB_6.11b1
Gesperrt