Paolo Bonzini wrote: > I don't mind your stuff being used in the frexpl module (which would then > be turned into LGPL).
There is no frexpl module so far. This does the first part of the change. 2007-03-22 Bruno Haible <[EMAIL PROTECTED]> * lib/frexpl.c: Share code with lib/frexp.c. * modules/mathl (Files): Add lib/frexp.c. (Depends-on): Add isnanl-nolibm. *** lib/frexpl.c 24 Feb 2007 16:31:38 -0000 1.6 --- lib/frexpl.c 22 Mar 2007 12:20:32 -0000 *************** *** 1,9 **** ! /* Emulation for frexpl. ! Contributed by Paolo Bonzini ! ! Copyright 2002, 2003, 2007 Free Software Foundation, Inc. ! ! This file is part of gnulib. 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 --- 1,5 ---- ! /* Split a 'long double' into fraction and mantissa. ! Copyright (C) 2007 Free Software Foundation, Inc. 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 *************** *** 19,107 **** with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ ! #include <config.h> ! ! /* Specification. */ ! #include <math.h> ! ! #include <float.h> ! ! /* Binary search. Quite inefficient but portable. */ ! long double ! frexpl(long double x, int *exp) ! { ! /* Since the exponent is an 'int', it fits in 64 bits. Therefore the ! loops are executed no more than 64 times. */ ! long double exponents[64]; ! long double *next; ! int exponent, bit; ! ! /* Check for zero, nan and infinity. */ ! if (x != x || x + x == x) ! { ! *exp = 0; ! return x; ! } ! ! if (x < 0) ! return -frexpl(-x, exp); ! ! exponent = 0; ! if (x >= 1.0) ! { ! for (next = exponents, exponents[0] = 2.0L, bit = 1; ! *next <= x + x; ! bit <<= 1, next[1] = next[0] * next[0], next++); ! ! for (; next >= exponents; bit >>= 1, next--) ! if (x + x >= *next) ! { ! x /= *next; ! exponent |= bit; ! } ! ! } ! ! else if (x < 0.5) ! { ! for (next = exponents, exponents[0] = 0.5L, bit = 1; ! *next > x; ! bit <<= 1, next[1] = next[0] * next[0], next++); ! ! for (; next >= exponents; bit >>= 1, next--) ! if (x < *next) ! { ! x /= *next; ! exponent |= bit; ! } ! ! exponent = -exponent; ! } ! ! *exp = exponent; ! return x; ! } ! ! #if 0 ! int ! main (void) ! { ! long double x; ! int y; ! x = frexpl(0.0L / 0.0L, &y); printf ("%.6Lg %d\n", x, y); ! x = frexpl(1.0L / 0.0L, &y); printf ("%.6Lg %d\n", x, y); ! x = frexpl(-1.0L / 0.0L, &y); printf ("%.6Lg %d\n", x, y); ! x = frexpl(0.5L, &y); printf ("%.6Lg %d\n", x, y); ! x = frexpl(0.75L, &y); printf ("%.6Lg %d\n", x, y); ! x = frexpl(1.0L, &y); printf ("%.6Lg %d\n", x, y); ! x = frexpl(3.6L, &y); printf ("%.6Lg %d\n", x, y); ! x = frexpl(17.8L, &y); printf ("%.6Lg %d\n", x, y); ! x = frexpl(8.0L, &y); printf ("%.6Lg %d\n", x, y); ! x = frexpl(0.3L, &y); printf ("%.6Lg %d\n", x, y); ! x = frexpl(0.49L, &y); printf ("%.6Lg %d\n", x, y); ! x = frexpl(0.049L, &y); printf ("%.6Lg %d\n", x, y); ! x = frexpl(0.0245L, &y); printf ("%.6Lg %d\n", x, y); ! x = frexpl(0.0625L, &y); printf ("%.6Lg %d\n", x, y); ! } ! #endif ! --- 15,19 ---- with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ ! #define USE_LONG_DOUBLE ! #include "frexp.c" *** modules/mathl 18 Feb 2007 15:10:28 -0000 1.5 --- modules/mathl 22 Mar 2007 12:20:32 -0000 *************** *** 10,15 **** --- 10,16 ---- lib/expl.c lib/floorl.c lib/frexpl.c + lib/frexp.c lib/ldexpl.c lib/logl.c lib/sincosl.c *************** *** 22,27 **** --- 23,29 ---- Depends-on: math + isnanl-nolibm configure.ac: gl_FUNC_LONG_DOUBLE_MATH