flockfile list corruption test
[libc-test] / src / math / fenv.c
index 8a2c78e..91b6378 100644 (file)
@@ -102,6 +102,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 +123,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 +138,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 */
@@ -211,27 +230,30 @@ static void test_bad(void)
        fexcept_t f;
        int r;
 
-       r = fetestexcept(1234567);
-       if (r == 0)
-               error("fetestexcept should return non-zero on non-supported exceptions\n");
-       r = feraiseexcept(1234567);
-       if (r == 0)
-               error("feraiseexcept should return non-zero on non-supported exceptions\n");
-       r = feclearexcept(1234567);
-       if (r == 0)
-               error("feclearexcept should return non-zero on non-supported exceptions\n");
+       r = feclearexcept(FE_ALL_EXCEPT);
+       if (r != 0)
+               error("feclearexcept(FE_ALL_EXCEPT) failed\n");
+       r = fetestexcept(-1);
+       if (r != 0)
+               error("fetestexcept(-1) should return 0 when all exceptions are cleared, got %d\n", r);
+       r = feraiseexcept(1234567|FE_ALL_EXCEPT);
+       if (r != 0)
+               error("feraiseexcept returned non-zero for non-supported exceptions: %d\n", r);
+       r = feclearexcept(1234567|FE_ALL_EXCEPT);
+       if (r != 0)
+               error("feclearexcept returned non-zero for non-supported exceptions: %d\n", r);
        r = fesetround(1234567);
        if (r == 0)
                error("fesetround should fail on invalid rounding mode\n");
        r = fegetexceptflag(&f, 1234567);
-       if (r == 0)
-               error("fegetexceptflag should return non-zero on non-supported exceptions\n");
+       if (r != 0)
+               error("fegetexceptflag returned non-zero for non-supported exceptions: %d\n", r);
        r = fegetexceptflag(&f, 0);
        if (r != 0)
                error("fegetexceptflag(0) failed\n");
        r = fesetexceptflag(&f, 1234567);
-       if (r == 0)
-               error("fesetexceptflag should return non-zero on non-supported exceptions\n");
+       if (r != 0)
+               error("fesetexceptflag returned non-zero fir non-supported exceptions: %d\n", r);
 }
 
 int main(void)