diff options
author | Joseph Myers <joseph@codesourcery.com> | 2015-10-23 21:37:33 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2015-10-23 21:37:33 +0000 |
commit | c643db8792102d1a2efad109f58139977d8608d6 (patch) | |
tree | 174813e539b6cdf509201237756ec2b02e2247ce /sysdeps/ieee754/flt-32/e_jnf.c | |
parent | 846d9a4a3acdb4939ca7bf6aed48f9f6f26911be (diff) | |
download | glibc-c643db8792102d1a2efad109f58139977d8608d6.zip glibc-c643db8792102d1a2efad109f58139977d8608d6.tar.gz glibc-c643db8792102d1a2efad109f58139977d8608d6.tar.bz2 |
Fix j1, jn missing errno setting on underflow (bug 18611).
j1 and jn can underflow for small arguments, but fail to set errno
when underflowing to 0. This patch fixes them to set errno in that
case.
Tested for x86_64, x86, mips64 and powerpc.
[BZ #18611]
* sysdeps/ieee754/dbl-64/e_j1.c (__ieee754_j1): Set errno and
avoid excess range and precision on underflow.
* sysdeps/ieee754/dbl-64/e_jn.c (__ieee754_jn): Likewise.
* sysdeps/ieee754/flt-32/e_j1f.c (__ieee754_j1f): Likewise.
* sysdeps/ieee754/flt-32/e_jnf.c (__ieee754_jnf): Likewise.
* sysdeps/ieee754/ldbl-128/e_j1l.c (__ieee754_j1l): Set errno on
underflow.
* sysdeps/ieee754/ldbl-128/e_jnl.c (__ieee754_jnl): Likewise.
* sysdeps/ieee754/ldbl-128ibm/e_jnl.c (__ieee754_jnl): Likewise.
* sysdeps/ieee754/ldbl-96/e_j1l.c (__ieee754_j1l): Likewise.
* sysdeps/ieee754/ldbl-96/e_jnl.c (__ieee754_jnl): Likewise.
* math/auto-libm-test-in: Do not allow missing errno setting for
tests of j1 and jn.
* math/auto-libm-test-out: Regenerated.
Diffstat (limited to 'sysdeps/ieee754/flt-32/e_jnf.c')
-rw-r--r-- | sysdeps/ieee754/flt-32/e_jnf.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/sysdeps/ieee754/flt-32/e_jnf.c b/sysdeps/ieee754/flt-32/e_jnf.c index d18922a..4e63477 100644 --- a/sysdeps/ieee754/flt-32/e_jnf.c +++ b/sysdeps/ieee754/flt-32/e_jnf.c @@ -167,9 +167,13 @@ __ieee754_jnf(int n, float x) } } if(sgn==1) ret = -b; else ret = b; + ret = math_narrow_eval (ret); } if (ret == 0) - ret = __copysignf (FLT_MIN, ret) * FLT_MIN; + { + ret = math_narrow_eval (__copysignf (FLT_MIN, ret) * FLT_MIN); + __set_errno (ERANGE); + } else math_check_force_underflow (ret); return ret; |