Seite 1 von 1

Problem mit Quads

Verfasst: 10.03.2013 14:17
von STARGÅTE
Sagt mal Leute, kann mir hier mal einer Sagen, ob ich übermüdet bin, oder kann PB nicht mehr mit Quads rechnen?

Code: Alles auswählen

q.q = 100000000
q   -  99999990 
Debug q

q.q = 1000000000
q   -  999999990 
Debug q

q.q = 10000000000
q   -  9999999990 
Debug q

q.q = 100000000000
q   -  99999999990
Debug q

q.q = 1000000000000
q   -  999999999990 
Debug q
10
10
8589934602
98784247818
1000727379978

Re: Problem mit Quads

Verfasst: 10.03.2013 14:20
von cxAlex
Ergibt bei mir:
10
10
10
10
10
Win 7 x64 PB 5.1 x86/x64

Gruß, Alex

Re: Problem mit Quads

Verfasst: 10.03.2013 14:24
von - chris -
Bei mit sieht es so aus:

mit 32bit

Code: Alles auswählen

10
10
10
10
10
mit 64bit

Code: Alles auswählen

10
10
8589934602
98784247818
1000727379978

Re: Problem mit Quads

Verfasst: 10.03.2013 14:27
von Danilo
- chris - hat geschrieben:Bei mit sieht es so aus

mit 32bit

Code: Alles auswählen

10
10
10
10
10
mit 64bit

Code: Alles auswählen

10
10
8589934602
98784247818
1000727379978
Bei mir ebenfalls. Kann es sein, das PB die Zahl hinter dem Minus nicht als Quad castet oder bei der Konvertierung zu ASM etwas falsch macht?

Als Variable funktioniert es dann auch korrekt, nur "direkt" eben nicht:

Code: Alles auswählen

q.q = 100000000
q   -  99999990 
Debug q

q.q = 1000000000
q   -  999999990
Debug q

q.q  = 10000000000
q2.q = 9999999990
q    - q2
Debug q

q.q  = 100000000000
q2.q =  99999999990
q    - q2
Debug q

q.q  = 1000000000000
q2.q =  999999999990 
q    - q2
Debug q

Der ASM-Ausschnitt von STARGÅTEs Original mit PB5.10 x64:

Code: Alles auswählen

; q.q = 100000000
  MOV    qword [v_q],100000000
; q   -  99999990
  MOV    r15,qword [v_q]
  ADD    r15,-99999990                 ; OK
  MOV    qword [v_q],r15
; Debug q
; 
; q.q = 1000000000
  MOV    qword [v_q],1000000000
; q   -  999999990
  MOV    r15,qword [v_q]
  ADD    r15,-999999990                ; OK
  MOV    qword [v_q],r15
; Debug q
; 
; q.q = 10000000000
  MOV    rax,10000000000
  MOV    qword [v_q],rax
; q   -  9999999990
  MOV    r15,qword [v_q]
  ADD    r15,-1410065398               ; ?
  MOV    qword [v_q],r15
; Debug q
; 
; q.q = 100000000000
  MOV    rax,100000000000
  MOV    qword [v_q],rax
; q   -  99999999990
  MOV    r15,qword [v_q]
  ADD    r15,-1215752182               ; ?
  MOV    qword [v_q],r15
; Debug q
; 
; q.q = 1000000000000
  MOV    rax,1000000000000
  MOV    qword [v_q],rax
; q   -  999999999990
  ADD    qword [v_q],727379978        ; ?
; Debug q

Re: Problem mit Quads

Verfasst: 10.03.2013 14:33
von Josh
gleiches Ergebnis wie bei Chris hier:

Win7 32: ok
Win7 64: flasch

Re: Problem mit Quads

Verfasst: 10.03.2013 14:41
von STARGÅTE
Alles klar, ist im englischen Forum gepostet.

Frage wäre jetzt, wieso es bei cxAlex kein Problem gibt ? ^^

Re: Problem mit Quads

Verfasst: 10.03.2013 14:44
von cxAlex
Frage wäre jetzt, wieso es bei cxAlex kein Problem gibt ? ^^
Mein Fehler, ich hatte in der Compilerauswahl umgeschalten aber dann auf "cancel" geklickt ... :oops:

Unter x64 zeigt sich mit jetzt auch dasselbe Bild. Aber ich denke ich habe den Fehler gefunden:

Ich habe folgenden Code:

Code: Alles auswählen

q.q = 100000000
q   -  99999990 
MessageRequester("",Str(q))

q.q = 1000000000000
q   -  999999999990 
MessageRequester("",Str(q))
per "pbcompiler /commented test.pb" als ASM Source ausgeben lassen. Die Stellen auf die es ankommt sind wohl:

Code: Alles auswählen

; q.q = 100000000
  MOV    qword [v_q],100000000
; q   -  99999990 
  MOV    r15,qword [v_q]
  ADD    r15,-99999990
Und

Code: Alles auswählen

; q.q = 1000000000000
  MOV    rax,1000000000000
  MOV    qword [v_q],rax
; q   -  999999999990 
  ADD    qword [v_q],727379978
Der PB - Compiler erkennt den Quad zwar richtig, aber ich vermute die Variable die intern den Wert speichert (da das ganze nicht über eine 2. Quad - Variable geht, wo es ja funktioniert) und negiert (und das Ganze damit von einer Subtraktion auf eine Addition umwandelt) ist ein Long und fließt hier über.