mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
2.5-18.1
This commit is contained in:
114
math/test-misc.c
114
math/test-misc.c
@ -1,5 +1,5 @@
|
||||
/* Miscellaneous tests which don't fit anywhere else.
|
||||
Copyright (C) 2000, 2001 Free Software Foundation, Inc.
|
||||
Copyright (C) 2000, 2001, 2004, 2005, 2007 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -44,7 +44,6 @@ main (void)
|
||||
}
|
||||
}
|
||||
|
||||
# if __GNUC__ >= 3 || __GNUC_MINOR__ >= 96
|
||||
{
|
||||
long double x;
|
||||
long double m;
|
||||
@ -52,17 +51,17 @@ main (void)
|
||||
int e;
|
||||
int i;
|
||||
|
||||
# if LDBL_MANT_DIG == 64
|
||||
# if LDBL_MANT_DIG == 64
|
||||
m = 0xf.fffffffffffffffp-4L;
|
||||
# elif LDBL_MANT_DIG == 106
|
||||
# elif LDBL_MANT_DIG == 106
|
||||
/* This has to match the mantissa of LDBL_MAX which actually does have a
|
||||
missing bit in the middle. */
|
||||
m = 0x1.fffffffffffff7ffffffffffff8p-1L;
|
||||
# elif LDBL_MANT_DIG == 113
|
||||
# elif LDBL_MANT_DIG == 113
|
||||
m = 0x1.ffffffffffffffffffffffffffffp-1L;
|
||||
# else
|
||||
# error "Please adjust"
|
||||
# endif
|
||||
# else
|
||||
# error "Please adjust"
|
||||
# endif
|
||||
|
||||
for (i = LDBL_MAX_EXP, x = LDBL_MAX; i >= LDBL_MIN_EXP; --i, x /= 2.0L)
|
||||
{
|
||||
@ -106,9 +105,8 @@ main (void)
|
||||
}
|
||||
|
||||
}
|
||||
# endif
|
||||
|
||||
#if 0
|
||||
# if 0
|
||||
{
|
||||
int e;
|
||||
long double r = frexpl (LDBL_MIN * LDBL_EPSILON, &e);
|
||||
@ -126,7 +124,7 @@ main (void)
|
||||
result = 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
{
|
||||
@ -1143,5 +1141,99 @@ main (void)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* The tests here are very similar to tests earlier in this file,
|
||||
the important difference is just that there are no intervening
|
||||
union variables that cause some GCC versions to hide possible
|
||||
bugs in nextafter* implementation. */
|
||||
if (nextafterf (nextafterf (FLT_MIN, FLT_MIN / 2.0), FLT_MIN) != FLT_MIN)
|
||||
{
|
||||
puts ("nextafterf FLT_MIN test failed");
|
||||
result = 1;
|
||||
}
|
||||
if (nextafterf (nextafterf (-FLT_MIN, -FLT_MIN / 2.0), -FLT_MIN)
|
||||
!= -FLT_MIN)
|
||||
{
|
||||
puts ("nextafterf -FLT_MIN test failed");
|
||||
result = 1;
|
||||
}
|
||||
if (nextafter (nextafter (DBL_MIN, DBL_MIN / 2.0), DBL_MIN) != DBL_MIN)
|
||||
{
|
||||
puts ("nextafter DBL_MIN test failed");
|
||||
result = 1;
|
||||
}
|
||||
if (nextafter (nextafter (-DBL_MIN, -DBL_MIN / 2.0), -DBL_MIN) != -DBL_MIN)
|
||||
{
|
||||
puts ("nextafter -DBL_MIN test failed");
|
||||
result = 1;
|
||||
}
|
||||
#ifndef NO_LONG_DOUBLE
|
||||
if (nextafterl (nextafterl (LDBL_MIN, LDBL_MIN / 2.0), LDBL_MIN)
|
||||
!= LDBL_MIN)
|
||||
{
|
||||
puts ("nextafterl LDBL_MIN test failed");
|
||||
result = 1;
|
||||
}
|
||||
if (nextafterl (nextafterl (-LDBL_MIN, -LDBL_MIN / 2.0), -LDBL_MIN)
|
||||
!= -LDBL_MIN)
|
||||
{
|
||||
puts ("nextafterl -LDBL_MIN test failed");
|
||||
result = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
volatile float f1 = FLT_MAX;
|
||||
volatile float f2 = FLT_MAX / 2;
|
||||
(void) &f1;
|
||||
(void) &f2;
|
||||
feclearexcept (FE_ALL_EXCEPT);
|
||||
f2 += f1;
|
||||
int fe = fetestexcept (FE_ALL_EXCEPT);
|
||||
if (fe != (FE_OVERFLOW | FE_INEXACT))
|
||||
{
|
||||
printf ("float overflow test failed: %x\n", fe);
|
||||
result = 1;
|
||||
}
|
||||
|
||||
volatile double d1 = DBL_MAX;
|
||||
volatile double d2 = DBL_MAX / 2;
|
||||
(void) &d1;
|
||||
(void) &d2;
|
||||
feclearexcept (FE_ALL_EXCEPT);
|
||||
d2 += d1;
|
||||
fe = fetestexcept (FE_ALL_EXCEPT);
|
||||
if (fe != (FE_OVERFLOW | FE_INEXACT))
|
||||
{
|
||||
printf ("double overflow test failed: %x\n", fe);
|
||||
result = 1;
|
||||
}
|
||||
|
||||
#ifndef NO_LONG_DOUBLE
|
||||
volatile long double ld1 = LDBL_MAX;
|
||||
volatile long double ld2 = LDBL_MAX / 2;
|
||||
(void) &ld1;
|
||||
(void) &ld2;
|
||||
feclearexcept (FE_ALL_EXCEPT);
|
||||
ld2 += ld1;
|
||||
fe = fetestexcept (FE_ALL_EXCEPT);
|
||||
if (fe != (FE_OVERFLOW | FE_INEXACT))
|
||||
{
|
||||
printf ("long double overflow test failed: %x\n", fe);
|
||||
result = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined NO_LONG_DOUBLE && LDBL_MANT_DIG == 113
|
||||
volatile long double ld3 = 0x1.0000000000010000000100000001p+1;
|
||||
volatile long double ld4 = 0x1.0000000000000000000000000001p+1;
|
||||
(void) &ld3;
|
||||
(void) &ld4;
|
||||
ld3 -= ld4;
|
||||
if (ld3 != 0x1.0p-47)
|
||||
{
|
||||
printf ("long double subtraction test failed %.28La\n", ld3);
|
||||
result = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
||||
|
Reference in New Issue
Block a user