X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ffrexpl.c;h=5ec2780ed489ba458c8e2cdfccc5e23a6bb31388;hb=43593319b31e6b0175b8eec4433bac744959822d;hp=c563fc0c993a967a0547f21c92b1226f278d7a2e;hpb=e1123c2f4fedae90435426a82a05cf2e3233e97d;p=gnulib.git diff --git a/lib/frexpl.c b/lib/frexpl.c index c563fc0c9..5ec2780ed 100644 --- a/lib/frexpl.c +++ b/lib/frexpl.c @@ -1,103 +1,35 @@ -/* Emulation for frexpl. - Contributed by Paolo Bonzini +/* Split a 'long double' into fraction and mantissa. + Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc. - 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 + 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. + the Free Software Foundation; either version 3 of the License, 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; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include -/* Specification. */ -#include +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE -#include +/* Specification. */ +# include -/* Binary search. Quite inefficient but portable. */ long double -frexpl(long double x, int *exp) +frexpl (long double x, int *expptr) { - 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; - } + return frexp (x, expptr); +} - exponent = -exponent; - } +#else - *exp = exponent; - return x; -} +# define USE_LONG_DOUBLE +# include "frexp.c" -#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(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 -