diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-12-15 00:49:09 -0500 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-12-15 00:49:09 -0500 |
commit | 969ddbc423238291d5c7982790bbe72720627ba4 (patch) | |
tree | 54fb3d0a0ddb08549af2704be5dff2ad5dfb1c22 /src/math/atanf.c | |
parent | 9cb589939cdbfb2fe273bef3fe557a9a162ddd73 (diff) | |
parent | a8f73bb1a685dd7d67669c6f6ceb255cfa967790 (diff) | |
download | musl-969ddbc423238291d5c7982790bbe72720627ba4.tar.gz |
Merge remote-tracking branch 'nsz/math'
Diffstat (limited to 'src/math/atanf.c')
-rw-r--r-- | src/math/atanf.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/src/math/atanf.c b/src/math/atanf.c index 4e31b902..4b59509a 100644 --- a/src/math/atanf.c +++ b/src/math/atanf.c @@ -38,28 +38,26 @@ static const float aT[] = { 6.1687607318e-02, }; -static const float huge = 1.0e30; - float atanf(float x) { float w,s1,s2,z; - int32_t ix,hx,id; + uint32_t ix,sign; + int id; - GET_FLOAT_WORD(hx, x); - ix = hx & 0x7fffffff; + GET_FLOAT_WORD(ix, x); + sign = ix>>31; + ix &= 0x7fffffff; if (ix >= 0x4c800000) { /* if |x| >= 2**26 */ - if (ix > 0x7f800000) /* NaN */ - return x+x; - if (hx > 0) - return atanhi[3] + *(volatile float *)&atanlo[3]; - else - return -atanhi[3] - *(volatile float *)&atanlo[3]; + if (isnan(x)) + return x; + z = atanhi[3] + 0x1p-120f; + return sign ? -z : z; } if (ix < 0x3ee00000) { /* |x| < 0.4375 */ if (ix < 0x39800000) { /* |x| < 2**-12 */ - /* raise inexact */ - if(huge+x>1.0f) - return x; + /* raise inexact if x!=0 */ + FORCE_EVAL(x + 0x1p120f); + return x; } id = -1; } else { @@ -91,5 +89,5 @@ float atanf(float x) if (id < 0) return x - x*(s1+s2); z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x); - return hx < 0 ? -z : z; + return sign ? -z : z; } |