This is the mail archive of the glibc-bugs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug math/887] Math library function "logb" and "nextafter" inconsistent


http://sourceware.org/bugzilla/show_bug.cgi?id=887

Ryan S. Arnold <rsa at us dot ibm.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
         Resolution|                            |FIXED

--- Comment #26 from Ryan S. Arnold <rsa at us dot ibm.com> 2012-04-26 18:15:43 UTC ---
The aforementioned GCC fix allows the usage of the fcfid instruction in 32-bit
mode for power4 which can be used in place the fsub which exhibits the
undesirable trait of a negative sign in downward rounding mode.

The following patch will simply detect and flag this issue in the GLIBC libm
testsuite in the future if GCC insn selection regresses for any reason.

2012-04-26  Ryan S. Arnold  <rsa@linux.vnet.ibm.com>

        [BZ #887]
        * math/libm-test.inc (logb_test_downward): New test to expose 
        erroneous negative sign on -0.0 result of logb[l](1) in FE_DOWNWARD
        rounding mode.

diff --git a/math/libm-test.inc b/math/libm-test.inc
index e0ac613..81de85b 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -5101,6 +5101,40 @@ logb_test (void)
   END (logb);
 }

+static void
+logb_test_downward (void)
+{
+  int save_round_mode;
+  errno = 0;
+
+  FUNC(logb) (0);
+  if (errno == ENOSYS)
+    /* Function not implemented.  */
+    return;
+
+  START (logb_downward);
+
+  save_round_mode = fegetround ();
+
+  if (!fesetround (FE_DOWNWARD))
+    {
+
+      /* IEEE 754-2008 says (section 5.3.3) that "logB(1) is +0.".  Libm
+       * should not return -0 from logb in any rounding mode.  PowerPC32 has
+       * failed with this test for power4 logb (and logbl on all PowerPC
+       * platforms) in the past due to instruction selection.  GCC PR 52775
+       * provides the availability of the fcfid insn in 32-bit mode which
+       * eliminates the use of fsub in this instance and prevents the negative
+       * signed 0.0.  */
+
+      /* BZ #887 .*/
+      TEST_f_f (logb, 1.000e+0, plus_zero);
+    }
+
+  fesetround (save_round_mode);
+
+  END (logb_downward);
+}

 static void
 lround_test (void)
@@ -8210,6 +8244,7 @@ main (int argc, char **argv)
   log1p_test ();
   log2_test ();
   logb_test ();
+  logb_test_downward ();
   modf_test ();
   ilogb_test ();
   scalb_test ();

Tested and verified fixed with gcc version 4.6.4 20120423 (prerelease)
[ibm/gcc-4_6-branch revision 186704] (GCC).

-- 
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]