X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=inline;f=lib%2Fatanl.c;h=22a882d4d31a378469dd377d72ef4d5970d4c9cb;hb=f03c8d5562c251bfa6850372bb68d8eb346205f8;hp=2959e0bb5cf83a44d2c862cf1c45074c5f592cc4;hpb=5657b2536d242966c41c268b9ab4fe8df727bb13;p=gnulib.git diff --git a/lib/atanl.c b/lib/atanl.c index 2959e0bb5..22a882d4d 100644 --- a/lib/atanl.c +++ b/lib/atanl.c @@ -1,6 +1,26 @@ -/* s_atanl.c +/* Copyright 2001 by Stephen L. Moshier + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include + +/* s_atanl.c * - * Inverse circular tangent for 128-bit long double precision + * Inverse circular tangent for 128-bit long double precision * (arctangent) * * @@ -42,12 +62,6 @@ * */ -/* Copyright 2001 by Stephen L. Moshier */ - -#include "mathl.h" - -#include - /* arctan(k/8), k = 0, ..., 82 */ static const long double atantbl[84] = { 0.0000000000000000000000000000000000000000E0L, @@ -161,19 +175,25 @@ atanl (long double x) int k, sign; long double t, u, p, q; - sign = (x < 0) ? -1 : 1; - /* Check for zero or NaN. */ - if (x != x || x == 0.0) + if (isnanl (x) || x == 0.0) return x + x; - /* Check for infinity. */ + sign = x < 0.0; + if (x + x == x) - return sign * atantbl[83]; + { + /* Infinity. */ + if (sign) + return -atantbl[83]; + else + return atantbl[83]; + } - x *= sign; + if (sign) + x = -x; - if (x >= 10.25) /* 10.25 */ + if (x >= 10.25) { k = 83; t = -1.0/x; @@ -181,7 +201,7 @@ atanl (long double x) else { /* Index of nearest table element. - Roundoff to integer is asymmetrical to avoid cancellation when t < 0 + Roundoff to integer is asymmetrical to avoid cancellation when t < 0 (cf. fdlibm). */ k = 8.0 * x + 0.25; u = 0.125 * k; @@ -196,5 +216,9 @@ atanl (long double x) u = t * u * p / q + t; /* arctan x = arctan u + arctan t */ - return sign * (atantbl[k] + u); + u = atantbl[k] + u; + if (sign) + return (-u); + else + return u; }