Hello,

I am trying to follow up on a question that I have had for a long time on the HP48 code for the complex acos and asin

functions...

The comment says to test against 1/sqrt(2), but the code tests against 0.7!

It looks to me that the 2 cases are there to improve precision in upper and lower octants, and that having the midpoint a

little bit off is of little to no consequences, but I wanted to see what the math guru in the forum thought about it.

cyrille

* Q := y^2/(sqrt((|x|+1)^2 + y^2) + (|x|+1))

* R := sqrt((|x|-1)^2 + y^2) +||x|-1|

* S := y^2/R if R<>0, 0 otherwise

* M := Q+R if |x|>=1, Q+S otherwise

* P := Q+S if |x|>=1, Q+R otherwise

* B := 2*x/(M+2)

* C := sqrt((P/(M+2))*(2-(P/(M+2))))

* sg(y,x) := sgn(y) if y<>0, -sgn(x) otherwise

* IM := sg(y,x)*lnp1((M/2) + sqrt((M/2)*((M/2)+2))) (sign replacement)

*

* { arccos(B) |B| <= (1/sqrt(2))

* RE1 := { arcsin(C) |B| > (1/sqrt(2)) and B >= 0

* { pi - arcsin(C) |B| > (1/sqrt(2)) and B < 0

*

* RE2 := { arcsin(B) |B| <= (1/sqrt(2))

* { sgn(B)*arccos(C) |B| > (1/sqrt(2)) (sign replacement)

*

:: C%>%% 2DUP DUP %%*SWAP %%ABS DUP %%1+ DUPDUP %%* 4PICK %%+

%%SQRT %%+ 3PICKSWAP %%/ OVER %%1 %%- %%ABS DUPDUP %%* 5PICK

%%+ %%SQRT %%+ 4ROLLOVER DUP %%0<>

ITE

%%/

:: 2DROP %%0 ;

UNROTOVER %%+ UNROT %%+ ROT %%1 %%< ?SKIPSWAP DUP %%2 %%+ ROTOVER

%%/ %%2 OVER %%- %%* %%SQRT 5PICK DUP %%+ ROT %%/ ROT %%2 %%/ DUP

%%2 %%+ OVER %%* %%SQRT %%+ %%LNP1 5ROLL 5ROLL DUP %%0=

ITE :: DROP %%0< ; :: SWAPDROP %%0>= ;

?SKIP %%CHS

UNROTDUP

%%ABS %%.7 %%<= case :: SWAPDROPDUP %%ACOSRAD SWAP %%ASINRAD ;

SWAPDUP %%ASINRAD SWAP %%ACOSRAD %%ABS

ROT %%0>= ?SEMI

%%CHS %%PI ROT %%- SWAP

;

*Edited: 9 Dec 2013, 1:46 p.m. *