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.