summaryrefslogtreecommitdiff
path: root/sysdeps/ieee754/ldbl-96/s_fmal.c
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2012-10-01 08:30:06 +0000
committerJoseph Myers <joseph@codesourcery.com>2012-10-01 08:30:06 +0000
commitbec749fda1cbc1934f7e58dd2763603f4f207f26 (patch)
tree680a53e980c97e223c0e10353d83a41a5b43fdd0 /sysdeps/ieee754/ldbl-96/s_fmal.c
parent8ec5b01346114da38e806ca1867da688d3a360e2 (diff)
Fix sign of inexact zero return from fma (bug 14645).
Diffstat (limited to 'sysdeps/ieee754/ldbl-96/s_fmal.c')
-rw-r--r--sysdeps/ieee754/ldbl-96/s_fmal.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/sysdeps/ieee754/ldbl-96/s_fmal.c b/sysdeps/ieee754/ldbl-96/s_fmal.c
index c27b0bd852..d125124286 100644
--- a/sysdeps/ieee754/ldbl-96/s_fmal.c
+++ b/sysdeps/ieee754/ldbl-96/s_fmal.c
@@ -50,6 +50,11 @@ __fmal (long double x, long double y, long double z)
&& u.ieee.exponent != 0x7fff
&& v.ieee.exponent != 0x7fff)
return (z + x) + y;
+ /* If z is zero and x are y are nonzero, compute the result
+ as x * y to avoid the wrong sign of a zero result if x * y
+ underflows to 0. */
+ if (z == 0 && x != 0 && y != 0)
+ return x * y;
/* If x or y or z is Inf/NaN, or if fma will certainly overflow,
or if x * y is less than half of LDBL_DENORM_MIN,
compute as x * y + z. */