]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Do not raise "inexact" from generic round (bug 15479).
authorJoseph Myers <joseph@codesourcery.com>
Tue, 24 May 2016 17:46:55 +0000 (17:46 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Tue, 24 May 2016 17:46:55 +0000 (17:46 +0000)
C99 and C11 allow but do not require ceil, floor, round and trunc to
raise the "inexact" exception for noninteger arguments.  TS 18661-1
requires that this exception not be raised by these functions.  This
aligns them with general IEEE semantics, where "inexact" is only
raised if the final step of rounding the infinite-precision result to
the result type is inexact; for these functions, the
infinite-precision integer result is always representable in the
result type, so "inexact" should never be raised.

The generic implementations of ceil, floor and round functions contain
code to force "inexact" to be raised.  This patch removes it for round
functions to align them with TS 18661-1 in this regard.  The tests
*are* updated by this patch; there are fewer architecture-specific
versions than for ceil and floor, and I fixed the powerpc ones some
time ago.  If any others still have the issue, as shown by tests for
round failing with spurious exceptions, they can be fixed separately
by architecture maintainers or others.

Tested for x86_64, x86 and mips64.

[BZ #15479]
* sysdeps/ieee754/dbl-64/s_round.c (huge): Remove variable.
(__round): Do not force "inexact" exception.
* sysdeps/ieee754/dbl-64/wordsize-64/s_round.c (huge): Remove
variable.
(__round): Do not force "inexact" exception.
* sysdeps/ieee754/flt-32/s_roundf.c (huge): Remove variable.
(__roundf): Do not force "inexact" exception.
* sysdeps/ieee754/ldbl-128/s_roundl.c (huge): Remove variable.
(__roundl): Do not force "inexact" exception.
* sysdeps/ieee754/ldbl-96/s_roundl.c (huge): Remove variable.
(__roundl): Do not force "inexact" exception.
* math/libm-test.inc (round_test_data): Do not allow spurious
"inexact" exceptions.

ChangeLog
math/libm-test.inc
sysdeps/ieee754/dbl-64/s_round.c
sysdeps/ieee754/dbl-64/wordsize-64/s_round.c
sysdeps/ieee754/flt-32/s_roundf.c
sysdeps/ieee754/ldbl-128/s_roundl.c
sysdeps/ieee754/ldbl-96/s_roundl.c

index 7837544563ed779b0a72e7368c3f27963428947a..ae458354703079c1c3f3229e0e38ea7d2e4b1bbf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
 2016-05-24  Joseph Myers  <joseph@codesourcery.com>
 
+       [BZ #15479]
+       * sysdeps/ieee754/dbl-64/s_round.c (huge): Remove variable.
+       (__round): Do not force "inexact" exception.
+       * sysdeps/ieee754/dbl-64/wordsize-64/s_round.c (huge): Remove
+       variable.
+       (__round): Do not force "inexact" exception.
+       * sysdeps/ieee754/flt-32/s_roundf.c (huge): Remove variable.
+       (__roundf): Do not force "inexact" exception.
+       * sysdeps/ieee754/ldbl-128/s_roundl.c (huge): Remove variable.
+       (__roundl): Do not force "inexact" exception.
+       * sysdeps/ieee754/ldbl-96/s_roundl.c (huge): Remove variable.
+       (__roundl): Do not force "inexact" exception.
+       * math/libm-test.inc (round_test_data): Do not allow spurious
+       "inexact" exceptions.
+
        [BZ #15479]
        * sysdeps/ieee754/dbl-64/s_floor.c: Do not mention "inexact"
        exception in comment.
index b0451bd62b18414e5a6148505ca186da6a0e8970..81bfc1b7f8222b7dbec79339b1c55418bea26e4c 100644 (file)
@@ -10778,9 +10778,8 @@ static const struct test_f_f_data round_test_data[] =
     TEST_f_f (round, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_f_f (round, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 
-    /* Bug 15479: spurious "inexact" exception may occur.  */
-    TEST_f_f (round, min_subnorm_value, 0.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, min_value, 0.0, ERRNO_UNCHANGED),
+    TEST_f_f (round, min_subnorm_value, 0.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, min_value, 0.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_f_f (round, 1, 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_f_f (round, 2, 2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_f_f (round, 0x1p23, 0x1p23, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
@@ -10799,8 +10798,8 @@ static const struct test_f_f_data round_test_data[] =
     TEST_f_f (round, 0x1p113, 0x1p113, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_f_f (round, 0x1p114, 0x1p114, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_f_f (round, max_value, max_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
-    TEST_f_f (round, -min_subnorm_value, minus_zero, ERRNO_UNCHANGED),
-    TEST_f_f (round, -min_value, minus_zero, ERRNO_UNCHANGED),
+    TEST_f_f (round, -min_subnorm_value, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -min_value, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_f_f (round, -1, -1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_f_f (round, -2, -2, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_f_f (round, -0x1p23, -0x1p23, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
@@ -10820,112 +10819,112 @@ static const struct test_f_f_data round_test_data[] =
     TEST_f_f (round, -0x1p114, -0x1p114, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_f_f (round, -max_value, -max_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 
-    TEST_f_f (round, 0.2L, 0.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, -0.2L, minus_zero, ERRNO_UNCHANGED),
-    TEST_f_f (round, 0.5, 1.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, -0.5, -1.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, 0.8L, 1.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, -0.8L, -1.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, 1.5, 2.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, -1.5, -2.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, 0.1, 0.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, 0.25, 0.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, 0.625, 1.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, -0.1, -0.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, -0.25, -0.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, -0.625, -1.0, ERRNO_UNCHANGED),
-    TEST_f_f (round, 2097152.5, 2097153, ERRNO_UNCHANGED),
-    TEST_f_f (round, -2097152.5, -2097153, ERRNO_UNCHANGED),
+    TEST_f_f (round, 0.2L, 0.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -0.2L, minus_zero, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 0.5, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -0.5, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 0.8L, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -0.8L, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 1.5, 2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -1.5, -2.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 0.1, 0.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 0.25, 0.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 0.625, 1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -0.1, -0.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -0.25, -0.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -0.625, -1.0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 2097152.5, 2097153, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -2097152.5, -2097153, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 
 #ifndef TEST_FLOAT
     TEST_f_f (round, 0xffffffffffff.0p0L, 0xffffffffffff.0p0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
-    TEST_f_f (round, 0xffffffffffff.4p0L, 0xffffffffffff.0p0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 0xffffffffffff.8p0L, 0x1000000000000.0p0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 0xffffffffffff.cp0L, 0x1000000000000.0p0L, ERRNO_UNCHANGED),
+    TEST_f_f (round, 0xffffffffffff.4p0L, 0xffffffffffff.0p0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 0xffffffffffff.8p0L, 0x1000000000000.0p0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 0xffffffffffff.cp0L, 0x1000000000000.0p0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
     TEST_f_f (round, -0xffffffffffff.0p0L, -0xffffffffffff.0p0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
-    TEST_f_f (round, -0xffffffffffff.4p0L, -0xffffffffffff.0p0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -0xffffffffffff.8p0L, -0x1000000000000.0p0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -0xffffffffffff.cp0L, -0x1000000000000.0p0L, ERRNO_UNCHANGED),
+    TEST_f_f (round, -0xffffffffffff.4p0L, -0xffffffffffff.0p0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -0xffffffffffff.8p0L, -0x1000000000000.0p0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -0xffffffffffff.cp0L, -0x1000000000000.0p0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 #endif
 
 #ifdef TEST_LDOUBLE
     /* The result can only be represented in long double.  */
-    TEST_f_f (round, 4503599627370495.5L, 4503599627370496.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 4503599627370496.25L, 4503599627370496.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 4503599627370496.5L, 4503599627370497.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 4503599627370496.75L, 4503599627370497.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 4503599627370497.5L, 4503599627370498.0L, ERRNO_UNCHANGED),
+    TEST_f_f (round, 4503599627370495.5L, 4503599627370496.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 4503599627370496.25L, 4503599627370496.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 4503599627370496.5L, 4503599627370497.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 4503599627370496.75L, 4503599627370497.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 4503599627370497.5L, 4503599627370498.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 # if LDBL_MANT_DIG > 100
-    TEST_f_f (round, 4503599627370494.5000000000001L, 4503599627370495.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 4503599627370495.5000000000001L, 4503599627370496.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 4503599627370496.5000000000001L, 4503599627370497.0L, ERRNO_UNCHANGED),
+    TEST_f_f (round, 4503599627370494.5000000000001L, 4503599627370495.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 4503599627370495.5000000000001L, 4503599627370496.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 4503599627370496.5000000000001L, 4503599627370497.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 # endif
 
-    TEST_f_f (round, -4503599627370495.5L, -4503599627370496.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -4503599627370496.25L, -4503599627370496.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -4503599627370496.5L, -4503599627370497.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -4503599627370496.75L, -4503599627370497.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -4503599627370497.5L, -4503599627370498.0L, ERRNO_UNCHANGED),
+    TEST_f_f (round, -4503599627370495.5L, -4503599627370496.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -4503599627370496.25L, -4503599627370496.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -4503599627370496.5L, -4503599627370497.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -4503599627370496.75L, -4503599627370497.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -4503599627370497.5L, -4503599627370498.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 # if LDBL_MANT_DIG > 100
-    TEST_f_f (round, -4503599627370494.5000000000001L, -4503599627370495.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -4503599627370495.5000000000001L, -4503599627370496.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -4503599627370496.5000000000001L, -4503599627370497.0L, ERRNO_UNCHANGED),
+    TEST_f_f (round, -4503599627370494.5000000000001L, -4503599627370495.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -4503599627370495.5000000000001L, -4503599627370496.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -4503599627370496.5000000000001L, -4503599627370497.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 # endif
 
-    TEST_f_f (round, 9007199254740991.5L, 9007199254740992.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 9007199254740992.25L, 9007199254740992.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 9007199254740992.5L, 9007199254740993.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 9007199254740992.75L, 9007199254740993.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 9007199254740993.5L, 9007199254740994.0L, ERRNO_UNCHANGED),
+    TEST_f_f (round, 9007199254740991.5L, 9007199254740992.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 9007199254740992.25L, 9007199254740992.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 9007199254740992.5L, 9007199254740993.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 9007199254740992.75L, 9007199254740993.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 9007199254740993.5L, 9007199254740994.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 
-    TEST_f_f (round, -9007199254740991.5L, -9007199254740992.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -9007199254740992.25L, -9007199254740992.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -9007199254740992.5L, -9007199254740993.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -9007199254740992.75L, -9007199254740993.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -9007199254740993.5L, -9007199254740994.0L, ERRNO_UNCHANGED),
+    TEST_f_f (round, -9007199254740991.5L, -9007199254740992.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -9007199254740992.25L, -9007199254740992.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -9007199254740992.5L, -9007199254740993.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -9007199254740992.75L, -9007199254740993.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -9007199254740993.5L, -9007199254740994.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 
 # if LDBL_MANT_DIG > 100
-    TEST_f_f (round, 9007199254740991.0000000000001L, 9007199254740991.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 9007199254740992.0000000000001L, 9007199254740992.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 9007199254740993.0000000000001L, 9007199254740993.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 9007199254740991.5000000000001L, 9007199254740992.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 9007199254740992.5000000000001L, 9007199254740993.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 9007199254740993.5000000000001L, 9007199254740994.0L, ERRNO_UNCHANGED),
-
-    TEST_f_f (round, -9007199254740991.0000000000001L, -9007199254740991.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -9007199254740992.0000000000001L, -9007199254740992.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -9007199254740993.0000000000001L, -9007199254740993.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -9007199254740991.5000000000001L, -9007199254740992.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -9007199254740992.5000000000001L, -9007199254740993.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -9007199254740993.5000000000001L, -9007199254740994.0L, ERRNO_UNCHANGED),
+    TEST_f_f (round, 9007199254740991.0000000000001L, 9007199254740991.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 9007199254740992.0000000000001L, 9007199254740992.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 9007199254740993.0000000000001L, 9007199254740993.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 9007199254740991.5000000000001L, 9007199254740992.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 9007199254740992.5000000000001L, 9007199254740993.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 9007199254740993.5000000000001L, 9007199254740994.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+
+    TEST_f_f (round, -9007199254740991.0000000000001L, -9007199254740991.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -9007199254740992.0000000000001L, -9007199254740992.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -9007199254740993.0000000000001L, -9007199254740993.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -9007199254740991.5000000000001L, -9007199254740992.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -9007199254740992.5000000000001L, -9007199254740993.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -9007199254740993.5000000000001L, -9007199254740994.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 # endif
 
-    TEST_f_f (round, 72057594037927935.5L, 72057594037927936.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 72057594037927936.25L, 72057594037927936.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 72057594037927936.5L, 72057594037927937.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 72057594037927936.75L, 72057594037927937.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 72057594037927937.5L, 72057594037927938.0L, ERRNO_UNCHANGED),
+    TEST_f_f (round, 72057594037927935.5L, 72057594037927936.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 72057594037927936.25L, 72057594037927936.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 72057594037927936.5L, 72057594037927937.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 72057594037927936.75L, 72057594037927937.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 72057594037927937.5L, 72057594037927938.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 
-    TEST_f_f (round, -72057594037927935.5L, -72057594037927936.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -72057594037927936.25L, -72057594037927936.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -72057594037927936.5L, -72057594037927937.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -72057594037927936.75L, -72057594037927937.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -72057594037927937.5L, -72057594037927938.0L, ERRNO_UNCHANGED),
+    TEST_f_f (round, -72057594037927935.5L, -72057594037927936.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -72057594037927936.25L, -72057594037927936.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -72057594037927936.5L, -72057594037927937.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -72057594037927936.75L, -72057594037927937.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -72057594037927937.5L, -72057594037927938.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 
     /* Check cases where first double is a exact integer higher than 2^52 and
        the precision is determined by second long double for IBM long double.  */
-    TEST_f_f (round,  34503599627370498.515625L, 34503599627370499.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -34503599627370498.515625L, -34503599627370499.0L, ERRNO_UNCHANGED),
+    TEST_f_f (round,  34503599627370498.515625L, 34503599627370499.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -34503599627370498.515625L, -34503599627370499.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 # if LDBL_MANT_DIG >= 106
-    TEST_f_f (round,  1192568192774434123539907640624.484375L, 1192568192774434123539907640624.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, -1192568192774434123539907640624.484375L, -1192568192774434123539907640624.0L, ERRNO_UNCHANGED),
+    TEST_f_f (round,  1192568192774434123539907640624.484375L, 1192568192774434123539907640624.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, -1192568192774434123539907640624.484375L, -1192568192774434123539907640624.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 # endif
 
-    TEST_f_f (round, 10141204801825835211973625643007.5L, 10141204801825835211973625643008.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 10141204801825835211973625643008.25L, 10141204801825835211973625643008.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 10141204801825835211973625643008.5L, 10141204801825835211973625643009.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 10141204801825835211973625643008.75L, 10141204801825835211973625643009.0L, ERRNO_UNCHANGED),
-    TEST_f_f (round, 10141204801825835211973625643009.5L, 10141204801825835211973625643010.0L, ERRNO_UNCHANGED),
+    TEST_f_f (round, 10141204801825835211973625643007.5L, 10141204801825835211973625643008.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 10141204801825835211973625643008.25L, 10141204801825835211973625643008.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 10141204801825835211973625643008.5L, 10141204801825835211973625643009.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 10141204801825835211973625643008.75L, 10141204801825835211973625643009.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
+    TEST_f_f (round, 10141204801825835211973625643009.5L, 10141204801825835211973625643010.0L, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 #endif
   };
 
index aeed6faf0e43337eba03564b0bd1bdfdf4b407ff..4fe305b3ffd01403ac2948e675d144ee30cc2249 100644 (file)
@@ -22,9 +22,6 @@
 #include <math_private.h>
 
 
-static const double huge = 1.0e300;
-
-
 double
 __round (double x)
 {
@@ -37,8 +34,6 @@ __round (double x)
     {
       if (j0 < 0)
        {
-         math_force_eval (huge + x);
-
          i0 &= 0x80000000;
          if (j0 == -1)
            i0 |= 0x3ff00000;
@@ -50,9 +45,7 @@ __round (double x)
          if (((i0 & i) | i1) == 0)
            /* X is integral.  */
            return x;
-         math_force_eval (huge + x);
 
-         /* Raise inexact if x != 0.  */
          i0 += 0x00080000 >> j0;
          i0 &= ~i;
          i1 = 0;
@@ -73,9 +66,6 @@ __round (double x)
        /* X is integral.  */
        return x;
 
-      math_force_eval (huge + x);
-
-      /* Raise inexact if x != 0.  */
       u_int32_t j = i1 + (1 << (51 - j0));
       if (j < i1)
        i0 += 1;
index f1d75bbe681a614de854012db57c43627c16b27b..688e6af016eb32bc07007c411861c4fbc696b669 100644 (file)
@@ -22,8 +22,6 @@
 #include <math_private.h>
 #include <stdint.h>
 
-static const double huge = 1.0e300;
-
 
 double
 __round (double x)
@@ -36,8 +34,6 @@ __round (double x)
     {
       if (j0 < 0)
        {
-         math_force_eval (huge + x);
-
          i0 &= UINT64_C(0x8000000000000000);
          if (j0 == -1)
            i0 |= UINT64_C(0x3ff0000000000000);
@@ -48,9 +44,7 @@ __round (double x)
          if ((i0 & i) == 0)
            /* X is integral.  */
            return x;
-         math_force_eval (huge + x);
 
-         /* Raise inexact if x != 0.  */
          i0 += UINT64_C(0x0008000000000000) >> j0;
          i0 &= ~i;
        }
index a75d98f38445ffdbb240a003f585aee0754ce561..498aced30caded559d9c2e88c85f6db5ce12f4ac 100644 (file)
@@ -22,9 +22,6 @@
 #include <math_private.h>
 
 
-static const float huge = 1.0e30;
-
-
 float
 __roundf (float x)
 {
@@ -36,8 +33,6 @@ __roundf (float x)
     {
       if (j0 < 0)
        {
-         math_force_eval (huge + x);
-
          i0 &= 0x80000000;
          if (j0 == -1)
            i0 |= 0x3f800000;
@@ -48,9 +43,7 @@ __roundf (float x)
          if ((i0 & i) == 0)
            /* X is integral.  */
            return x;
-         math_force_eval (huge + x);
 
-         /* Raise inexact if x != 0.  */
          i0 += 0x00400000 >> j0;
          i0 &= ~i;
        }
index 98b448e4f3f30d5f11e32dc3e3e8a1ed5681785f..63ffd73d7e456ce1cea9f57401f39c21e8edcf20 100644 (file)
@@ -23,9 +23,6 @@
 #include <math_private.h>
 
 
-static const long double huge = 1.0E4930L;
-
-
 long double
 __roundl (long double x)
 {
@@ -38,13 +35,10 @@ __roundl (long double x)
     {
       if (j0 < 0)
        {
-         if (huge + x > 0.0)
-           {
-             i0 &= 0x8000000000000000ULL;
-             if (j0 == -1)
-               i0 |= 0x3fff000000000000LL;
-             i1 = 0;
-           }
+         i0 &= 0x8000000000000000ULL;
+         if (j0 == -1)
+           i0 |= 0x3fff000000000000LL;
+         i1 = 0;
        }
       else
        {
@@ -52,13 +46,10 @@ __roundl (long double x)
          if (((i0 & i) | i1) == 0)
            /* X is integral.  */
            return x;
-         if (huge + x > 0.0)
-           {
-             /* Raise inexact if x != 0.  */
-             i0 += 0x0000800000000000LL >> j0;
-             i0 &= ~i;
-             i1 = 0;
-           }
+
+         i0 += 0x0000800000000000LL >> j0;
+         i0 &= ~i;
+         i1 = 0;
        }
     }
   else if (j0 > 111)
@@ -76,14 +67,10 @@ __roundl (long double x)
        /* X is integral.  */
        return x;
 
-      if (huge + x > 0.0)
-       {
-         /* Raise inexact if x != 0.  */
-         u_int64_t j = i1 + (1LL << (111 - j0));
-         if (j < i1)
-           i0 += 1;
-         i1 = j;
-       }
+      u_int64_t j = i1 + (1LL << (111 - j0));
+      if (j < i1)
+       i0 += 1;
+      i1 = j;
       i1 &= ~i;
     }
 
index 4f35c4847b5a2274e2fd2f3fa44b2ec91fd0a3b0..5a6988cd8bef072109d0990a15faa7e6f1c35e49 100644 (file)
@@ -22,9 +22,6 @@
 #include <math_private.h>
 
 
-static const long double huge = 1.0e4930L;
-
-
 long double
 __roundl (long double x)
 {
@@ -37,7 +34,6 @@ __roundl (long double x)
     {
       if (j0 < 0)
        {
-         math_force_eval (huge + x);
          se &= 0x8000;
          i0 = i1 = 0;
          if (j0 == -1)
@@ -53,8 +49,6 @@ __roundl (long double x)
            /* X is integral.  */
            return x;
 
-         /* Raise inexact if x != 0.  */
-         math_force_eval (huge + x);
          u_int32_t j = i0 + (0x40000000 >> j0);
          if (j < i0)
            se += 1;
@@ -77,8 +71,6 @@ __roundl (long double x)
        /* X is integral.  */
        return x;
 
-      math_force_eval (huge + x);
-      /* Raise inexact if x != 0.  */
       u_int32_t j = i1 + (1 << (62 - j0));
       if (j < i1)
        {