Hash :
eee00907
Author :
Date :
2007-03-15T22:58:36
* lib/quotearg.c: Include <wctype.h> early, before the definition of the iswprint macro. Needed on Solaris 2.5.1. 2007-03-12 Bruno Haible <bruno@clisp.org> * tests/test-printf-frexp.c (main): Declare x as volatile. 2007-03-12 Simon Josefsson <simon@josefsson.org> * doc/gnulib.texi (Build robot for gnulib): New section. 2007-03-12 Jim Meyering <jim@meyering.net> * build-aux/bootstrap: New file. * build-aux/bootstrap.conf: New file, from coreutils. 2007-03-11 Bruno Haible <bruno@clisp.org> * m4/cycle-check.m4 (gl_CYCLE_CHECK): Require AC_C_INLINE. 2007-03-12 Simon Josefsson <simon@josefsson.org> * lib/des.h, lib/des.c, lib/gc-gnulib.c: Use gl_ namespace, to avoid collisions with 'des_setkey'. Reported by Bruno Haible <bruno@clisp.org>. Also change 'tripledes_' to '3des_'. 2007-03-11 Bruno Haible <bruno@clisp.org> * m4/locale-tr.m4 (gt_LOCALE_TR_UTF8): If the test program fails to compile, set LOCALE_TR_UTF8 to 'none' instead of empty. 2007-03-11 Bruno Haible <bruno@clisp.org> * lib/stdint_.h (INT64_MIN, INTMAX_MIN): Avoid using the ~INT..._MAX formula. Needed for SunPRO C 5.0.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
/* Test of splitting a 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
the Free Software Foundation; either version 2, 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. */
/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
#include <config.h>
#include "printf-frexp.h"
#include <float.h>
#include <stdlib.h>
#define ASSERT(expr) if (!(expr)) abort ();
static double
my_ldexp (double x, int d)
{
for (; d > 0; d--)
x *= 2.0;
for (; d < 0; d++)
x *= 0.5;
return x;
}
int
main ()
{
int i;
/* The use of 'volatile' guarantees that excess precision bits are dropped
when dealing with denormalized numbers. It is necessary on x86 systems
where double-floats are not IEEE compliant by default, to avoid that the
results become platform and compiler option dependent. 'volatile' is a
portable alternative to gcc's -ffloat-store option. */
volatile double x;
for (i = 1, x = 1.0; i <= DBL_MAX_EXP; i++, x *= 2.0)
{
int exp = -9999;
double mantissa = printf_frexp (x, &exp);
ASSERT (exp == i - 1);
ASSERT (mantissa == 1.0);
}
for (i = 1, x = 1.0; i >= DBL_MIN_EXP; i--, x *= 0.5)
{
int exp = -9999;
double mantissa = printf_frexp (x, &exp);
ASSERT (exp == i - 1);
ASSERT (mantissa == 1.0);
}
for (; i >= DBL_MIN_EXP - 100 && x > 0.0; i--, x *= 0.5)
{
int exp = -9999;
double mantissa = printf_frexp (x, &exp);
ASSERT (exp == DBL_MIN_EXP - 1);
ASSERT (mantissa == my_ldexp (1.0, i - DBL_MIN_EXP));
}
for (i = 1, x = 1.01; i <= DBL_MAX_EXP; i++, x *= 2.0)
{
int exp = -9999;
double mantissa = printf_frexp (x, &exp);
ASSERT (exp == i - 1);
ASSERT (mantissa == 1.01);
}
for (i = 1, x = 1.01; i >= DBL_MIN_EXP; i--, x *= 0.5)
{
int exp = -9999;
double mantissa = printf_frexp (x, &exp);
ASSERT (exp == i - 1);
ASSERT (mantissa == 1.01);
}
for (; i >= DBL_MIN_EXP - 100 && x > 0.0; i--, x *= 0.5)
{
int exp = -9999;
double mantissa = printf_frexp (x, &exp);
ASSERT (exp == DBL_MIN_EXP - 1);
ASSERT (mantissa >= my_ldexp (1.0, i - DBL_MIN_EXP));
ASSERT (mantissa <= my_ldexp (2.0, i - DBL_MIN_EXP));
ASSERT (mantissa == my_ldexp (x, - exp));
}
for (i = 1, x = 1.73205; i <= DBL_MAX_EXP; i++, x *= 2.0)
{
int exp = -9999;
double mantissa = printf_frexp (x, &exp);
ASSERT (exp == i - 1);
ASSERT (mantissa == 1.73205);
}
for (i = 1, x = 1.73205; i >= DBL_MIN_EXP; i--, x *= 0.5)
{
int exp = -9999;
double mantissa = printf_frexp (x, &exp);
ASSERT (exp == i - 1);
ASSERT (mantissa == 1.73205);
}
for (; i >= DBL_MIN_EXP - 100 && x > 0.0; i--, x *= 0.5)
{
int exp = -9999;
double mantissa = printf_frexp (x, &exp);
ASSERT (exp == DBL_MIN_EXP - 1);
ASSERT (mantissa >= my_ldexp (1.0, i - DBL_MIN_EXP));
ASSERT (mantissa <= my_ldexp (2.0, i - DBL_MIN_EXP));
ASSERT (mantissa == my_ldexp (x, - exp));
}
return 0;
}