From 277bd9826cebcc6fde7e6fd8c0afbe5638768961 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 22 Mar 2007 12:24:07 +0000 Subject: [PATCH] Merge the frexpl and frexp implementations into a single code. --- ChangeLog | 6 ++++ lib/frexpl.c | 96 +++-------------------------------------------------------- modules/mathl | 2 ++ 3 files changed, 12 insertions(+), 92 deletions(-) diff --git a/ChangeLog b/ChangeLog index d71b878f5..0cd2fab77 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2007-03-22 Bruno Haible + * lib/frexpl.c: Share code with lib/frexp.c. + * modules/mathl (Files): Add lib/frexp.c. + (Depends-on): Add isnanl-nolibm. + +2007-03-22 Bruno Haible + * modules/printf-frexp (Files): Add m4/frexp.m4. * m4/printf-frexp.m4 (gl_FUNC_PRINTF_FREXP): Define HAVE_FREXP_IN_LIBC only if the found frexp function actually works. diff --git a/lib/frexpl.c b/lib/frexpl.c index f78c4000d..75852ba62 100644 --- a/lib/frexpl.c +++ b/lib/frexpl.c @@ -1,9 +1,5 @@ -/* Emulation for frexpl. - Contributed by Paolo Bonzini - - Copyright 2002, 2003, 2007 Free Software Foundation, Inc. - - This file is part of gnulib. +/* 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,89 +15,5 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include - -/* Specification. */ -#include - -#include - -/* 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 - +#define USE_LONG_DOUBLE +#include "frexp.c" diff --git a/modules/mathl b/modules/mathl index b75eeca8a..4a7c5953d 100644 --- a/modules/mathl +++ b/modules/mathl @@ -10,6 +10,7 @@ lib/cosl.c lib/expl.c lib/floorl.c lib/frexpl.c +lib/frexp.c lib/ldexpl.c lib/logl.c lib/sincosl.c @@ -22,6 +23,7 @@ m4/mathl.m4 Depends-on: math +isnanl-nolibm configure.ac: gl_FUNC_LONG_DOUBLE_MATH -- 2.11.0