Need help understanding math.... cyrille de Brébisson Member Posts: 193 Threads: 10 Joined: Mar 2008 12-09-2013, 01:40 PM 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. Han Senior Member Posts: 709 Threads: 104 Joined: Nov 2005 12-09-2013, 02:04 PM Edited for legibility: Quote: 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 ; ``` cyrille de Brébisson Member Posts: 193 Threads: 10 Joined: Mar 2008 12-09-2013, 03:17 PM thanks, I tried 4 times but could not get it to take my CR properly! cyrille Walter B Posting Freak Posts: 4,587 Threads: 105 Joined: Jul 2005 12-09-2013, 03:29 PM Once read that rats learn it with four times ;-) SCNR Jeff O. Posting Freak Posts: 875 Threads: 37 Joined: Jul 2005 12-09-2013, 03:42 PM You just need to enclose your formatted text between [pre] and [/pre] tags. Paul Dale Posting Freak Posts: 3,229 Threads: 42 Joined: Jul 2006 12-09-2013, 11:44 PM I've not put any effort into investigating this and am really just guessing, however I suspect that your intuition here is correct. That area of the sine and cosine functions is pretty smooth and well behaved -- essentially linear over the reals and I don't think it goes weird as one moves away from the real line. I'd guess it was a case of 0.7 being an existing constant that was near enough. Depending on how the comparison is coded, it might be very slightly faster too but unlikely enough to notice. - Pauli David Hayden Senior Member Posts: 528 Threads: 40 Joined: Dec 2008 12-12-2013, 05:28 PM I don't understand the comments in this code. What are Q, R, S, M, P, B, and C? Is RE1 the real part of stack level 1? RE2 is real part of stack level 2? IM is imaginary part of... both? Just curious. Dave Raymond Del Tondo Posting Freak Posts: 1,841 Threads: 54 Joined: Jul 2005 12-12-2013, 05:42 PM Quote:I'd guess it was a case of 0.7 being an existing constant that was near enough. Depending on how the comparison is coded, it might be very slightly faster too but unlikely enough to notice.Actually the constant is defined in that code slice, and not a call to a constant defined elsewhere, thus saving one pointer resolution time cycle. I'm confident the common code for complex ASIN and ACOS dates back to the Paladin, so could simply be a LISARIF (Bill Wickes) Didier Lachieze Member Posts: 248 Threads: 5 Joined: Feb 2008 12-13-2013, 02:23 AM Quote:I'm confident the common code for complex ASIN and ACOS dates back to the Paladin, so could simply be a LISARIF (Bill Wickes) Some decoding for people who - like me - would need it: Paladin: internal hp code name for the HP-28C LISARIF: "Life is Short and ROM is Full" a famous quote from Bill Wickes (see the original source) Thomas Klemm Senior Member Posts: 735 Threads: 34 Joined: May 2007 12-16-2013, 06:59 PM HTH Thomas « Next Oldest | Next Newest »

 Possibly Related Threads... Thread Author Replies Views Last Post OT: a math competition site Pier Aiello 0 518 09-16-2013, 06:03 AM Last Post: Pier Aiello Simple Math Question Namir 2 714 08-09-2013, 06:13 PM Last Post: Eddie W. Shore Cool math clock Bruce Bergman 28 3,440 04-10-2013, 03:13 AM Last Post: Siegfried (Austria) Math Challenge I could not solve Meindert Kuipers 22 2,807 01-05-2013, 04:43 PM Last Post: Thomas Klemm Math Question Namir 0 452 11-06-2012, 07:43 AM Last Post: Namir Understanding HP-16C integer division Jimi 18 2,525 10-16-2012, 09:13 PM Last Post: Eddie W. Shore Survey for Special Math Problem Namir 7 1,320 06-03-2012, 09:46 PM Last Post: Namir math question Don Shepherd 22 2,550 04-25-2012, 11:38 PM Last Post: Don Shepherd Math Help!! Namir 10 1,568 04-16-2012, 11:32 PM Last Post: Allen go41cx overlay Math module Alexander Oestert 12 1,881 02-04-2012, 05:09 AM Last Post: Alexander Oestert

Forum Jump: