From 797b00817a9ecfb6e13badf1aa2b88ff87acc2ac Mon Sep 17 00:00:00 2001 From: Raymond Toy <toy.raymond@gmail.com> Date: Sat, 2 Aug 2014 15:43:49 -0700 Subject: [PATCH] Fix up atan2 by using unions. --- src/lisp/e_atan2.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/lisp/e_atan2.c b/src/lisp/e_atan2.c index 4e731baa3..f4c1c1234 100644 --- a/src/lisp/e_atan2.c +++ b/src/lisp/e_atan2.c @@ -63,11 +63,15 @@ pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */ double z; int k,m,hx,hy,ix,iy; unsigned lx,ly; + union { int i[2]; double d; } ux; + union { int i[2]; double d; } uy; - hx = __HI(x); ix = hx&0x7fffffff; - lx = __LO(x); - hy = __HI(y); iy = hy&0x7fffffff; - ly = __LO(y); + ux.d = x; + hx = ux.i[HIWORD]; ix = hx&0x7fffffff; + lx = ux.i[LOWORD]; + uy.d = y; + hy = uy.i[HIWORD]; iy = hy&0x7fffffff; + ly = uy.i[LOWORD]; if(((ix|((lx|-lx)>>31))>0x7ff00000)|| ((iy|((ly|-ly)>>31))>0x7ff00000)) /* x or y is NaN */ return x+y; @@ -114,7 +118,10 @@ pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */ else z=atan(fabs(y/x)); /* safe to do y/x */ switch (m) { case 0: return z ; /* atan(+,+) */ - case 1: __HI(z) ^= 0x80000000; + case 1: + ux.d = z; + ux.i[HIWORD] ^= 0x80000000; + z = ux.d; return z ; /* atan(-,+) */ case 2: return pi-(z-pi_lo);/* atan(+,-) */ default: /* case 3 */ -- GitLab