X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmath%2Ffenv.c;h=def30b7cdc65d9e11b06e5b3c3ed5b57aded146d;hb=8b61f8d659fdce29592182c1d1fb475612406f56;hp=960350443baaad083358cf2f9e0608bc58241e3e;hpb=705b5a4d2d3b6eeb14b201c097252c5918995d98;p=libc-test diff --git a/src/math/fenv.c b/src/math/fenv.c index 9603504..def30b7 100644 --- a/src/math/fenv.c +++ b/src/math/fenv.c @@ -53,9 +53,18 @@ static void test_except() if (r) error("feraiseexcept(%s) returned %d\n", te[i].name, r); r = fetestexcept(FE_ALL_EXCEPT); - if (r != te[i].i) + if (r != te[i].i) { +#if defined FE_OVERFLOW && defined FE_INEXACT + if (te[i].i == FE_OVERFLOW && r == (FE_OVERFLOW|FE_INEXACT)) + continue; +#endif +#if defined FE_UNDERFLOW && defined FE_INEXACT + if (te[i].i == FE_UNDERFLOW && r == (FE_UNDERFLOW|FE_INEXACT)) + continue; +#endif error("feraiseexcept(%s) want %d got %d\n", te[i].name, te[i].i, r); + } } r = feraiseexcept(FE_ALL_EXCEPT); @@ -102,6 +111,8 @@ static void test_round() #pragma STDC FENV_ACCESS ON int i,r; fenv_t env; + volatile float two100 = 0x1p100; + volatile float x; for (i=0; i < sizeof tr/sizeof*tr; i++) { if (tr[i].i < 0) @@ -121,6 +132,11 @@ static void test_round() error("fegetround() = 0x%x, wanted 0x%x (%s)\n", r, tr[i].i, tr[i].name); } +#ifdef FE_UPWARD + r = fesetround(FE_UPWARD); + if (r != 0) + error("fesetround(FE_UPWARD) failed\n"); +#endif r = fegetenv(&env); if (r != 0) error("fegetenv(&env) = %d\n", r); @@ -131,12 +147,24 @@ static void test_round() r = fegetround(); if (r != FE_TONEAREST) error("fesetenv(FE_DFL_ENV) did not set FE_TONEAREST (0x%x), got 0x%x\n", FE_TONEAREST, r); + x = two100 + 1; + if (x != two100) + error("fesetenv(FE_DFL_ENV) did not set FE_TONEAREST, arithmetics rounds upward\n"); + x = two100 - 1; + if (x != two100) + error("fesetenv(FE_DFL_ENV) did not set FE_TONEAREST, arithmetics rounds downward or tozero\n"); r = fesetenv(&env); if (r != 0) error("fesetenv(&env) = %d\n", r); r = fegetround(); if (r != i) error("fesetenv(&env) did not restore 0x%x, got 0x%x\n", i, r); +#ifdef FE_UPWARD + x = two100 + 1; + if (x == two100) + error("fesetenv did not restore upward rounding\n"); +#endif + } /* ieee double precision add operation */