X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ffrexpl.c;h=d6f0d7650d3f4b6d8875c50f73b6898ca817aa78;hb=952be23bc009785c91c76e8dbb29c73001e3267a;hp=cdc3ad86b5c72ef7693e15f1671451a450576451;hpb=5657b2536d242966c41c268b9ab4fe8df727bb13;p=gnulib.git diff --git a/lib/frexpl.c b/lib/frexpl.c index cdc3ad86b..d6f0d7650 100644 --- a/lib/frexpl.c +++ b/lib/frexpl.c @@ -1,103 +1,18 @@ -/* Emulation for frexpl. - Contributed by Paolo Bonzini +/* Split a 'long double' into fraction and mantissa. + Copyright (C) 2007 Free Software Foundation, Inc. - Copyright 2002, 2003 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 + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. - This file is part of gnulib. + 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. - gnulib is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1, or (at your option) - any later version. - - gnulib 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 Lesser General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with gnulib; see the file COPYING.LIB. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, - USA. - */ - -#include -#include - -#include "mathl.h" - -/* Binary search. Quite inefficient but portable. */ -long double -frexpl(long double x, int *exp) -{ - long double exponents[20], *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() -{ - 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(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 + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ +#define USE_LONG_DOUBLE +#include "frexp.c"