Mercurial > hg > octave-lojdl > gnulib-hg
changeset 8496:1f851f8ed15e
Merge the frexpl and frexp implementations into a single code.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Thu, 22 Mar 2007 12:24:07 +0000 |
parents | eff68e94da66 |
children | 280cabcbb0ca |
files | ChangeLog lib/frexpl.c modules/mathl |
diffstat | 3 files changed, 12 insertions(+), 92 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-03-22 Bruno Haible <bruno@clisp.org> + + * 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 <bruno@clisp.org> * modules/printf-frexp (Files): Add m4/frexp.m4.
--- 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 <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 - +#define USE_LONG_DOUBLE +#include "frexp.c"