X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fprintf-frexp.c;h=da5c9c3a458084e9d09e5cde553cba77968d7c3e;hb=ecbcf1d92dc5993c972c0b5f002ef0b04abf97b8;hp=e4a5945f57d4640803e0036ccfaf0f6dd20f37a1;hpb=0fca46f3a4fcd58d8040d9bee331d2e2dc91275a;p=gnulib.git diff --git a/lib/printf-frexp.c b/lib/printf-frexp.c index e4a5945f5..da5c9c3a4 100644 --- a/lib/printf-frexp.c +++ b/lib/printf-frexp.c @@ -1,78 +1,75 @@ /* Split a double into fraction and mantissa, for hexadecimal printf. Copyright (C) 2007 Free Software Foundation, Inc. - 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 -#if !(defined USE_LONG_DOUBLE && !HAVE_LONG_DOUBLE) - /* Specification. */ -# ifdef USE_LONG_DOUBLE -# include "printf-frexpl.h" -# else -# include "printf-frexp.h" -# endif +#ifdef USE_LONG_DOUBLE +# include "printf-frexpl.h" +#else +# include "printf-frexp.h" +#endif -# include -# include -# ifdef USE_LONG_DOUBLE -# include "fpucw.h" -# endif +#include +#include +#ifdef USE_LONG_DOUBLE +# include "fpucw.h" +#endif /* This file assumes FLT_RADIX = 2. If FLT_RADIX is a power of 2 greater than 2, or not even a power of 2, some rounding errors can occur, so that then the returned mantissa is only guaranteed to be <= 2.0, not < 2.0. */ -# ifdef USE_LONG_DOUBLE -# define FUNC printf_frexpl -# define DOUBLE long double -# define MIN_EXP LDBL_MIN_EXP -# if HAVE_FREXPL_IN_LIBC && HAVE_LDEXPL_IN_LIBC -# define USE_FREXP_LDEXP -# define FREXP frexpl -# define LDEXP ldexpl -# endif -# define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING -# define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING () -# define END_ROUNDING() END_LONG_DOUBLE_ROUNDING () -# define L_(literal) literal##L -# else -# define FUNC printf_frexp -# define DOUBLE double -# define MIN_EXP DBL_MIN_EXP -# if HAVE_FREXP_IN_LIBC && HAVE_LDEXP_IN_LIBC -# define USE_FREXP_LDEXP -# define FREXP frexp -# define LDEXP ldexp -# endif -# define DECL_ROUNDING -# define BEGIN_ROUNDING() -# define END_ROUNDING() -# define L_(literal) literal +#ifdef USE_LONG_DOUBLE +# define FUNC printf_frexpl +# define DOUBLE long double +# define MIN_EXP LDBL_MIN_EXP +# if HAVE_FREXPL_IN_LIBC && HAVE_LDEXPL_IN_LIBC +# define USE_FREXP_LDEXP +# define FREXP frexpl +# define LDEXP ldexpl +# endif +# define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING +# define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING () +# define END_ROUNDING() END_LONG_DOUBLE_ROUNDING () +# define L_(literal) literal##L +#else +# define FUNC printf_frexp +# define DOUBLE double +# define MIN_EXP DBL_MIN_EXP +# if HAVE_FREXP_IN_LIBC && HAVE_LDEXP_IN_LIBC +# define USE_FREXP_LDEXP +# define FREXP frexp +# define LDEXP ldexp # endif +# define DECL_ROUNDING +# define BEGIN_ROUNDING() +# define END_ROUNDING() +# define L_(literal) literal +#endif DOUBLE -FUNC (DOUBLE x, int *exp) +FUNC (DOUBLE x, int *expptr) { int exponent; DECL_ROUNDING BEGIN_ROUNDING (); -# ifdef USE_FREXP_LDEXP +#ifdef USE_FREXP_LDEXP /* frexp and ldexp are usually faster than the loop below. */ x = FREXP (x, &exponent); @@ -84,7 +81,7 @@ FUNC (DOUBLE x, int *exp) x = LDEXP (x, exponent - (MIN_EXP - 1)); exponent = MIN_EXP - 1; } -# else +#else { /* Since the exponent is an 'int', it fits in 64 bits. Therefore the loops are executed no more than 64 times. */ @@ -182,18 +179,10 @@ FUNC (DOUBLE x, int *exp) /* Here either x < 1.0 and exponent = MIN_EXP - 1, or 1.0 <= x < 2.0 and exponent >= MIN_EXP - 1. */ } -# endif +#endif END_ROUNDING (); - *exp = exponent; + *expptr = exponent; return x; } - -#else - -/* This declaration is solely to ensure that after preprocessing - this file is never empty. */ -typedef int dummy; - -#endif