Try this code (run it, then replace first line by Define .d and run again) and see:
Code: Select all
Define .f ; <- REPLACE BY .d AND SEE THE DIFFERENCE
Procedure.d SubstractAnglesASM(angle1.d,angle2.d); <- performs: angle1-angle2
!fldpi
!fadd st0,st0 ;<- 2*pi in st0
!fld qword[p.v_angle1]; <- angle1 in st1
!fprem1; <- remainder1 in st1
!fstp st1; <- remainder1 in st0
!fldpi
!fadd st0,st0 ;<- 2*pi in st0,remainder1 in st1
!fld qword[p.v_angle2];<- angle2 in st0, 2*pi in st1, remainder1 in st2
!fprem1; <- remainder2 in st1, remainder1 in st2
!fstp st1; <- remainder2 in st0, remainder1 in st1
!fsubp st1,st0; <- REPLACE THIS LINE BY !faddp st1,st0 TO GET AddAngles() INSTEAD OF SubstractAngles()
;To get the minimal angle:
!fldpi
!fcomi st1
!jnc near @f
!fadd st0,st0 ;<- 2*pi in st0
!fsubp st1,st0 ;<- result-2*pi
ProcedureReturn
!@@:fchs
!fcomi st1
!jc near @f
!fadd st0,st0 ;<- -2*pi in st0
!fsubp st1,st0 ;<- result+2*pi in st0
ProcedureReturn
!@@:fstp st0
ProcedureReturn
EndProcedure
Procedure.d WrapAngleSigned(angle.d); <- wraps a value into [-Pi,Pi] fringe
!fldpi
!fadd st0,st0; <- now i have 2*pi into st0
!fld qword[p.v_angle]
!fprem1
!fstp st1
ProcedureReturn
EndProcedure
Procedure.d SubstractAngles(angle1,angle2); <- performs: angle1-angle2
angle1=WrapAngleSigned(angle1)
angle2=WrapAngleSigned(angle2)
res.d=angle1-angle2
;To get the minimal angle:
If res.d<-#PI:res.d+2*#PI
ElseIf res.d>#PI:res.d-2*#PI
EndIf
ProcedureReturn res.d
EndProcedure
;It works in radians.
#Max=1000000
;Premier Test
i=0 :i1=#Max/2
Tps=ElapsedMilliseconds()
While i < #Max
angleNew=SubstractAnglesASM(i,i1)
i + 0.1:i1-0.1
Wend
Total1=ElapsedMilliseconds()-Tps
;
; ;Deuxième test
i=0 :i1=#Max/2
Tps=ElapsedMilliseconds()
While i < #Max
angleNew=SubstractAngles(i,i1)
i + 0.1 :i1-0.1
Wend
Total2=ElapsedMilliseconds()-Tps
MessageRequester("Test","SubstractAnglesASM = " + Str(Total1) + #LFCR$ + "SubstractAngles = " + Str(Total2),0)


