diff options
Diffstat (limited to 'stdlib/tst-strtod-round.c')
-rw-r--r-- | stdlib/tst-strtod-round.c | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/stdlib/tst-strtod-round.c b/stdlib/tst-strtod-round.c index 4065d1288e..9a440264d0 100644 --- a/stdlib/tst-strtod-round.c +++ b/stdlib/tst-strtod-round.c @@ -24,6 +24,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <math-tests.h> struct exactness { @@ -7538,7 +7539,9 @@ static const struct test tests[] = { static int test_in_one_mode (const char *s, const struct test_results *expected, - const struct exactness *exact, const char *mode_name) + const struct exactness *exact, const char *mode_name, + bool float_round_ok, bool double_round_ok, + bool long_double_round_ok) { int result = 0; float f = strtof (s, NULL); @@ -7549,24 +7552,30 @@ test_in_one_mode (const char *s, const struct test_results *expected, { printf ("strtof (%s) returned %a not %a (%s)\n", s, f, expected->f, mode_name); - result = 1; + if (float_round_ok || exact->f) + result = 1; + else + printf ("ignoring this inexact result\n"); } if (d != expected->d || copysign (1.0, d) != copysign (1.0, expected->d)) { printf ("strtod (%s) returned %a not %a (%s)\n", s, d, expected->d, mode_name); - result = 1; + if (double_round_ok || exact->d) + result = 1; + else + printf ("ignoring this inexact result\n"); } if (ld != expected->ld || copysignl (1.0L, ld) != copysignl (1.0L, expected->ld)) { printf ("strtold (%s) returned %La not %La (%s)\n", s, ld, expected->ld, mode_name); - if (LDBL_MANT_DIG != 106 || exact->ld) + if ((long_double_round_ok && LDBL_MANT_DIG != 106) || exact->ld) result = 1; else - printf ("ignoring this inexact long double result\n"); + printf ("ignoring this inexact result\n"); } return result; } @@ -7579,12 +7588,17 @@ do_test (void) for (size_t i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) { result |= test_in_one_mode (tests[i].s, &tests[i].rn, &tests[i].exact, - "default rounding mode"); + "default rounding mode", + true, true, true); #ifdef FE_DOWNWARD if (!fesetround (FE_DOWNWARD)) { result |= test_in_one_mode (tests[i].s, &tests[i].rd, - &tests[i].exact, "FE_DOWNWARD"); + &tests[i].exact, "FE_DOWNWARD", + ROUNDING_TESTS (float, FE_DOWNWARD), + ROUNDING_TESTS (double, FE_DOWNWARD), + ROUNDING_TESTS (long double, + FE_DOWNWARD)); fesetround (save_round_mode); } #endif @@ -7592,7 +7606,11 @@ do_test (void) if (!fesetround (FE_TOWARDZERO)) { result |= test_in_one_mode (tests[i].s, &tests[i].rz, - &tests[i].exact, "FE_TOWARDZERO"); + &tests[i].exact, "FE_TOWARDZERO", + ROUNDING_TESTS (float, FE_TOWARDZERO), + ROUNDING_TESTS (double, FE_TOWARDZERO), + ROUNDING_TESTS (long double, + FE_TOWARDZERO)); fesetround (save_round_mode); } #endif @@ -7600,7 +7618,10 @@ do_test (void) if (!fesetround (FE_UPWARD)) { result |= test_in_one_mode (tests[i].s, &tests[i].ru, - &tests[i].exact, "FE_UPWARD"); + &tests[i].exact, "FE_UPWARD", + ROUNDING_TESTS (float, FE_UPWARD), + ROUNDING_TESTS (double, FE_UPWARD), + ROUNDING_TESTS (long double, FE_UPWARD)); fesetround (save_round_mode); } #endif |