Toleranzen von Double und Float

Für allgemeine Fragen zur Programmierung mit PureBasic.
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: Toleranzen von Double und Float

Beitrag von SMaag »

Oha! Wieder was dazu gelernt!

Eine Abs für Int() gibt es aber wohl nicht! Oder täusch ich mich da!

Sonst würde ich das in Zukunft so machen!

Code: Alles auswählen


; val >>63 erzeugt 0 oder -1, da PB mit >> ein arthmeitschen Shift durchführt
; (val Xor (val >> 63) ist also identisch mit If Sign(val) : NOT val : Endif 
; Dann muss noch bedingt 1 addiert werden, damit gibt das dann NEG val.
; (val >> 63) &1  erzeugt eine 1, wenn Sign Bit gesetzt
Macro mac_AbsQ(val)
  (val ! (val >> 63) + (val >> 63) &1)
EndMacro

Macro mac_AbsInt(val)
  If val < 0 : val = -val : EndIf  
EndMacro


Define.q Q, r

Q = -100000000000000005
r = mac_AbsQ(Q)

Debug r
Debug Abs(Q)

r = Q
mac_AbsInt(r)
Debug r


SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: Toleranzen von Double und Float

Beitrag von SMaag »

jetz nochmal zurück zum Abs(), wenn ich das Beispiel mit -100000000000000005

etwas abgewandelt probiere, dann geht's, obwohl der direkte Print von
Abs() die 5 entfernt. Wenn man über Variablen geht, kommt 100000000000000005
raus. Ich hab jetzt längere Zeit ein Suchschleife laufen lass, die Werte findet, bei
denen es nicht stimmt. Aber nichts gefunden.

anscheinend ist wirklich ein ABS für Int überlagert!

Code: Alles auswählen

EnableExplicit

Macro mac_AbsInt(val)
  If val < 0 : val = -val : EndIf  
EndMacro

Define.q Q, r, s

Q= -100000000000000005


r = Abs(Q)
s = Q
mac_AbsInt(s)

Debug r
Debug s
Debug Abs(Q)


Antworten