This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
Added atan2 implementation from uClibc
- Loading branch information
Showing
5 changed files
with
128 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
/* | ||
* ==================================================== | ||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. | ||
* | ||
* Developed at SunPro, a Sun Microsystems, Inc. business. | ||
* Permission to use, copy, modify, and distribute this | ||
* software is freely granted, provided that this notice | ||
* is preserved. | ||
* ==================================================== | ||
*/ | ||
|
||
/* __ieee754_atan2(y,x) | ||
* Method : | ||
* 1. Reduce y to positive by atan2(y,x)=-atan2(-y,x). | ||
* 2. Reduce x to positive by (if x and y are unexceptional): | ||
* ARG (x+iy) = arctan(y/x) ... if x > 0, | ||
* ARG (x+iy) = pi - arctan[y/(-x)] ... if x < 0, | ||
* | ||
* Special cases: | ||
* | ||
* ATAN2((anything), NaN ) is NaN; | ||
* ATAN2(NAN , (anything) ) is NaN; | ||
* ATAN2(+-0, +(anything but NaN)) is +-0 ; | ||
* ATAN2(+-0, -(anything but NaN)) is +-pi ; | ||
* ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2; | ||
* ATAN2(+-(anything but INF and NaN), +INF) is +-0 ; | ||
* ATAN2(+-(anything but INF and NaN), -INF) is +-pi; | ||
* ATAN2(+-INF,+INF ) is +-pi/4 ; | ||
* ATAN2(+-INF,-INF ) is +-3pi/4; | ||
* ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2; | ||
* | ||
* Constants: | ||
* The hexadecimal values are the intended ones for the following | ||
* constants. The decimal values may be used, provided that the | ||
* compiler will convert from decimal to binary accurately enough | ||
* to produce the hexadecimal values shown. | ||
*/ | ||
|
||
#include "math.h" | ||
#include "math_private.h" | ||
|
||
static const double | ||
tiny = 1.0e-300, | ||
zero = 0.0, | ||
pi_o_4 = 7.8539816339744827900E-01, /* 0x3FE921FB, 0x54442D18 */ | ||
pi_o_2 = 1.5707963267948965580E+00, /* 0x3FF921FB, 0x54442D18 */ | ||
pi = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */ | ||
pi_lo = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */ | ||
|
||
double attribute_hidden __ieee754_atan2(double y, double x) | ||
{ | ||
double z; | ||
int32_t k,m,hx,hy,ix,iy; | ||
u_int32_t lx,ly; | ||
|
||
EXTRACT_WORDS(hx,lx,x); | ||
ix = hx&0x7fffffff; | ||
EXTRACT_WORDS(hy,ly,y); | ||
iy = hy&0x7fffffff; | ||
if(((ix|((lx|-lx)>>31))>0x7ff00000)|| | ||
((iy|((ly|-ly)>>31))>0x7ff00000)) /* x or y is NaN */ | ||
return x+y; | ||
if(((hx-0x3ff00000)|lx)==0) return atan(y); /* x=1.0 */ | ||
m = ((hy>>31)&1)|((hx>>30)&2); /* 2*sign(x)+sign(y) */ | ||
|
||
/* when y = 0 */ | ||
if((iy|ly)==0) { | ||
switch(m) { | ||
case 0: | ||
case 1: return y; /* atan(+-0,+anything)=+-0 */ | ||
case 2: return pi+tiny;/* atan(+0,-anything) = pi */ | ||
case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */ | ||
} | ||
} | ||
/* when x = 0 */ | ||
if((ix|lx)==0) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; | ||
|
||
/* when x is INF */ | ||
if(ix==0x7ff00000) { | ||
if(iy==0x7ff00000) { | ||
switch(m) { | ||
case 0: return pi_o_4+tiny;/* atan(+INF,+INF) */ | ||
case 1: return -pi_o_4-tiny;/* atan(-INF,+INF) */ | ||
case 2: return 3.0*pi_o_4+tiny;/*atan(+INF,-INF)*/ | ||
case 3: return -3.0*pi_o_4-tiny;/*atan(-INF,-INF)*/ | ||
} | ||
} else { | ||
switch(m) { | ||
case 0: return zero ; /* atan(+...,+INF) */ | ||
case 1: return -zero ; /* atan(-...,+INF) */ | ||
case 2: return pi+tiny ; /* atan(+...,-INF) */ | ||
case 3: return -pi-tiny ; /* atan(-...,-INF) */ | ||
} | ||
} | ||
} | ||
/* when y is INF */ | ||
if(iy==0x7ff00000) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny; | ||
|
||
/* compute y/x */ | ||
k = (iy-ix)>>20; | ||
if(k > 60) z=pi_o_2+0.5*pi_lo; /* |y/x| > 2**60 */ | ||
else if(hx<0&&k<-60) z=0.0; /* |y|/x < -2**60 */ | ||
else z=atan(fabs(y/x)); /* safe to do y/x */ | ||
switch (m) { | ||
case 0: return z ; /* atan(+,+) */ | ||
case 1: { | ||
u_int32_t zh; | ||
GET_HIGH_WORD(zh,z); | ||
SET_HIGH_WORD(z,zh ^ 0x80000000); | ||
} | ||
return z ; /* atan(-,+) */ | ||
case 2: return pi-(z-pi_lo);/* atan(+,-) */ | ||
default: /* case 3 */ | ||
return (z-pi_lo)-pi;/* atan(-,-) */ | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters