diff --git a/ChangeLog b/ChangeLog index 9cd1d707d4..23487d7e42 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2016-03-10 Joseph Myers + + * 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 [BZ #19762] diff --git a/manual/math.texi b/manual/math.texi index 72f3fda0a3..5c9f7b9f1c 100644 --- a/manual/math.texi +++ b/manual/math.texi @@ -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 diff --git a/math/libm-test.inc b/math/libm-test.inc index c9925fddb7..f1ba7dda99 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -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