X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ftanl.c;h=60e6637613f2837ca9770ad9571fe342a0ebd92f;hb=1a2869593e115e4a6c74aaa0b23ca612357403ce;hp=d173d6bd54fdff972e0abf83266a6d8b47dd9056;hpb=78d9eefec40598cc9661d5a66318f79c832a5216;p=gnulib.git diff --git a/lib/tanl.c b/lib/tanl.c index d173d6bd5..60e663761 100644 --- a/lib/tanl.c +++ b/lib/tanl.c @@ -124,7 +124,7 @@ long double kernel_tanl (long double x, long double y, int iy) { long double z, r, v, w, s, u, u1; - int flag, sign; + int invert = 0, sign; sign = 1; if (x < 0) @@ -146,7 +146,7 @@ kernel_tanl (long double x, long double y, int iy) } if (x >= 0.6743316650390625) /* |x| >= 0.6743316650390625 */ { - flag = 1; + invert = 1; z = pio4hi - x; w = pio4lo - y; @@ -162,7 +162,7 @@ kernel_tanl (long double x, long double y, int iy) r = y + z * (s * r + y); r += TH * s; w = x + r; - if (flag) + if (invert) { v = (long double) iy; w = (v - 2.0 * (x - (w * w / (w + v) - r))); @@ -191,13 +191,17 @@ tanl (long double x) long double y[2], z = 0.0L; int n; + /* tanl(NaN) is NaN */ + if (isnanl (x)) + return x; + /* |x| ~< pi/4 */ if (x >= -0.7853981633974483096156608458198757210492 && x <= 0.7853981633974483096156608458198757210492) return kernel_tanl (x, z, 1); - /* tanl(Inf or NaN) is NaN, tanl(0) is 0 */ - else if (x + x == x || x != x) + /* tanl(Inf) is NaN, tanl(0) is 0 */ + else if (x + x == x) return x - x; /* NaN */ /* argument reduction needed */