Fix sign of inexact zero results for ldbl-128ibm fmal.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 22 Nov 2012 15:00:35 +0000 (15:00 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 22 Nov 2012 15:00:35 +0000 (15:00 +0000)
ChangeLog
sysdeps/ieee754/ldbl-128ibm/s_fmal.c

index ff04e57..dc67044 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2012-11-22  Joseph Myers  <joseph@codesourcery.com>
 
+       [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 +/-
index a868b8d..6706eb2 100644 (file)
@@ -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 <flaherty@linux.vnet.ibm.com>.
 
@@ -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