diff options
Diffstat (limited to 'tests/test-float.c')
-rw-r--r-- | tests/test-float.c | 147 |
1 files changed, 138 insertions, 9 deletions
diff --git a/tests/test-float.c b/tests/test-float.c index e9dc4609..7614e32e 100644 --- a/tests/test-float.c +++ b/tests/test-float.c @@ -20,8 +20,12 @@ #include <float.h> -/* Check that FLT_RADIX is a constant expression. */ -int a[] = { FLT_RADIX }; +/* Check that some macros are constant expressions. */ +int a[] = + { + FLT_RADIX, + FLT_EVAL_METHOD /* added in ISO C 99 */ + }; /* ----------------------- Check macros for 'float' ----------------------- */ @@ -29,9 +33,20 @@ int a[] = { FLT_RADIX }; int fb[] = { FLT_MANT_DIG, FLT_MIN_EXP, FLT_MAX_EXP, - FLT_DIG, FLT_MIN_10_EXP, FLT_MAX_10_EXP + FLT_DIG, FLT_MIN_10_EXP, FLT_MAX_10_EXP, + FLT_HAS_SUBNORM, /* added in ISO C 11 */ + FLT_DECIMAL_DIG, /* added in ISO C 11 */ + FLT_IS_IEC_60559 /* added in ISO C 23 */ }; -float fc[] = { FLT_EPSILON, FLT_MIN, FLT_MAX }; +float fc[] = + { + FLT_EPSILON, FLT_MIN, FLT_MAX, + FLT_TRUE_MIN, /* added in ISO C 11 */ + FLT_NORM_MAX /* added in ISO C 23 */ + }; +#if 0 /* FLT_SNAN is not a constant expression on some platforms. */ +float fs = FLT_SNAN; /* added in ISO C 23 */ +#endif /* ----------------------- Check macros for 'double' ----------------------- */ @@ -39,9 +54,20 @@ float fc[] = { FLT_EPSILON, FLT_MIN, FLT_MAX }; int db[] = { DBL_MANT_DIG, DBL_MIN_EXP, DBL_MAX_EXP, - DBL_DIG, DBL_MIN_10_EXP, DBL_MAX_10_EXP + DBL_DIG, DBL_MIN_10_EXP, DBL_MAX_10_EXP, + DBL_HAS_SUBNORM, /* added in ISO C 11 */ + DBL_DECIMAL_DIG, /* added in ISO C 11 */ + DBL_IS_IEC_60559 /* added in ISO C 23 */ }; -double dc[] = { DBL_EPSILON, DBL_MIN, DBL_MAX }; +double dc[] = + { + DBL_EPSILON, DBL_MIN, DBL_MAX, + DBL_TRUE_MIN, /* added in ISO C 11 */ + DBL_NORM_MAX /* added in ISO C 23 */ + }; +#if 0 /* DBL_SNAN is not a constant expression on some platforms. */ +double ds = DBL_SNAN; /* added in ISO C 23 */ +#endif /* -------------------- Check macros for 'long double' -------------------- */ @@ -49,17 +75,36 @@ double dc[] = { DBL_EPSILON, DBL_MIN, DBL_MAX }; int lb[] = { LDBL_MANT_DIG, LDBL_MIN_EXP, LDBL_MAX_EXP, - LDBL_DIG, LDBL_MIN_10_EXP, LDBL_MAX_10_EXP + LDBL_DIG, LDBL_MIN_10_EXP, LDBL_MAX_10_EXP, + LDBL_HAS_SUBNORM, /* added in ISO C 11 */ + LDBL_DECIMAL_DIG, /* added in ISO C 11 */ + LDBL_IS_IEC_60559 /* added in ISO C 23 */ }; long double lc1 = LDBL_EPSILON; long double lc2 = LDBL_MIN; -#if 0 /* LDBL_MAX is not a constant expression on some platforms. */ +#if !GNULIB_defined_long_double_union +/* LDBL_MAX is not a constant expression on some platforms. */ long double lc3 = LDBL_MAX; #endif +#if !GNULIB_defined_long_double_union +/* LDBL_TRUE_MIN is not a constant expression on FreeBSD/i386. */ +long double lc4 = LDBL_TRUE_MIN; /* added in ISO C 11 */ +#endif +#if !GNULIB_defined_long_double_union +/* LDBL_MAX is not a constant expression on some platforms. */ +long double lc5 = LDBL_NORM_MAX; /* added in ISO C 23 */ +#endif +#if 0 +/* LDBL_SNAN is not a constant expression on some platforms. */ +long double ls = LDBL_SNAN; /* added in ISO C 23 */ +#endif /* ------------------------------------------------------------------------- */ #include "fpucw.h" +#include "isnanf-nolibm.h" +#include "isnand-nolibm.h" +#include "isnanl-nolibm.h" #include "macros.h" #if FLT_RADIX == 2 @@ -220,6 +265,34 @@ test_float (void) ASSERT (x <= 1.0f); } } + + /* Check the value of FLT_HAS_SUBNORM. */ + ASSERT (FLT_HAS_SUBNORM == 1); + + /* Check the value of FLT_DECIMAL_DIG. */ + ASSERT (FLT_DECIMAL_DIG == (int)(FLT_MANT_DIG * 0.3010299956639812 + 2)); + + /* Check the value of FLT_TRUE_MIN. */ + ASSERT (FLT_TRUE_MIN > 0.0f); + { + volatile float x = FLT_TRUE_MIN * 0.5f; + ASSERT (x == 0.0f); + } + + /* Check the value of FLT_IS_IEC_60559. */ +#if !defined __m68k__ + ASSERT (FLT_IS_IEC_60559); +#elif 0 + /* It is not clear what this macro actually means. Cf. + <http://mailman.oakapple.net/pipermail/cfp-interest/2023-April/002760.html> */ + ASSERT (!FLT_IS_IEC_60559); +#endif + + /* Check the value of FLT_NORM_MAX. */ + ASSERT (FLT_NORM_MAX == FLT_MAX); + + /* Check the value of FLT_SNAN. */ + ASSERT (isnanf (FLT_SNAN)); } /* ----------------------- Check macros for 'double' ----------------------- */ @@ -291,6 +364,34 @@ test_double (void) ASSERT (x <= 1.0); } } + + /* Check the value of DBL_HAS_SUBNORM. */ + ASSERT (DBL_HAS_SUBNORM == 1); + + /* Check the value of DBL_DECIMAL_DIG. */ + ASSERT (DBL_DECIMAL_DIG == (int)(DBL_MANT_DIG * 0.3010299956639812 + 2)); + + /* Check the value of DBL_TRUE_MIN. */ + ASSERT (DBL_TRUE_MIN > 0.0); + { + volatile double x = DBL_TRUE_MIN * 0.5; + ASSERT (x == 0.0); + } + + /* Check the value of DBL_IS_IEC_60559. */ +#if !defined __m68k__ + ASSERT (DBL_IS_IEC_60559); +#elif 0 + /* It is not clear what this macro actually means. Cf. + <http://mailman.oakapple.net/pipermail/cfp-interest/2023-April/002760.html> */ + ASSERT (!DBL_IS_IEC_60559); +#endif + + /* Check the value of DBL_NORM_MAX. */ + ASSERT (DBL_NORM_MAX == DBL_MAX); + + /* Check the value of DBL_SNAN. */ + ASSERT (isnand (DBL_SNAN)); } /* -------------------- Check macros for 'long double' -------------------- */ @@ -359,6 +460,34 @@ test_long_double (void) ASSERT (x <= 1.0L); } } + + /* Check the value of LDBL_HAS_SUBNORM. */ + ASSERT (LDBL_HAS_SUBNORM == 1); + + /* Check the value of LDBL_DECIMAL_DIG. */ + ASSERT (LDBL_DECIMAL_DIG == (int)(LDBL_MANT_DIG * 0.3010299956639812 + 2)); + + /* Check the value of LDBL_TRUE_MIN. */ + ASSERT (LDBL_TRUE_MIN > 0.0L); + { + volatile long double x = LDBL_TRUE_MIN * 0.5L; + ASSERT (x == 0.0L); + } + + /* Check the value of LDBL_IS_IEC_60559. */ +#if (LDBL_MANT_DIG == 53 || LDBL_MANT_DIG == 113) && !defined __m68k__ + ASSERT (LDBL_IS_IEC_60559); +#elif 0 + /* It is not clear what this macro actually means. Cf. + <http://mailman.oakapple.net/pipermail/cfp-interest/2023-April/002760.html> */ + ASSERT (!LDBL_IS_IEC_60559); +#endif + + /* Check the value of LDBL_NORM_MAX. */ + ASSERT (LDBL_NORM_MAX == LDBL_MAX); + + /* Check the value of LDBL_SNAN. */ + ASSERT (isnanl (LDBL_SNAN)); } int @@ -377,7 +506,7 @@ main () END_LONG_DOUBLE_ROUNDING (); } - return 0; + return test_exit_status; } #else |