]> Savannah Git Hosting - gnulib.git/commitdiff
expm1l: Work around a NetBSD 10.0/i386 bug.
authorBruno Haible <bruno@clisp.org>
Sat, 6 Apr 2024 10:01:59 +0000 (12:01 +0200)
committerBruno Haible <bruno@clisp.org>
Mon, 8 Apr 2024 11:20:34 +0000 (13:20 +0200)
* m4/expm1l.m4 (gl_FUNC_EXPM1L): Test the value of
expm1l(2^LDBL_MIN_EXP).
* tests/test-expm1.h (test_function): Allow more deviation on
NetBSD/i386.

ChangeLog
m4/expm1l.m4
tests/test-expm1.h

index 1700343465541fc875ac07b1e87f3b25f8d706ad..920e0a6a887557c442e234634c0db868e0580db6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2024-04-06  Bruno Haible  <bruno@clisp.org>
+
+       expm1l: Work around a NetBSD 10.0/i386 bug.
+       * m4/expm1l.m4 (gl_FUNC_EXPM1L): Test the value of
+       expm1l(2^LDBL_MIN_EXP).
+       * tests/test-expm1.h (test_function): Allow more deviation on
+       NetBSD/i386.
+
 2024-04-05  Bruno Haible  <bruno@clisp.org>
 
        exp2l: Work around a NetBSD 10.0/i386 bug.
index 78c7a3d5794e1c2c2ad96aebce4b9238082a61e0..437599088e5d477c266dbabe0c8b682efa11e8cb 100644 (file)
@@ -1,5 +1,5 @@
-# expm1l.m4 serial 10
-dnl Copyright (C) 2010-2023 Free Software Foundation, Inc.
+# expm1l.m4 serial 10.1
+dnl Copyright (C) 2010-2024 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -124,7 +124,7 @@ int main (int argc, char *argv[])
   long double (* volatile my_expm1l) (long double) = argc ? expm1l : dummy;
   int result = 0;
   /* This test fails on musl 1.2.2/arm64, musl 1.2.2/s390x, Mac OS X 10.5,
-     NetBSD 8.0.  */
+     NetBSD 10.0/x86_64.  */
   {
     const long double TWO_LDBL_MANT_DIG = /* 2^LDBL_MANT_DIG */
       (long double) (1U << ((LDBL_MANT_DIG - 1) / 5))
@@ -140,6 +140,18 @@ int main (int argc, char *argv[])
     if (!(err >= -100.0L && err <= 100.0L))
       result |= 1;
   }
+  /* This test fails on NetBSD 10.0/i386.  */
+  {
+    int i;
+    long double x;
+    volatile long double y;
+    for (i = -1, x = 0.5L; i > LDBL_MIN_EXP; i--, x *= 0.5L)
+      ;
+    /* Here i = LDBL_MIN_EXP, x = 2^LDBL_MIN_EXP.  */
+    y = my_expm1l (x);
+    if (!(y >= x))
+      result |= 2;
+  }
   return result;
 }
             ]])],
index 68f3f6be6fe20e96ee82ba70de04a9596d17a931..fc92617a05e07f9a9e3f3b8588f49598687c6d0e 100644 (file)
@@ -1,5 +1,5 @@
 /* Test of expm1*() function family.
-   Copyright (C) 2012-2023 Free Software Foundation, Inc.
+   Copyright (C) 2012-2024 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -52,7 +52,9 @@ test_function (void)
     /* Error bound, in ulps.  */
     const DOUBLE err_bound =
       (sizeof (DOUBLE) > sizeof (double) ?
-#if defined __i386__ && defined __FreeBSD__
+#if defined __i386__ && defined __NetBSD__
+       L_(1025.0)
+#elif defined __i386__ && defined __FreeBSD__
        /* On FreeBSD/x86 6.4, the 'long double' type really has only 53 bits of
           precision in the compiler but 64 bits of precision at runtime.  See
           <https://lists.gnu.org/r/bug-gnulib/2008-07/msg00063.html>.
@@ -83,6 +85,8 @@ test_function (void)
       (sizeof (DOUBLE) > sizeof (double) ?
 #if defined __i386__ && defined __FreeBSD__
        L_(1536.0)
+#elif defined __i386__ && defined __NetBSD__
+       L_(1026.0)
 #else
        L_(11.0)
 #endif