This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] Add testcase for expl
- From: Stefan Liebler <stli at linux dot vnet dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Date: Fri, 07 Feb 2014 11:19:27 +0100
- Subject: Re: [PATCH] Add testcase for expl
- Authentication-results: sourceware.org; auth=none
- References: <ld0ad7$fms$1 at ger dot gmane dot org> <Pine dot LNX dot 4 dot 64 dot 1402061620340 dot 11833 at digraph dot polyomino dot org dot uk>
On 02/06/2014 05:22 PM, Joseph S. Myers wrote:
On Thu, 6 Feb 2014, Stefan Liebler wrote:
Hi,
due to Bug 16447, the function __erfcl
in sysdeps/ieee754/ldbl-128/s_erfl.c
calls __ieee754_expl in sysdeps/ieee754/ldbl-128/e_expl.c.
The value returned by expl is a normalized value, but FE_UNDERFLOW is set on
S/390. Therefore the testcase shows the problem directly.
"Bug N" comments in auto-libm-test-in are present as justification for
xfail, missing-* or spurious-* annotations for tests (searching for "bug"
in the file shows exactly what's marked as expected to fail because of
known bugs). Thus, if adding the test on its own (and normally the test
would be added by the same patch fixing the bug, rather than before the
fix), there should be a spurious-underflow:ldbl-128 annotation.
okay. Here is the testcase with the fix for expl (see Bug 16447).
But now the double test fails:
testing double (without inline functions)
Failure: Test: exp_upward (-0x2.c4edp+12)
Result:
is: 0.00000000000000000000e+00 0x0.00000000000000000000p+0
should be: 4.94065645841246544177e-324 0x0.00000000000010000000p-1022
difference: 4.94065645841246544177e-324 0x0.00000000000010000000p-1022
ulp : 1.0000
max.ulp : 0.0000
The same thing for the inlined version.
In all rounding-modes, the exp-function returns zero and
errno=ERANGE,FE_INEXACT and FE_UNDERFLOW are set.
---
2014-02-07 Stefan Liebler <stli@linux.vnet.ibm.com>
* math/auto-libm-test-in: Add testcase for expl
* math/auto-libm-test-out: Likewise
* sysdeps/ieee754/ldbl-128/e_expl.c: Fix calculation of unsafe
---
diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in
index b919dbc..c620361 100644
--- a/math/auto-libm-test-in
+++ b/math/auto-libm-test-in
@@ -725,6 +725,7 @@ exp max xfail-rounding:dbl-64 xfail-rounding:ldbl-128ibm
exp -7.4444006192138124e+02
exp -0x1.75f113c30b1c8p+9
exp -max
+exp -11342.8125
exp10 0
exp10 -0
diff --git a/math/auto-libm-test-out b/math/auto-libm-test-out
index 8955e18..93818e8 100644
--- a/math/auto-libm-test-out
+++ b/math/auto-libm-test-out
@@ -62149,6 +62149,31 @@ exp -max
= exp tonearest ldbl-128ibm -0xf.ffffffffffffbffffffffffffcp+1020L :
0x0p+0L : inexact-ok underflow errno-erange
= exp towardzero ldbl-128ibm -0xf.ffffffffffffbffffffffffffcp+1020L :
0x0p+0L : inexact-ok underflow errno-erange
= exp upward ldbl-128ibm -0xf.ffffffffffffbffffffffffffcp+1020L :
0x4p-1076L : inexact-ok underflow errno-erange-ok
+exp -11342.8125
+= exp downward flt-32 -0x2.c4edp+12f : 0x0p+0f : inexact-ok underflow
errno-erange
+= exp tonearest flt-32 -0x2.c4edp+12f : 0x0p+0f : inexact-ok underflow
errno-erange
+= exp towardzero flt-32 -0x2.c4edp+12f : 0x0p+0f : inexact-ok underflow
errno-erange
+= exp upward flt-32 -0x2.c4edp+12f : 0x8p-152f : inexact-ok underflow
errno-erange-ok
+= exp downward dbl-64 -0x2.c4edp+12 : 0x0p+0 : inexact-ok underflow
errno-erange
+= exp tonearest dbl-64 -0x2.c4edp+12 : 0x0p+0 : inexact-ok underflow
errno-erange
+= exp towardzero dbl-64 -0x2.c4edp+12 : 0x0p+0 : inexact-ok underflow
errno-erange
+= exp upward dbl-64 -0x2.c4edp+12 : 0x4p-1076 : inexact-ok underflow
errno-erange-ok
+= exp downward ldbl-96-intel -0x2.c4edp+12L :
0xd.be48e2532594eccp-16368L : inexact-ok
+= exp tonearest ldbl-96-intel -0x2.c4edp+12L :
0xd.be48e2532594eccp-16368L : inexact-ok
+= exp towardzero ldbl-96-intel -0x2.c4edp+12L :
0xd.be48e2532594eccp-16368L : inexact-ok
+= exp upward ldbl-96-intel -0x2.c4edp+12L : 0xd.be48e2532594ecdp-16368L
: inexact-ok
+= exp downward ldbl-96-m68k -0x2.c4edp+12L :
0xd.be48e2532594eccp-16368L : inexact-ok
+= exp tonearest ldbl-96-m68k -0x2.c4edp+12L :
0xd.be48e2532594eccp-16368L : inexact-ok
+= exp towardzero ldbl-96-m68k -0x2.c4edp+12L :
0xd.be48e2532594eccp-16368L : inexact-ok
+= exp upward ldbl-96-m68k -0x2.c4edp+12L : 0xd.be48e2532594ecdp-16368L
: inexact-ok
+= exp downward ldbl-128 -0x2.c4edp+12L :
0xd.be48e2532594ecc1a3b8f7ce2038p-16368L : inexact-ok
+= exp tonearest ldbl-128 -0x2.c4edp+12L :
0xd.be48e2532594ecc1a3b8f7ce2038p-16368L : inexact-ok
+= exp towardzero ldbl-128 -0x2.c4edp+12L :
0xd.be48e2532594ecc1a3b8f7ce2038p-16368L : inexact-ok
+= exp upward ldbl-128 -0x2.c4edp+12L :
0xd.be48e2532594ecc1a3b8f7ce204p-16368L : inexact-ok
+= exp downward ldbl-128ibm -0x2.c4edp+12L : 0x0p+0L : inexact-ok
underflow errno-erange
+= exp tonearest ldbl-128ibm -0x2.c4edp+12L : 0x0p+0L : inexact-ok
underflow errno-erange
+= exp towardzero ldbl-128ibm -0x2.c4edp+12L : 0x0p+0L : inexact-ok
underflow errno-erange
+= exp upward ldbl-128ibm -0x2.c4edp+12L : 0x4p-1076L : inexact-ok
underflow errno-erange-ok
exp10 0
= exp10 downward flt-32 0x0p+0f : 0x1p+0f : inexact-ok
= exp10 tonearest flt-32 0x0p+0f : 0x1p+0f : inexact-ok
diff --git a/sysdeps/ieee754/ldbl-128/e_expl.c
b/sysdeps/ieee754/ldbl-128/e_expl.c
index 8259758..ae2604e 100644
--- a/sysdeps/ieee754/ldbl-128/e_expl.c
+++ b/sysdeps/ieee754/ldbl-128/e_expl.c
@@ -181,7 +181,7 @@ __ieee754_expl (long double x)
* __expl_table[T_EXPL_RES2 + tval2];
n_i = (int)n;
/* 'unsafe' is 1 iff n_1 != 0. */
- unsafe = abs(n_i) >= -LDBL_MIN_EXP - 1;
+ unsafe = abs(n_i) >= 15000;
ex2_u.ieee.exponent += n_i >> unsafe;
/* Compute scale = 2^n_1. */