From c60d3bf2fa54298f2dcdea1cceda63e0c0b14ae3 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Thu, 22 Nov 2012 15:00:35 +0000 Subject: [PATCH] Fix sign of inexact zero results for ldbl-128ibm fmal. --- ChangeLog | 4 ++++ sysdeps/ieee754/ldbl-128ibm/s_fmal.c | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index ff04e57..dc67044 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2012-11-22 Joseph Myers + [BZ #14645] + * sysdeps/ieee754/ldbl-128ibm/s_fmal.c (__fmal): Compute result as + x * y if x and y are nonzero and z is zero. + [BZ #14811] * sysdeps/ieee754/ldbl-128ibm/e_powl.c (__ieee754_powl): Saturate nonzero exponents with absolute value below 0x1p-117 to +/- diff --git a/sysdeps/ieee754/ldbl-128ibm/s_fmal.c b/sysdeps/ieee754/ldbl-128ibm/s_fmal.c index a868b8d..6706eb2 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_fmal.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_fmal.c @@ -1,5 +1,5 @@ /* Compute x * y + z as ternary operation. - Copyright (C) 2011 Free Software Foundation, Inc. + Copyright (C) 2011-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by David Flaherty . @@ -29,6 +29,12 @@ __fmal (long double x, long double y, long double z) if ((finite ((double)x) && finite ((double)y)) && isinf ((double)z)) return (z); + /* 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; + return (x * y) + z; } #ifdef IS_IN_libm -- 2.7.4