Make tst-strtod-round use ROUNDING_TESTS.

This commit is contained in:
Joseph Myers 2013-06-14 17:58:41 +00:00
parent c396afdfa4
commit 1b2feed264
2 changed files with 38 additions and 9 deletions

View File

@ -1,3 +1,11 @@
2013-06-14 Joseph Myers <joseph@codesourcery.com>
* stdlib/tst-strtod-round.c: Include <math-tests.h>.
(test_in_one_mode): Take arguments for whether the rounding mode
is supported for each floating-point type.
(do_test): Pass new arguments to test_in_one_mode using
ROUNDING_TESTS.
2013-06-13 Roland McGrath <roland@hack.frob.com>
* posix/tst-waitid.c (do_test): Distinguish different instances of

View File

@ -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