diff options
Diffstat (limited to 'math')
-rw-r--r-- | math/libm-test.inc | 346 |
1 files changed, 179 insertions, 167 deletions
diff --git a/math/libm-test.inc b/math/libm-test.inc index af6d28c24d..0843482d8d 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -1001,6 +1001,14 @@ struct test_ff_i_data int max_ulp; int exceptions; }; +struct test_f_l_data +{ + const char *test_name; + FLOAT arg; + long int expected; + long int max_ulp; + int exceptions; +}; /* Set the rounding mode, or restore the saved value. */ #define IF_ROUND_INIT_ /* Empty. */ @@ -1262,6 +1270,13 @@ struct test_ff_i_data MAX_ULP, EXCEPTIONS) \ check_long (TEST_NAME, FUNC (FUNC_NAME) (ARG), EXPECTED, \ MAX_ULP, EXCEPTIONS) +#define RUN_TEST_LOOP_f_l(FUNC_NAME, ARRAY, ROUNDING_MODE) \ + IF_ROUND_INIT_ ## ROUNDING_MODE \ + for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++) \ + RUN_TEST_f_l ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg, \ + (ARRAY)[i].expected, (ARRAY)[i].max_ulp, \ + (ARRAY)[i].exceptions); \ + ROUND_RESTORE_ ## ROUNDING_MODE #define RUN_TEST_f_L(TEST_NAME, FUNC_NAME, ARG, EXPECTED, \ MAX_ULP, EXCEPTIONS) \ check_longlong (TEST_NAME, FUNC (FUNC_NAME) (ARG), EXPECTED, \ @@ -10346,195 +10361,187 @@ lgamma_test (void) } +static const struct test_f_l_data lrint_test_data[] = + { + START_DATA (lrint), + /* XXX this test is incomplete. We need to have a way to specifiy + the rounding method and test the critical cases. So far, only + unproblematic numbers are tested. */ + /* TODO: missing +/-Inf as well as qNaN tests. */ + TEST_f_l (lrint, 0.0, 0), + TEST_f_l (lrint, minus_zero, 0), + TEST_f_l (lrint, 0.2L, 0), + TEST_f_l (lrint, -0.2L, 0), + + TEST_f_l (lrint, 1.4L, 1), + TEST_f_l (lrint, -1.4L, -1), + + TEST_f_l (lrint, 8388600.3L, 8388600), + TEST_f_l (lrint, -8388600.3L, -8388600), + + TEST_f_l (lrint, 1071930.0008, 1071930), +#ifndef TEST_FLOAT + TEST_f_l (lrint, 1073741824.01, 1073741824), +# if LONG_MAX > 281474976710656 + TEST_f_l (lrint, 281474976710656.025, 281474976710656), +# endif +#endif + END_DATA (lrint) + }; + static void lrint_test (void) { - /* XXX this test is incomplete. We need to have a way to specifiy - the rounding method and test the critical cases. So far, only - unproblematic numbers are tested. */ - /* TODO: missing +/-Inf as well as qNaN tests. */ - START (lrint); + RUN_TEST_LOOP_f_l (lrint, lrint_test_data, ); + END (lrint); +} + - TEST_f_l (lrint, 0.0, 0); - TEST_f_l (lrint, minus_zero, 0); - TEST_f_l (lrint, 0.2L, 0); - TEST_f_l (lrint, -0.2L, 0); +static const struct test_f_l_data lrint_tonearest_test_data[] = + { + START_DATA (lrint_tonearest), + TEST_f_l (lrint, 0.0, 0), + TEST_f_l (lrint, minus_zero, 0), + TEST_f_l (lrint, 0.2L, 0), + TEST_f_l (lrint, -0.2L, 0), + TEST_f_l (lrint, 0.5L, 0), + TEST_f_l (lrint, -0.5L, 0), + TEST_f_l (lrint, 0.8L, 1), + TEST_f_l (lrint, -0.8L, -1), - TEST_f_l (lrint, 1.4L, 1); - TEST_f_l (lrint, -1.4L, -1); + TEST_f_l (lrint, 1.4L, 1), + TEST_f_l (lrint, -1.4L, -1), - TEST_f_l (lrint, 8388600.3L, 8388600); - TEST_f_l (lrint, -8388600.3L, -8388600); + TEST_f_l (lrint, 8388600.3L, 8388600), + TEST_f_l (lrint, -8388600.3L, -8388600), - TEST_f_l (lrint, 1071930.0008, 1071930); + TEST_f_l (lrint, 1071930.0008, 1071930), #ifndef TEST_FLOAT - TEST_f_l (lrint, 1073741824.01, 1073741824); + TEST_f_l (lrint, 1073741824.01, 1073741824), # if LONG_MAX > 281474976710656 - TEST_f_l (lrint, 281474976710656.025, 281474976710656); + TEST_f_l (lrint, 281474976710656.025, 281474976710656), # endif #endif - - END (lrint); -} - + END_DATA (lrint_tonearest) + }; static void lrint_test_tonearest (void) { - int save_round_mode; START (lrint_tonearest); + RUN_TEST_LOOP_f_l (lrint, lrint_tonearest_test_data, FE_TONEAREST); + END (lrint_tonearest); +} - save_round_mode = fegetround (); - if (!fesetround (FE_TONEAREST)) - { - TEST_f_l (lrint, 0.0, 0); - TEST_f_l (lrint, minus_zero, 0); - TEST_f_l (lrint, 0.2L, 0); - TEST_f_l (lrint, -0.2L, 0); - TEST_f_l (lrint, 0.5L, 0); - TEST_f_l (lrint, -0.5L, 0); - TEST_f_l (lrint, 0.8L, 1); - TEST_f_l (lrint, -0.8L, -1); +static const struct test_f_l_data lrint_towardzero_test_data[] = + { + START_DATA (lrint_towardzero), + TEST_f_l (lrint, 0.0, 0), + TEST_f_l (lrint, minus_zero, 0), + TEST_f_l (lrint, 0.2L, 0), + TEST_f_l (lrint, -0.2L, 0), + TEST_f_l (lrint, 0.5L, 0), + TEST_f_l (lrint, -0.5L, 0), + TEST_f_l (lrint, 0.8L, 0), + TEST_f_l (lrint, -0.8L, 0), - TEST_f_l (lrint, 1.4L, 1); - TEST_f_l (lrint, -1.4L, -1); + TEST_f_l (lrint, 1.4L, 1), + TEST_f_l (lrint, -1.4L, -1), - TEST_f_l (lrint, 8388600.3L, 8388600); - TEST_f_l (lrint, -8388600.3L, -8388600); + TEST_f_l (lrint, 8388600.3L, 8388600), + TEST_f_l (lrint, -8388600.3L, -8388600), - TEST_f_l (lrint, 1071930.0008, 1071930); + TEST_f_l (lrint, 1071930.0008, 1071930), #ifndef TEST_FLOAT - TEST_f_l (lrint, 1073741824.01, 1073741824); + TEST_f_l (lrint, 1073741824.01, 1073741824), # if LONG_MAX > 281474976710656 - TEST_f_l (lrint, 281474976710656.025, 281474976710656); + TEST_f_l (lrint, 281474976710656.025, 281474976710656), # endif #endif - } - - fesetround (save_round_mode); - - END (lrint_tonearest); -} - + END_DATA (lrint_towardzero) + }; static void lrint_test_towardzero (void) { - int save_round_mode; START (lrint_towardzero); + RUN_TEST_LOOP_f_l (lrint, lrint_towardzero_test_data, FE_TOWARDZERO); + END (lrint_towardzero); +} - save_round_mode = fegetround (); - if (!fesetround (FE_TOWARDZERO)) - { - TEST_f_l (lrint, 0.0, 0); - TEST_f_l (lrint, minus_zero, 0); - TEST_f_l (lrint, 0.2L, 0); - TEST_f_l (lrint, -0.2L, 0); - TEST_f_l (lrint, 0.5L, 0); - TEST_f_l (lrint, -0.5L, 0); - TEST_f_l (lrint, 0.8L, 0); - TEST_f_l (lrint, -0.8L, 0); +static const struct test_f_l_data lrint_downward_test_data[] = + { + START_DATA (lrint_downward), + TEST_f_l (lrint, 0.0, 0), + TEST_f_l (lrint, minus_zero, 0), + TEST_f_l (lrint, 0.2L, 0), + TEST_f_l (lrint, -0.2L, -1), + TEST_f_l (lrint, 0.5L, 0), + TEST_f_l (lrint, -0.5L, -1), + TEST_f_l (lrint, 0.8L, 0), + TEST_f_l (lrint, -0.8L, -1), - TEST_f_l (lrint, 1.4L, 1); - TEST_f_l (lrint, -1.4L, -1); + TEST_f_l (lrint, 1.4L, 1), + TEST_f_l (lrint, -1.4L, -2), - TEST_f_l (lrint, 8388600.3L, 8388600); - TEST_f_l (lrint, -8388600.3L, -8388600); + TEST_f_l (lrint, 8388600.3L, 8388600), + TEST_f_l (lrint, -8388600.3L, -8388601), - TEST_f_l (lrint, 1071930.0008, 1071930); + TEST_f_l (lrint, 1071930.0008, 1071930), #ifndef TEST_FLOAT - TEST_f_l (lrint, 1073741824.01, 1073741824); + TEST_f_l (lrint, 1073741824.01, 1073741824), # if LONG_MAX > 281474976710656 - TEST_f_l (lrint, 281474976710656.025, 281474976710656); + TEST_f_l (lrint, 281474976710656.025, 281474976710656), # endif #endif - } - - fesetround (save_round_mode); - - END (lrint_towardzero); -} - + END_DATA (lrint_downward) + }; static void lrint_test_downward (void) { - int save_round_mode; START (lrint_downward); + RUN_TEST_LOOP_f_l (lrint, lrint_downward_test_data, FE_DOWNWARD); + END (lrint_downward); +} - save_round_mode = fegetround (); - if (!fesetround (FE_DOWNWARD)) - { - TEST_f_l (lrint, 0.0, 0); - TEST_f_l (lrint, minus_zero, 0); - TEST_f_l (lrint, 0.2L, 0); - TEST_f_l (lrint, -0.2L, -1); - TEST_f_l (lrint, 0.5L, 0); - TEST_f_l (lrint, -0.5L, -1); - TEST_f_l (lrint, 0.8L, 0); - TEST_f_l (lrint, -0.8L, -1); +static const struct test_f_l_data lrint_upward_test_data[] = + { + START_DATA (lrint_upward), + TEST_f_l (lrint, 0.0, 0), + TEST_f_l (lrint, minus_zero, 0), + TEST_f_l (lrint, 0.2L, 1), + TEST_f_l (lrint, -0.2L, 0), + TEST_f_l (lrint, 0.5L, 1), + TEST_f_l (lrint, -0.5L, 0), + TEST_f_l (lrint, 0.8L, 1), + TEST_f_l (lrint, -0.8L, 0), - TEST_f_l (lrint, 1.4L, 1); - TEST_f_l (lrint, -1.4L, -2); + TEST_f_l (lrint, 1.4L, 2), + TEST_f_l (lrint, -1.4L, -1), - TEST_f_l (lrint, 8388600.3L, 8388600); - TEST_f_l (lrint, -8388600.3L, -8388601); + TEST_f_l (lrint, 8388600.3L, 8388601), + TEST_f_l (lrint, -8388600.3L, -8388600), - TEST_f_l (lrint, 1071930.0008, 1071930); #ifndef TEST_FLOAT - TEST_f_l (lrint, 1073741824.01, 1073741824); -# if LONG_MAX > 281474976710656 - TEST_f_l (lrint, 281474976710656.025, 281474976710656); + TEST_f_l (lrint, 1071930.0008, 1071931), + TEST_f_l (lrint, 1073741824.01, 1073741825), +# if LONG_MAX > 281474976710656 && defined (TEST_LDOUBLE) + TEST_f_l (lrint, 281474976710656.025, 281474976710656), # endif #endif - } - - fesetround (save_round_mode); - - END (lrint_downward); -} - + END_DATA (lrint_upward) + }; static void lrint_test_upward (void) { - int save_round_mode; START (lrint_upward); - - save_round_mode = fegetround (); - - if (!fesetround (FE_UPWARD)) - { - TEST_f_l (lrint, 0.0, 0); - TEST_f_l (lrint, minus_zero, 0); - TEST_f_l (lrint, 0.2L, 1); - TEST_f_l (lrint, -0.2L, 0); - TEST_f_l (lrint, 0.5L, 1); - TEST_f_l (lrint, -0.5L, 0); - TEST_f_l (lrint, 0.8L, 1); - TEST_f_l (lrint, -0.8L, 0); - - TEST_f_l (lrint, 1.4L, 2); - TEST_f_l (lrint, -1.4L, -1); - - TEST_f_l (lrint, 8388600.3L, 8388601); - TEST_f_l (lrint, -8388600.3L, -8388600); - -#ifndef TEST_FLOAT - TEST_f_l (lrint, 1071930.0008, 1071931); - TEST_f_l (lrint, 1073741824.01, 1073741825); -# if LONG_MAX > 281474976710656 && defined (TEST_LDOUBLE) - TEST_f_l (lrint, 281474976710656.025, 281474976710656); -# endif -#endif - } - - fesetround (save_round_mode); - + RUN_TEST_LOOP_f_l (lrint, lrint_upward_test_data, FE_UPWARD); END (lrint_upward); } @@ -11442,46 +11449,51 @@ logb_test_downward (void) END (logb_downward); } -static void -lround_test (void) -{ - /* TODO: missing +/-Inf as well as qNaN tests. */ - - START (lround); - - TEST_f_l (lround, 0, 0); - TEST_f_l (lround, minus_zero, 0); - TEST_f_l (lround, 0.2L, 0.0); - TEST_f_l (lround, -0.2L, 0); - TEST_f_l (lround, 0.5, 1); - TEST_f_l (lround, -0.5, -1); - TEST_f_l (lround, 0.8L, 1); - TEST_f_l (lround, -0.8L, -1); - TEST_f_l (lround, 1.5, 2); - TEST_f_l (lround, -1.5, -2); - TEST_f_l (lround, 22514.5, 22515); - TEST_f_l (lround, -22514.5, -22515); - TEST_f_l (lround, 1071930.0008, 1071930); -#ifndef TEST_FLOAT - TEST_f_l (lround, 1073741824.01, 1073741824); +static const struct test_f_l_data lround_test_data[] = + { + START_DATA (lround), + /* TODO: missing +/-Inf as well as qNaN tests. */ + TEST_f_l (lround, 0, 0), + TEST_f_l (lround, minus_zero, 0), + TEST_f_l (lround, 0.2L, 0.0), + TEST_f_l (lround, -0.2L, 0), + TEST_f_l (lround, 0.5, 1), + TEST_f_l (lround, -0.5, -1), + TEST_f_l (lround, 0.8L, 1), + TEST_f_l (lround, -0.8L, -1), + TEST_f_l (lround, 1.5, 2), + TEST_f_l (lround, -1.5, -2), + TEST_f_l (lround, 22514.5, 22515), + TEST_f_l (lround, -22514.5, -22515), + TEST_f_l (lround, 1071930.0008, 1071930), +#ifndef TEST_FLOAT + TEST_f_l (lround, 1073741824.01, 1073741824), # if LONG_MAX > 281474976710656 - TEST_f_l (lround, 281474976710656.025, 281474976710656); - TEST_f_l (lround, 18014398509481974, 18014398509481974); + TEST_f_l (lround, 281474976710656.025, 281474976710656), + TEST_f_l (lround, 18014398509481974, 18014398509481974), # endif - TEST_f_l (lround, 2097152.5, 2097153); - TEST_f_l (lround, -2097152.5, -2097153); - /* nextafter(0.5,-1) */ - TEST_f_l (lround, 0x1.fffffffffffffp-2, 0); - /* nextafter(-0.5,1) */ - TEST_f_l (lround, -0x1.fffffffffffffp-2, 0); + TEST_f_l (lround, 2097152.5, 2097153), + TEST_f_l (lround, -2097152.5, -2097153), + /* nextafter(0.5,-1) */ + TEST_f_l (lround, 0x1.fffffffffffffp-2, 0), + /* nextafter(-0.5,1) */ + TEST_f_l (lround, -0x1.fffffffffffffp-2, 0), #else - /* nextafter(0.5,-1) */ - TEST_f_l (lround, 0x1.fffffp-2, 0); - /* nextafter(-0.5,1) */ - TEST_f_l (lround, -0x1.fffffp-2, 0); - TEST_f_l (lround, 0x1.fffffep+23, 16777215); - TEST_f_l (lround, -0x1.fffffep+23, -16777215); + /* nextafter(0.5,-1) */ + TEST_f_l (lround, 0x1.fffffp-2, 0), + /* nextafter(-0.5,1) */ + TEST_f_l (lround, -0x1.fffffp-2, 0), + TEST_f_l (lround, 0x1.fffffep+23, 16777215), + TEST_f_l (lround, -0x1.fffffep+23, -16777215), #endif + END_DATA (lround) + }; + +static void +lround_test (void) +{ + START (lround); + RUN_TEST_LOOP_f_l (lround, lround_test_data, ); END (lround); } |