My small modification to E?in's version is that my macro assumes that st(0) already contains the input float...
arc cosine of 0.5f is 60 degrees.
We can use this knowledge to test the macro:
We can see that the answer is nothing like the 60 degrees it should be.
Does anyone see the error in the macro, or has a working acos?
(I've asked this before :( )
facos MACRO
fmul st(0), st(0)
fld1
fsubr
fsqrt
fxch
fpatan
ENDM
arc cosine of 0.5f is 60 degrees.
We can use this knowledge to test the macro:
;Get arc cosine of 0.5f
fld fphalf
facos
;Now multiply by (180/pi) to convert radians to degrees
fld fp180
fldpi
fdiv
fmul
;Now store the angle value to a dword
fistp dwAngle
We can see that the answer is nothing like the 60 degrees it should be.
Does anyone see the error in the macro, or has a working acos?
(I've asked this before :( )
Nevermind, I sorted it out.
The problem was that the float parameter needs to be loaded TWICE onto the fpu for facos.
The output is an angle in floating radians, which can be converted to degrees as shown in the previous post.
My bad :)
The problem was that the float parameter needs to be loaded TWICE onto the fpu for facos.
facos MACRO
fmul st(0), st(0)
fsubr fp1
fsqrt
fxch
fpatan
ENDM
;Use it like this...
fld fphalf
fld fphalf
facos
The output is an angle in floating radians, which can be converted to degrees as shown in the previous post.
My bad :)
Here's another version from a runtime lib :)
facos MACRO
fld1
fadd st(0), st(1)
fld1
fsub st(0), st(2)
fmulp st(1), st(0)
fsqrt
fxch st(1)
fpatan
ENDM