]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Allow spurious underflow / inexact for ldbl-128ibm.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 10 Mar 2016 23:48:46 +0000 (23:48 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 10 Mar 2016 23:48:46 +0000 (23:48 +0000)
A large number of the test-ldouble failures seen for ldbl-128ibm are
spurious "underflow" and "inexact" exceptions.  These arise from such
exceptions in the underlying arithmetic; unlike other spurious
exceptions from that arithmetic, they do not in general relate to
cases where the returned result is also substantially inaccurate, are
not so readily avoidable by appropriately conditional libgcc patches,
and are widespread enough to be hard to handle through individual
XFAILing of the affected tests.

Thus, this patch documents relaxed accuracy goals for libm functions
for IBM long double and makes libm-test.inc reflect these spurious
exceptions in ldbl-128ibm arithmetic and always allow them in
ldbl-128ibm testing (while still not allowing these exceptions to be
missing where required to be present).  Tested for powerpc.

* manual/math.texi (Errors in Math Functions): Document relaxed
accuracy goals for IBM long double.
* math/libm-test.inc (test_exceptions): Always allow spurious
"underflow" and "inexact" exceptions for IBM long double.

ChangeLog
manual/math.texi
math/libm-test.inc

index 9cd1d707d45e7278faf24f673c015a019361b738..23487d7e42c982da7eac99f8d06e83d99a301bf0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2016-03-10  Joseph Myers  <joseph@codesourcery.com>
+
+       * manual/math.texi (Errors in Math Functions): Document relaxed
+       accuracy goals for IBM long double.
+       * math/libm-test.inc (test_exceptions): Always allow spurious
+       "underflow" and "inexact" exceptions for IBM long double.
+
 2016-03-10  H.J. Lu  <hongjiu.lu@intel.com>
 
        [BZ #19762]
index 72f3fda0a3f3f0e1fb8ed0eb54aa6caf30d6eb2a..5c9f7b9f1c62247e55b5e33e8a3e00fef92bbf5d 100644 (file)
@@ -1326,6 +1326,16 @@ interpreted in terms of a fixed-precision 106-bit mantissa, but not
 necessarily the exact value actually passed with discontiguous
 mantissa bits.
 
+@item
+For the IBM @code{long double} format, functions whose results are
+fully specified by reference to corresponding IEEE 754 floating-point
+operations have the same accuracy goals as other functions, but with
+the error bound being the same as that for division (3ulp).
+Furthermore, ``inexact'' and ``underflow'' exceptions may be raised
+for all functions for any inputs, even where such exceptions are
+inconsistent with the returned value, since the underlying
+floating-point arithmetic has that property.
+
 @item
 Functions behave as if the infinite-precision result computed is zero,
 infinity or NaN if and only if that is the mathematically correct
index c9925fddb75815ad52ca585bbbd7168a0b432cc5..f1ba7dda99690dd23d2a201d3a236e73bc86ef4a 100644 (file)
@@ -672,13 +672,20 @@ test_exceptions (const char *test_name, int exception)
        test_single_exception (test_name, exception, OVERFLOW_EXCEPTION,
                               FE_OVERFLOW, "Overflow");
 #endif
+      /* Spurious "underflow" and "inexact" exceptions are always
+        allowed for IBM long double, in line with the underlying
+        arithmetic.  */
 #ifdef FE_UNDERFLOW
-      if ((exception & UNDERFLOW_EXCEPTION_OK) == 0)
+      if ((exception & UNDERFLOW_EXCEPTION_OK) == 0
+         && !(TEST_COND_ldbl_128ibm
+              && (exception & UNDERFLOW_EXCEPTION) == 0))
        test_single_exception (test_name, exception, UNDERFLOW_EXCEPTION,
                               FE_UNDERFLOW, "Underflow");
 #endif
 #ifdef FE_INEXACT
-      if ((exception & (INEXACT_EXCEPTION | NO_INEXACT_EXCEPTION)) != 0)
+      if ((exception & (INEXACT_EXCEPTION | NO_INEXACT_EXCEPTION)) != 0
+         && !(TEST_COND_ldbl_128ibm
+              && (exception & NO_INEXACT_EXCEPTION) != 0))
        test_single_exception (test_name, exception, INEXACT_EXCEPTION,
                               FE_INEXACT, "Inexact");
 #endif