From: Gabriel F. T. Gomes Date: Fri, 6 Jan 2017 15:05:30 +0000 (-0200) Subject: ldbl-128: Fix y0 and y1 for -Inf input [BZ #21130] X-Git-Tag: glibc-2.26~788 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b987917e6aa7ffe2fd74f0b6a989438e6edd0727;p=thirdparty%2Fglibc.git ldbl-128: Fix y0 and y1 for -Inf input [BZ #21130] The Bessel functions of the second type (Yn) are not defined for negative input and should return NAN with the "invalid" exception raised, in these cases. However, current code checks for infinity and return zero, regardless of the sign. This error is exposed for long double when linking with -lieee. Without this flag, the error is not exposed, because the wrappers for these functions, which use __kernel_standard functionality, return the correct value. Tested for powerpc64le. [BZ #21130] * sysdeps/ieee754/ldbl-128/e_j0l.c (__ieee754_y0l): Return NAN with the "invalid" exception raised when x is -Inf. * sysdeps/ieee754/ldbl-128/e_j1l.c (__ieee754_y1l): Likewise. --- diff --git a/ChangeLog b/ChangeLog index fac0e11c40b..27f41f7ad04 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2017-02-12 Gabriel F. T. Gomes + + [BZ #21130] + * sysdeps/ieee754/ldbl-128/e_j0l.c (__ieee754_y0l): Return NAN + with the "invalid" exception raised when x is -Inf. + * sysdeps/ieee754/ldbl-128/e_j1l.c (__ieee754_y1l): Likewise. + 2017-02-10 Wilco Dijkstra * string/bits/string2.h (strchr): Remove define. diff --git a/sysdeps/ieee754/ldbl-128/e_j0l.c b/sysdeps/ieee754/ldbl-128/e_j0l.c index d7110071368..855b5a578ba 100644 --- a/sysdeps/ieee754/ldbl-128/e_j0l.c +++ b/sysdeps/ieee754/ldbl-128/e_j0l.c @@ -829,12 +829,7 @@ _Float128 _Float128 xx, xinv, z, p, q, c, s, cc, ss; if (! isfinite (x)) - { - if (x != x) - return x + x; - else - return 0; - } + return 1 / (x + x * x); if (x <= 0) { if (x < 0) diff --git a/sysdeps/ieee754/ldbl-128/e_j1l.c b/sysdeps/ieee754/ldbl-128/e_j1l.c index 9e782305d9d..db8dca0ab13 100644 --- a/sysdeps/ieee754/ldbl-128/e_j1l.c +++ b/sysdeps/ieee754/ldbl-128/e_j1l.c @@ -847,12 +847,7 @@ __ieee754_y1l (_Float128 x) _Float128 xx, xinv, z, p, q, c, s, cc, ss; if (! isfinite (x)) - { - if (x != x) - return x + x; - else - return 0; - } + return 1 / (x + x * x); if (x <= 0) { if (x < 0)