Code: Alles auswählen
#max_a=127
#max_b=255
#max_u=32767
CompilerIf #PB_Unicode
#max_c=#max_u
CompilerElse
#max_c=#max_b
CompilerEndIf
#max_w=32767
#max_l=2147483647
#max_q=9223372036854775807
CompilerIf #PB_Compiler_Processor=#PB_Processor_x86
#max_i=#max_l
CompilerElse
#max_i=#max_q
CompilerEndIf
Macro _createcheck(type)
Procedure CheckMul#type(a.type,b.type)
If a<0:a=-a:EndIf
If b<0:b=-b:EndIf
If a=0 Or b=0 Or a=1 Or b=1
ProcedureReturn #True
EndIf
ProcedureReturn Bool( #max_#type/b>=a )
EndProcedure
EndMacro
_createcheck(w)
_createcheck(l)
_createcheck(q)
Define c.q,cc.q
Define i
Define k
c=15:cc=15
k=15
For i=2 To 29
k=-k
c=cc*k
Debug "I:"+i+" c:"+c
If Not CheckMulQ(cc,k)
Debug "NICHT SICHER!"
EndIf
;zweiter check....
If (c<cc And c>0) Or (-c<cc And c<0)
Debug "c überlauf!"+i
ElseIf c>0
cc=c
Else
cc=-c
EndIf
Next
Debug c
Alternativ könnte man auch in double berechnen und vergleichen - nur die Genauigkeit reicht für Quad nicht mehr aus.
Ich weis, das in Assembler es ein schönes Flag gibt, das man einfach überprüfen kann. Leider hab ich keine Ahnung, wie ich darauf zugreifen kann. Das wäre natürlich endlos eleganter.
Sollte dann aber in 64 oder 32-Bit funktionieren.
Edit: einfacheres Beispiel
