Robert Millan <[EMAIL PROTECTED]> writes: > For these borrowed files from other GNU or free software projects, I think we > still need an explicit note in the files distributed as part of gnulib.
OK, let's start with atanl.c and logl.c. I see that glibc has fixed this problem by adding a proper copyright notice. Also, I see that gnulib has departed from the glibc code in some cases where it doesn't need to (and this arguably could introduce a bug). So I installed the following patch to fix both problems. 2004-10-06 Paul Eggert <[EMAIL PROTECTED]> * lib/atanl.c, lib/logl.c: Add GPL notice, to match glibc's added LGPL notice. * lib/atanl.c (atanl): Keep the code as similar to glibc as possible. * lib/logl.c (logl): Keep the code as similar to glibc as possible. This avoids a potential constant-folding bug. Index: lib/atanl.c =================================================================== RCS file: /cvsroot/gnulib/gnulib/lib/atanl.c,v retrieving revision 1.1 diff -p -u -r1.1 atanl.c --- lib/atanl.c 18 Feb 2003 17:05:23 -0000 1.1 +++ lib/atanl.c 6 Oct 2004 19:59:05 -0000 @@ -42,7 +42,22 @@ * */ -/* Copyright 2001 by Stephen L. Moshier <[EMAIL PROTECTED]> */ +/* Copyright 2001 by Stephen L. Moshier <[EMAIL PROTECTED]> + + 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 2, 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; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "mathl.h" @@ -161,19 +176,25 @@ atanl (long double x) int k, sign; long double t, u, p, q; - sign = (x < 0) ? -1 : 1; + sign = x < 0.0; /* Check for zero or NaN. */ if (x != x || x == 0.0) return x + x; - /* Check for infinity. */ 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; @@ -196,5 +217,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; } Index: lib/logl.c =================================================================== RCS file: /cvsroot/gnulib/gnulib/lib/logl.c,v retrieving revision 1.1 diff -p -u -r1.1 logl.c --- lib/logl.c 18 Feb 2003 17:05:23 -0000 1.1 +++ lib/logl.c 6 Oct 2004 19:59:05 -0000 @@ -46,7 +46,22 @@ #include "mathl.h" -/* Copyright 2001 by Stephen L. Moshier <[EMAIL PROTECTED]> */ +/* Copyright 2001 by Stephen L. Moshier <[EMAIL PROTECTED]> + + 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 2, 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; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* log(1+x) = x - .5 x^2 + x^3 l(x) -.0078125 <= x <= +.0078125 @@ -173,7 +188,8 @@ static const long double long double logl(long double x) { - long double z, y, w, u, t; + long double z, y, w; + long double u, t; unsigned int m; int k, e; @@ -181,15 +197,19 @@ logl(long double x) /* log(0) = -infinity. */ if (x == 0.0L) - return -0.5L / 0.0L; - + { + return -0.5L / ZERO; + } /* log ( x < 0 ) = NaN */ if (x < 0.0L) - return (x - x) / (x - x); - + { + return (x - x) / ZERO; + } /* log (infinity or NaN) */ if (x + x == x || x != x) - return x + x; + { + return x + x; + } /* Extract exponent and reduce domain to 0.703125 <= u < 1.40625 */ x = frexpl(x, &e); @@ -202,13 +222,13 @@ logl(long double x) /* On this interval the table is not used due to cancellation error. */ if ((x <= 1.0078125L) && (x >= 0.9921875L)) { + z = x - 1.0L; k = 64; t = 1.0L; - z = x - 1.0L; } else { - k = floorl((x - 0.5L) * 128.0L); + k = floorl ((x - 0.5L) * 128.0L); t = 0.5L + k / 128.0L; z = (x - t) / t; }