Copyright 2002-2004 Free Software Foundation, Inc.
This file is part of the GNU MP Library test suite.
The GNU MP Library test suite 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.
The GNU MP Library test suite 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
the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */
/* FIXME: It'd be better to base this on the float format. */ #ifdefined (__vax) || defined (__vax__) int limit = 127; /* vax fp numbers have limited range */ #else int limit = 511; #endif
int bit_i, exp_i, i; double got, want;
mp_size_t nsize, sign; long bit, exp, want_bit;
mp_limb_t np[20];
for (bit_i = 0; bit_i < numberof (bit_table); bit_i++)
{
bit = bit_table[bit_i];
/* Exercise values 2^n+1, while such a value fits the mantissa of a double. */ void
check_twobit (void)
{ int i, mant_bits; double got, want;
mp_size_t nsize, sign;
mp_ptr np;
mant_bits = tests_dbl_mant_bits (); if (mant_bits == 0) return;
np = refmpn_malloc_limbs (BITS_TO_LIMBS (mant_bits));
want = 3.0; for (i = 1; i < mant_bits; i++)
{
nsize = BITS_TO_LIMBS (i+1);
refmpn_zero (np, nsize);
np[i/GMP_NUMB_BITS] = CNST_LIMB(1) << (i % GMP_NUMB_BITS);
np[0] |= 1;
/* Expect large negative exponents to underflow to 0.0. Some systems might have hardware traps for such an underflow (though
usually it's not the default), so watch out for SIGFPE. */ void
check_underflow (void)
{ staticconstlong exp_table[] = {
-999999L, LONG_MIN,
}; staticconst mp_limb_t np[1] = { 1 };
staticlong exp;
mp_size_t nsize, sign; double got; int exp_i;
nsize = numberof (np);
if (tests_setjmp_sigfpe() == 0)
{ for (exp_i = 0; exp_i < numberof (exp_table); exp_i++)
{
exp = exp_table[exp_i];
for (sign = 0; sign >= -1; sign--)
{
got = mpn_get_d (np, nsize, sign, exp); if (got != 0.0)
{
printf ("mpn_get_d wrong, didn't get 0.0 on underflow\n");
printf (" nsize %ld\n", (long) nsize);
printf (" exp %ld\n", exp);
printf (" sign %ld\n", (long) sign);
d_trace (" got ", got);
abort ();
}
}
}
} else
{
printf ("Warning, underflow to zero tests skipped due to SIGFPE (exp=%ld)\n", exp);
}
tests_sigfpe_done ();
}
/* Expect large values to result in +/-inf, on IEEE systems. */ void
check_inf (void)
{ staticconstlong exp_table[] = {
999999L, LONG_MAX,
}; staticconst mp_limb_t np[4] = { 1, 1, 1, 1 }; long exp;
mp_size_t nsize, sign, got_sign; double got; int exp_i;
/* Check values 2^n approaching and into IEEE denorm range. Some systems might not support denorms, or might have traps setup, so
watch out for SIGFPE. */ void
check_ieee_denorm (void)
{ staticlong exp;
mp_limb_t n = 1; long i;
mp_size_t sign; double want, got;
if (! _GMP_IEEE_FLOATS) return;
if (tests_setjmp_sigfpe() == 0)
{
exp = -1020;
want = 1.0; for (i = 0; i > exp; i--)
want *= 0.5;
/* Check values 2^n approaching exponent overflow.
Some systems might trap on overflow, so watch out for SIGFPE. */ void
check_ieee_overflow (void)
{ staticlong exp;
mp_limb_t n = 1; long i;
mp_size_t sign; double want, got;
if (! _GMP_IEEE_FLOATS) return;
if (tests_setjmp_sigfpe() == 0)
{
exp = 1010;
want = 1.0; for (i = 0; i < exp; i++)
want *= 2.0;
/* ARM gcc 2.95.4 was seen generating bad code for ulong->double conversions, resulting in for instance 0x81c25113 incorrectly converted. This test exercises that value, to see mpn_get_d has avoided the
problem. */ void
check_0x81c25113 (void)
{ #if GMP_NUMB_BITS >= 32 double want = 2176995603.0; double got;
mp_limb_t np[4];
mp_size_t nsize; long exp;
mant_bits = tests_dbl_mant_bits (); if (mant_bits == 0) return;
/* Allow for vax D format with exponent 127 to -128 only.
FIXME: Do something to probe for a valid exponent range. */
exp_min = -100 - mant_bits;
exp_max = 100 - mant_bits;
/* want = {np,nsize}, converting one bit at a time */
want = 0.0; for (i = 0, d = 1.0; i < mant_bits; i++, d *= 2.0) if (np[i/GMP_NUMB_BITS] & (CNST_LIMB(1) << (i%GMP_NUMB_BITS)))
want += d; if (sign < 0)
want = -want;
/* want = want * 2^exp */ for (i = 0; i < exp; i++)
want *= 2.0; for (i = 0; i > exp; i--)
want *= 0.5;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.