diff options
author | Joseph Myers <joseph@codesourcery.com> | 2016-06-13 17:27:19 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2016-06-13 17:27:19 +0000 |
commit | 88283451b26de29d08ba33148cf2f8cb2680f6f0 (patch) | |
tree | 334945ab68b411d9bac8696fbcaba40a6598ed2b /sysdeps/ieee754/ldbl-128/s_frexpl.c | |
parent | b39b6e0c902f0bf5f99d593b8f5953943777c610 (diff) | |
download | glibc-88283451b26de29d08ba33148cf2f8cb2680f6f0.zip glibc-88283451b26de29d08ba33148cf2f8cb2680f6f0.tar.gz glibc-88283451b26de29d08ba33148cf2f8cb2680f6f0.tar.bz2 |
Fix frexp (NaN) (bug 20250).
Various implementations of frexp functions return sNaN for sNaN
input. This patch fixes them to add such arguments to themselves so
that qNaN is returned.
Tested for x86_64, x86, mips64 and powerpc.
[BZ #20250]
* sysdeps/i386/fpu/s_frexpl.S (__frexpl): Add non-finite input to
itself.
* sysdeps/ieee754/dbl-64/s_frexp.c (__frexp): Add non-finite or
zero input to itself.
* sysdeps/ieee754/dbl-64/wordsize-64/s_frexp.c (__frexp):
Likewise.
* sysdeps/ieee754/flt-32/s_frexpf.c (__frexpf): Likewise.
* sysdeps/ieee754/ldbl-128/s_frexpl.c (__frexpl): Likewise.
* sysdeps/ieee754/ldbl-128ibm/s_frexpl.c (__frexpl): Likewise.
* sysdeps/ieee754/ldbl-96/s_frexpl.c (__frexpl): Likewise.
* math/libm-test.inc (frexp_test_data): Add sNaN tests.
Diffstat (limited to 'sysdeps/ieee754/ldbl-128/s_frexpl.c')
-rw-r--r-- | sysdeps/ieee754/ldbl-128/s_frexpl.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/sysdeps/ieee754/ldbl-128/s_frexpl.c b/sysdeps/ieee754/ldbl-128/s_frexpl.c index d61ddda..70b2d3a 100644 --- a/sysdeps/ieee754/ldbl-128/s_frexpl.c +++ b/sysdeps/ieee754/ldbl-128/s_frexpl.c @@ -39,7 +39,7 @@ long double __frexpl(long double x, int *eptr) GET_LDOUBLE_WORDS64(hx,lx,x); ix = 0x7fffffffffffffffULL&hx; *eptr = 0; - if(ix>=0x7fff000000000000ULL||((ix|lx)==0)) return x; /* 0,inf,nan */ + if(ix>=0x7fff000000000000ULL||((ix|lx)==0)) return x + x;/* 0,inf,nan */ if (ix<0x0001000000000000ULL) { /* subnormal */ x *= two114; GET_LDOUBLE_MSW64(hx,x); |