public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 00/17] Add more CORE-MATH on libm
@ 2024-10-25 18:21 Adhemerval Zanella
  2024-10-25 18:21 ` [PATCH 01/17] math: Add e_gammaf_r to glibc code and style Adhemerval Zanella
                   ` (17 more replies)
  0 siblings, 18 replies; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

Following the tgammaf implementation (392b3f0971764) and its telling
performance improvement, I worked with Pauz Zimmermann to check if we
can integrate more routines on glibc.

This patchset adds the optimized and correctly rounded exp10m1f,
exp2m1f, expm1f, log10f, log2p1f, log1pf, and log10p1f. I also added
a benchmark to evaluate each implementation.

I tested the implementation on recent hardware (Ryzen 9 5900X for
x86_64, Ampere/Neoverse for aarch64, and POWER10 for powerpc), and
most of the implementation shows impressive performance
improvements. Like the implementation from ARM optimized routines,
the CORE-MATH one takes advantage of recent ISA and platform support
(like fma and rounding instructions, along with FP throughpu).

For a couple of implementations, exp10m1f, and exp2m1f, CORE-MATH
shows slightly worse performance for x86_64-v1. It is due the glibc
generic implementation that calls optimized exp10f/exp2f, and when a
more recent ISA is used (x86_64-v2 or x86_64-v3) CORE-MATH shows a
better output than the current implementation. For both cases I added
iFUNC support to use FMA on x86_64. 

Adhemerval Zanella (17):
  math: Add e_gammaf_r to glibc code and style
  benchtests: Add exp10m1f benchmark
  benchtests: Add exp2m1f benchmark
  benchtests: Add expm1f benchmark
  benchtests: Add log10f benchmark
  benchtests: Add log2p1f benchmark
  benchtests: Add log1p benchmark
  benchtests: Add log10p1f benchmark
  math: Use exp10m1f from CORE-MATH
  math: Use exp2m1f from CORE-MATH
  math: Use expm1f from CORE-MATH
  math: Use log10f from CORE-MATH
  math: Use log2p1f from CORE-MATH
  math: Use log1pf from CORE-MATH
  math: Use log10p1f from CORE-MATH
  x86_64: Add exp10m1f with FMA
  x86_64: Add exp2m1f with FMA

 SHARED-FILES                                  |   16 +
 benchtests/Makefile                           |    7 +
 benchtests/exp10m1f-inputs                    | 2389 ++++++++++++++
 benchtests/exp2m1f-inputs                     | 2388 ++++++++++++++
 benchtests/expm1f-inputs                      |  799 +++++
 benchtests/log10f-inputs                      | 1005 ++++++
 benchtests/log10p1f-inputs                    | 2888 +++++++++++++++++
 benchtests/log1pf-inputs                      | 1005 ++++++
 benchtests/log2p1f-inputs                     | 2888 +++++++++++++++++
 sysdeps/aarch64/libm-test-ulps                |   29 +-
 sysdeps/alpha/fpu/libm-test-ulps              |   12 -
 sysdeps/arc/fpu/libm-test-ulps                |   25 -
 sysdeps/arc/nofpu/libm-test-ulps              |    7 -
 sysdeps/arm/libm-test-ulps                    |   31 +-
 sysdeps/csky/fpu/libm-test-ulps               |   12 -
 sysdeps/csky/nofpu/libm-test-ulps             |   12 -
 sysdeps/hppa/fpu/libm-test-ulps               |   28 -
 sysdeps/i386/fpu/e_log10f.S                   |   66 -
 sysdeps/i386/fpu/libm-test-ulps               |   25 -
 sysdeps/i386/fpu/s_expm1f.S                   |  112 -
 sysdeps/i386/fpu/s_log1pf.S                   |   66 -
 .../i386/i686/fpu/multiarch/libm-test-ulps    |   25 -
 sysdeps/ieee754/flt-32/e_gammaf_r.c           |  178 +-
 sysdeps/ieee754/flt-32/e_log10f.c             |  196 +-
 sysdeps/ieee754/flt-32/s_exp10m1f.c           |  227 ++
 sysdeps/ieee754/flt-32/s_exp2m1f.c            |  194 ++
 sysdeps/ieee754/flt-32/s_expm1f.c             |  232 +-
 sysdeps/ieee754/flt-32/s_log10p1f.c           |  182 ++
 sysdeps/ieee754/flt-32/s_log1pf.c             |  271 +-
 sysdeps/ieee754/flt-32/s_log2p1f.c            |  248 ++
 .../math_errf.c => ieee754/flt-32/w_log1pf.c} |    0
 sysdeps/loongarch/lp64/libm-test-ulps         |   28 -
 sysdeps/m68k/coldfire/fpu/libm-test-ulps      |    6 -
 sysdeps/m68k/m680x0/fpu/libm-test-ulps        |   12 -
 sysdeps/m68k/m680x0/fpu/w_log1pf.c            |   20 +
 sysdeps/microblaze/libm-test-ulps             |    3 -
 sysdeps/mips/mips32/libm-test-ulps            |   28 -
 sysdeps/mips/mips64/libm-test-ulps            |   28 -
 sysdeps/nios2/libm-test-ulps                  |    3 -
 sysdeps/or1k/fpu/libm-test-ulps               |    4 -
 sysdeps/or1k/nofpu/libm-test-ulps             |   12 -
 sysdeps/powerpc/fpu/libm-test-ulps            |   29 +-
 sysdeps/powerpc/nofpu/libm-test-ulps          |   28 -
 sysdeps/riscv/nofpu/libm-test-ulps            |   16 -
 sysdeps/riscv/rvd/libm-test-ulps              |   28 -
 sysdeps/s390/fpu/libm-test-ulps               |   28 -
 sysdeps/sh/libm-test-ulps                     |    6 -
 sysdeps/sparc/fpu/libm-test-ulps              |   28 -
 sysdeps/x86_64/fpu/libm-test-ulps             |   29 +-
 sysdeps/x86_64/fpu/multiarch/Makefile         |    4 +
 sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c |    4 +
 sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c     |   33 +
 sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c  |    4 +
 sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c      |   33 +
 54 files changed, 14873 insertions(+), 1104 deletions(-)
 create mode 100644 benchtests/exp10m1f-inputs
 create mode 100644 benchtests/exp2m1f-inputs
 create mode 100644 benchtests/expm1f-inputs
 create mode 100644 benchtests/log10f-inputs
 create mode 100644 benchtests/log10p1f-inputs
 create mode 100644 benchtests/log1pf-inputs
 create mode 100644 benchtests/log2p1f-inputs
 delete mode 100644 sysdeps/i386/fpu/e_log10f.S
 delete mode 100644 sysdeps/i386/fpu/s_expm1f.S
 delete mode 100644 sysdeps/i386/fpu/s_log1pf.S
 create mode 100644 sysdeps/ieee754/flt-32/s_exp10m1f.c
 create mode 100644 sysdeps/ieee754/flt-32/s_exp2m1f.c
 create mode 100644 sysdeps/ieee754/flt-32/s_log10p1f.c
 create mode 100644 sysdeps/ieee754/flt-32/s_log2p1f.c
 rename sysdeps/{m68k/m680x0/fpu/math_errf.c => ieee754/flt-32/w_log1pf.c} (100%)
 create mode 100644 sysdeps/m68k/m680x0/fpu/w_log1pf.c
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c

-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 01/17] math: Add e_gammaf_r to glibc code and style
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-29  2:58   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 02/17] benchtests: Add exp10m1f benchmark Adhemerval Zanella
                   ` (16 subsequent siblings)
  17 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

Also remove the use of builtins in favor of standard names, compiler
already inline them (if supported) with current compiler options.
It also fixes and issue where __builtin_roundeven is not support on
gcc older than version 10.

Checked on x86_64-linux-gnu and i686-linux_gnu.

Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
 sysdeps/ieee754/flt-32/e_gammaf_r.c | 178 ++++++++++++++++------------
 sysdeps/m68k/m680x0/fpu/math_errf.c |   1 -
 2 files changed, 101 insertions(+), 78 deletions(-)
 delete mode 100644 sysdeps/m68k/m680x0/fpu/math_errf.c

diff --git a/sysdeps/ieee754/flt-32/e_gammaf_r.c b/sysdeps/ieee754/flt-32/e_gammaf_r.c
index 90ed3b4890..8c32d9bf5d 100644
--- a/sysdeps/ieee754/flt-32/e_gammaf_r.c
+++ b/sysdeps/ieee754/flt-32/e_gammaf_r.c
@@ -37,9 +37,7 @@ SOFTWARE.
 #include <stddef.h>
 #include <libm-alias-finite.h>
 #include <math-narrow-eval.h>
-
-typedef union {float f; uint32_t u;} b32u32_u;
-typedef union {double f; uint64_t u;} b64u64_u;
+#include "math_config.h"
 
 float
 __ieee754_gammaf_r (float x, int *signgamp)
@@ -54,97 +52,123 @@ __ieee754_gammaf_r (float x, int *signgamp)
 
   /* List of exceptional cases. Each entry contains the 32-bit encoding u of x,
      a binary32 approximation f of gamma(x), and a correction term df.  */
-  static const struct {uint32_t u; float f, df;} tb[] = {
-    {0x27de86a9u, 0x1.268266p+47f, 0x1p22f},      // x = 0x1.bd0d52p-48
-    {0x27e05475u, 0x1.242422p+47f, 0x1p22f},      // x = 0x1.c0a8eap-48
-    {0xb63befb3u, -0x1.5cb6e4p+18f, 0x1p-7f},     // x = -0x1.77df66p-19
-    {0x3c7bb570u, 0x1.021d9p+6f, 0x1p-19f},       // x = 0x1.f76aep-7
-    {0x41e886d1u, 0x1.33136ap+98f, 0x1p73f},      // x = 0x1.d10da2p+4
-    {0xc067d177u, 0x1.f6850cp-3f, 0x1p-28f},      // x = -0x1.cfa2eep+1
-    {0xbd99da31u, -0x1.befe66p+3, -0x1p-22f},     // x = -0x1.33b462p-4
-    {0xbf54c45au, -0x1.a6b4ecp+2, +0x1p-23f},     // x = -0x1.a988b4p-1
-    {0x41ee77feu, 0x1.d3631cp+101, -0x1p-76f},    // x = 0x1.dceffcp+4
-    {0x3f843a64u, 0x1.f6c638p-1, 0x1p-26f},       // x = 0x1.0874c8p+0
+  static const struct
+  {
+    uint32_t u;
+    float f, df;
+  } tb[] = {
+    { 0x27de86a9u, 0x1.268266p+47f, 0x1p22f },	 /* x = 0x1.bd0d52p-48 */
+    { 0x27e05475u, 0x1.242422p+47f, 0x1p22f },	 /* x = 0x1.c0a8eap-48 */
+    { 0xb63befb3u, -0x1.5cb6e4p+18f, 0x1p-7f },	 /* x = -0x1.77df66p-19 */
+    { 0x3c7bb570u, 0x1.021d9p+6f, 0x1p-19f },	 /* x = 0x1.f76aep-7 */
+    { 0x41e886d1u, 0x1.33136ap+98f, 0x1p73f },	 /* x = 0x1.d10da2p+4 */
+    { 0xc067d177u, 0x1.f6850cp-3f, 0x1p-28f },	 /* x = -0x1.cfa2eep+1 */
+    { 0xbd99da31u, -0x1.befe66p+3, -0x1p-22f },	 /* x = -0x1.33b462p-4 */
+    { 0xbf54c45au, -0x1.a6b4ecp+2, +0x1p-23f },	 /* x = -0x1.a988b4p-1 */
+    { 0x41ee77feu, 0x1.d3631cp+101, -0x1p-76f }, /* x = 0x1.dceffcp+4 */
+    { 0x3f843a64u, 0x1.f6c638p-1, 0x1p-26f },	 /* x = 0x1.0874c8p+0 */
   };
 
-  b32u32_u t = {.f = x};
-  uint32_t ax = t.u<<1;
-  if(__builtin_expect(ax>=(0xffu<<24), 0)){ /* x=NaN or +/-Inf */
-    if(ax==(0xffu<<24)){ /* x=+/-Inf */
-      if(t.u>>31){ /* x=-Inf */
-        return x / x; /* will raise the "Invalid operation" exception */
-      }
-      return x; /* x=+Inf */
+  uint32_t t = asuint (x);
+  uint32_t ax = t << 1;
+  if (__glibc_unlikely (ax >= (0xffu << 24)))
+    { /* x=NaN or +/-Inf */
+      if (ax == (0xffu << 24))
+	{ /* x=+/-Inf */
+	  if (t >> 31) /* x=-Inf */
+	    return __math_invalidf (x);
+	  return x; /* x=+Inf */
+	}
+      return x + x; /* x=NaN, where x+x ensures the "Invalid operation"
+		       exception is set if x is sNaN */
     }
-    return x + x; /* x=NaN, where x+x ensures the "Invalid operation"
-                     exception is set if x is sNaN */
-  }
   double z = x;
-  if(__builtin_expect(ax<0x6d000000u, 0)){ /* |x| < 0x1p-18 */
-    volatile double d = (0x1.fa658c23b1578p-1 - 0x1.d0a118f324b63p-1*z)*z - 0x1.2788cfc6fb619p-1;
-    double f = 1.0/z + d;
-    float r = f;
-    b64u64_u rt = {.f = f};
-    if(((rt.u+2)&0xfffffff) < 4){
-      for(unsigned i=0;i<sizeof(tb)/sizeof(tb[0]);i++)
-	if(t.u==tb[i].u) return tb[i].f + tb[i].df;
+  if (__glibc_unlikely (ax < 0x6d000000u))
+    { /* |x| < 0x1p-18 */
+      volatile double d = (0x1.fa658c23b1578p-1 - 0x1.d0a118f324b63p-1 * z)
+	* z - 0x1.2788cfc6fb619p-1;
+      double f = 1.0 / z + d;
+      float r = f;
+      uint64_t rt = asuint64 (f);
+      if (((rt + 2) & 0xfffffff) < 4)
+	{
+	  for (unsigned i = 0; i < sizeof (tb) / sizeof (tb[0]); i++)
+	    if (t == tb[i].u)
+	      return tb[i].f + tb[i].df;
+	}
+      return r;
+    }
+  float fx = floorf (x);
+  if (__glibc_unlikely (x >= 0x1.18522p+5f))
+    {
+      /* Overflow case. The original CORE-MATH code returns 0x1p127f *
+	 0x1p127f, but apparently some compilers replace this by +Inf.  */
+      return math_narrow_eval (x * 0x1p127f);
     }
-    return r;
-  }
-  float fx = __builtin_floorf(x);
-  if(__builtin_expect(x >= 0x1.18522p+5f, 0)){
-    /* Overflow case. The original CORE-MATH code returns 0x1p127f * 0x1p127f,
-       but apparently some compilers replace this by +Inf.  */
-    return math_narrow_eval (x * 0x1p127f);
-  }
   /* compute k only after the overflow check, otherwise the case to integer
      might overflow */
   int k = fx;
-  if(__builtin_expect(fx==x, 0)){ /* x is integer */
-    if(x == 0.0f){
-      return 1.0f/x;
+  if (__glibc_unlikely (fx == x))
+    { /* x is integer */
+      if (x == 0.0f)
+	return 1.0f / x;
+      if (x < 0.0f)
+	return __math_invalidf (0.0f);
+      double t0 = 1, x0 = 1;
+      for (int i = 1; i < k; i++, x0 += 1.0)
+	t0 *= x0;
+      return t0;
     }
-    if(x < 0.0f){
-      return 0.0f / 0.0f; /* should raise the "Invalid operation" exception */
+  if (__glibc_unlikely (x < -42.0f))
+    { /* negative non-integer */
+      /* For x < -42, x non-integer, |gamma(x)| < 2^-151.  */
+      static const float sgn[2] = { 0x1p-127f, -0x1p-127f };
+      /* Underflows always happens */
+      return math_narrow_eval (0x1p-127f * sgn[k & 1]);
     }
-    double t0 = 1, x0 = 1;
-    for(int i=1; i<k; i++, x0 += 1.0) t0 *= x0;
-    return t0;
-  }
-  if(__builtin_expect(x<-42.0f, 0)){ /* negative non-integer */
-    /* For x < -42, x non-integer, |gamma(x)| < 2^-151.  */
-    static const float sgn[2] = {0x1p-127f, -0x1p-127f};
-    /* Underflows always happens */
-    return math_narrow_eval (0x1p-127f * sgn[k&1]);
-  }
-  /* The array c[] stores a degree-15 polynomial approximation for gamma(x).  */
+  /* The array c[] stores a degree-15 polynomial approximation for gamma(x). */
   static const double c[] =
-    {0x1.c9a76be577123p+0, 0x1.8f2754ddcf90dp+0, 0x1.0d1191949419bp+0, 0x1.e1f42cf0ae4a1p-2,
-     0x1.82b358a3ab638p-3, 0x1.e1f2b30cd907bp-5, 0x1.240f6d4071bd8p-6, 0x1.1522c9f3cd012p-8,
-     0x1.1fd0051a0525bp-10, 0x1.9808a8b96c37ep-13, 0x1.b3f78e01152b5p-15, 0x1.49c85a7e1fd04p-18,
-     0x1.471ca49184475p-19, -0x1.368f0b7ed9e36p-23, 0x1.882222f9049efp-23, -0x1.a69ed2042842cp-25};
+    {
+      0x1.c9a76be577123p+0,  0x1.8f2754ddcf90dp+0,   0x1.0d1191949419bp+0,
+      0x1.e1f42cf0ae4a1p-2,  0x1.82b358a3ab638p-3,   0x1.e1f2b30cd907bp-5,
+      0x1.240f6d4071bd8p-6,  0x1.1522c9f3cd012p-8,   0x1.1fd0051a0525bp-10,
+      0x1.9808a8b96c37ep-13, 0x1.b3f78e01152b5p-15,  0x1.49c85a7e1fd04p-18,
+      0x1.471ca49184475p-19, -0x1.368f0b7ed9e36p-23, 0x1.882222f9049efp-23,
+      -0x1.a69ed2042842cp-25
+   };
 
-  double m = z - 0x1.7p+1, i = __builtin_roundeven(m), step = __builtin_copysign(1.0,i);
-  double d = m - i, d2 = d*d, d4 = d2*d2, d8 = d4*d4;
-  double f = (c[0] + d*c[1]) + d2*(c[2] + d*c[3]) + d4*((c[4] + d*c[5]) + d2*(c[6] + d*c[7]))
-    + d8*((c[8] + d*c[9]) + d2*(c[10] + d*c[11]) + d4*((c[12] + d*c[13]) + d2*(c[14] + d*c[15])));
-  int jm = __builtin_fabs(i);
+  double m = z - 0x1.7p+1;
+  double i = roundeven (m);
+  double step = copysign (1.0, i);
+  double d = m - i, d2 = d * d, d4 = d2 * d2, d8 = d4 * d4;
+  double f = (c[0] + d * c[1]) + d2 * (c[2] + d * c[3])
+	     + d4 * ((c[4] + d * c[5]) + d2 * (c[6] + d * c[7]))
+	     + d8 * ((c[8] + d * c[9]) + d2 * (c[10] + d * c[11])
+		     + d4 * ((c[12] + d * c[13]) + d2 * (c[14] + d * c[15])));
+  int jm = fabs (i);
   double w = 1;
-  if(jm){
-    z -= 0.5 + step*0.5;
-    w = z;
-    for(int j=jm-1; j; j--) {z -= step; w *= z;}
-  }
-  if(i<=-0.5) w = 1/w;
+  if (jm)
+    {
+      z -= 0.5 + step * 0.5;
+      w = z;
+      for (int j = jm - 1; j; j--)
+	{
+	  z -= step;
+	  w *= z;
+	}
+    }
+  if (i <= -0.5)
+    w = 1 / w;
   f *= w;
-  b64u64_u rt = {.f = f};
+  uint64_t rt = asuint64 (f);
   float r = f;
   /* Deal with exceptional cases.  */
-  if(__builtin_expect(((rt.u+2)&0xfffffff) < 8, 0)){
-    for(unsigned j=0;j<sizeof(tb)/sizeof(tb[0]);j++) {
-      if(t.u==tb[j].u) return tb[j].f + tb[j].df;
+  if (__glibc_unlikely (((rt + 2) & 0xfffffff) < 8))
+    {
+      for (unsigned j = 0; j < sizeof (tb) / sizeof (tb[0]); j++)
+	if (t == tb[j].u)
+	  return tb[j].f + tb[j].df;
     }
-  }
   return r;
 }
 libm_alias_finite (__ieee754_gammaf_r, __gammaf_r)
diff --git a/sysdeps/m68k/m680x0/fpu/math_errf.c b/sysdeps/m68k/m680x0/fpu/math_errf.c
deleted file mode 100644
index 1cc8931700..0000000000
--- a/sysdeps/m68k/m680x0/fpu/math_errf.c
+++ /dev/null
@@ -1 +0,0 @@
-/* Not needed.  */
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 02/17] benchtests: Add exp10m1f benchmark
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
  2024-10-25 18:21 ` [PATCH 01/17] math: Add e_gammaf_r to glibc code and style Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-29 18:16   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 03/17] benchtests: Add exp2m1f benchmark Adhemerval Zanella
                   ` (15 subsequent siblings)
  17 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

The input is based on exp10f benchmark.
---
 benchtests/Makefile        |    1 +
 benchtests/exp10m1f-inputs | 2389 ++++++++++++++++++++++++++++++++++++
 2 files changed, 2390 insertions(+)
 create mode 100644 benchtests/exp10m1f-inputs

diff --git a/benchtests/Makefile b/benchtests/Makefile
index 79d802aaf0..6d57155437 100644
--- a/benchtests/Makefile
+++ b/benchtests/Makefile
@@ -42,6 +42,7 @@ bench-math := \
   exp \
   exp10 \
   exp10f \
+  exp10m1f \
   exp2 \
   exp2f \
   expf \
diff --git a/benchtests/exp10m1f-inputs b/benchtests/exp10m1f-inputs
new file mode 100644
index 0000000000..7eb6a1e415
--- /dev/null
+++ b/benchtests/exp10m1f-inputs
@@ -0,0 +1,2389 @@
+# These values are copied from exp10f-inputt
+## args: float
+## ret: float
+## includes: math.h
+## name: workload-spec2017.wrf-adapted
+0x0p+0
+-0x1.cca64ap+0
+-0x1.570ef6p-2
+0x1.1aa2d2p+2
+0x1.0f756cp+2
+0x1.0f4c5p+2
+-0x1.4e5cbap-1
+-0x1.10efc8p+0
+-0x1.ca213p-2
+0x1.12c966p+2
+0x1.acffep+1
+-0x1.8118a2p-3
+-0x1.d5e3a2p+3
+-0x1.480aep+3
+0x1.f608d6p+1
+-0x1.32fc0cp+2
+-0x1.4b229ap-1
+0x1.d0b80ep-2
+0x1.19a5b6p+2
+0x1.a42b5ep+1
+0x1.1a21dep+2
+0x1.92e89p+1
+-0x1.7b9ac4p+0
+0x1.66ce46p+0
+0x1.5f4bbcp+1
+0x1.668d4ap-1
+-0x1.a295e4p-1
+-0x1.1bdf4cp-4
+0x1.5d9048p-3
+-0x1.97a6e8p+0
+0x1.5d5c2cp-1
+0x1.3b3926p+1
+0x1.5df8b6p-2
+-0x1.701c4ep+1
+-0x1.831428p+1
+-0x1.091166p+0
+0x1.7bb7dep+0
+-0x1.71320ap+1
+-0x1.000146p+1
+-0x1.31ed22p-4
+-0x1.4b926ap+2
+-0x1.429b84p-2
+-0x1.447decp+1
+-0x1.9c76f6p-2
+0x1.7a8d26p+1
+-0x1.abdd4cp+0
+-0x1.de3accp-2
+0x1.8a5286p+0
+0x1.fda316p-5
+-0x1.06p+5
+-0x1.4be122p-1
+0x1.9bac1ap+1
+-0x1.44cfb2p+1
+0x1.14b2d2p+2
+-0x1.322fb6p-4
+0x1.7c65bap+1
+0x1.9a5056p-1
+0x1.16f75p+2
+-0x1.14c492p+0
+-0x1.179386p+1
+-0x1.f7543ep-4
+-0x1.282e94p+1
+-0x1.32391ep-4
+-0x1.52f73ap+1
+0x1.75bdb6p+1
+-0x1.77763p-1
+0x1.a5d2d6p+0
+0x1.827938p-1
+0x1.12d21cp-1
+-0x1.11a162p-1
+-0x1.3be4d8p+1
+0x1.49d97ep+1
+0x1.19b118p+2
+0x1.19c026p+2
+0x1.e3963cp-2
+0x1.96eb86p+1
+-0x1.180652p+0
+-0x1.59b81cp+1
+0x1.d6e006p-2
+-0x1.15d164p+1
+0x1.233a6ep+0
+-0x1.27864ep+2
+-0x1.30e92cp-4
+-0x1.2e7c2p+1
+-0x1.4fe7c8p+1
+-0x1.35eadap-4
+0x1.484e6p+1
+0x1.7938eap+1
+-0x1.18e616p+2
+-0x1.36859ep-1
+0x1.f4b8dp-2
+-0x1.863916p-2
+0x1.643824p+0
+-0x1.7568e8p+0
+0x1.9c885ep+1
+-0x1.34527cp-2
+-0x1.481836p-1
+-0x1.0f8e4ap-1
+-0x1.9fbb48p+1
+-0x1.af4f5ep+0
+0x1.a88166p-2
+-0x1.9fcf5ap-1
+0x1.821a5p+1
+0x1.ab25cep+1
+-0x1.224cb8p+2
+0x1.96a544p+1
+0x1.a19cb2p-4
+-0x1.4c92f2p-3
+0x1.a0b7c8p+1
+-0x1.499ed8p+1
+-0x1.2c6602p+1
+-0x1.e6132ap-2
+-0x1.7198ccp+1
+0x1.a93194p+1
+-0x1.aadde2p+1
+0x1.d4c3b2p-3
+-0x1.c22fb6p-1
+0x1.703a62p+0
+-0x1.b82142p+0
+0x1.735e98p+1
+0x1.6b8af8p+1
+0x1.de7796p-6
+-0x1.aa786cp-1
+-0x1.6e4dap+3
+-0x1.f6e0fap-2
+-0x1.25239p-2
+-0x1.25dd98p+1
+0x1.1fab24p-2
+-0x1.308cdp-4
+-0x1.7f6a14p+1
+-0x1.fadcf8p-1
+0x1.f166e6p-4
+-0x1.b37p-3
+0x1.6735dcp-1
+0x1.864b22p+1
+0x1.893d72p+1
+-0x1.2c9ddcp+1
+0x1.9a36acp+1
+0x1.1947d2p+2
+-0x1.2a6352p+0
+-0x1.d8751ap+1
+-0x1.b64acap-4
+0x1.40f61cp+1
+0x1.70676ep+1
+-0x1.1680eap-1
+-0x1.f6604ep+0
+0x1.116176p-1
+0x1.6549cp-1
+-0x1.f7aa4ap+1
+-0x1.2bdf2ep-2
+0x1.69eed8p+1
+0x1.f2dc02p-2
+0x1.a145e6p+0
+0x1.8083d6p+1
+0x1.1b9a32p+0
+-0x1.3c9fp+1
+0x1.626386p+1
+-0x1.457912p-2
+0x1.138216p+2
+0x1.639d8cp+1
+0x1.12117cp+2
+-0x1.4970bcp-3
+-0x1.f0c518p-3
+-0x1.9c45b8p+1
+0x1.8fee74p+0
+0x1.4143acp-1
+-0x1.3c5f9ap-1
+0x1.5cf878p-2
+-0x1.122a6ep-4
+-0x1.de549ap-6
+-0x1.f3800ap+0
+0x1.721f64p+1
+0x1.902a2ep+1
+0x1.901aaep+1
+-0x1.816496p-4
+-0x1.a83cb4p+0
+0x1.271acep-2
+0x1.0d212p+2
+0x1.1cdf14p-1
+0x1.6269e2p-2
+-0x1.b93846p+1
+-0x1.6024c2p+0
+-0x1.582c58p+1
+-0x1.712d54p+1
+-0x1.479afcp+0
+-0x1.2e518p-8
+0x1.1b4d6p-2
+0x1.08ea6ap+0
+-0x1.725e56p+3
+-0x1.36a72cp-3
+0x1.376aeap-1
+0x1.2a1632p-3
+-0x1.28c472p+1
+-0x1.de1874p-1
+0x1.10e30ap+1
+0x1.e61a4p-3
+0x1.86d724p+0
+0x1.d9e3eap+1
+-0x1.797188p+0
+-0x1.75478ap-2
+-0x1.41b4ccp+1
+-0x1.30429ep-3
+0x1.6d356p+1
+-0x1.092c4ep-4
+-0x1.4f37dp+1
+-0x1.6c4f8ap+1
+-0x1.9a40eap-2
+-0x1.24069ap+4
+0x1.1a824cp+2
+-0x1.d0719ap-2
+-0x1.84f73cp+1
+0x1.1d4d62p+2
+-0x1.1dce7cp+3
+0x1.3102f4p-4
+-0x1.d5e8b8p-2
+-0x1.215e3p+4
+-0x1.e07cc8p+0
+-0x1.6ce266p-2
+0x1.d555d2p-1
+0x1.f67854p-6
+0x1.15a992p-1
+0x1.ab4f76p-2
+-0x1.2b9d0ap+1
+-0x1.a4c9fcp-2
+0x1.17645p+2
+-0x1.338ea4p+0
+-0x1.fbcf2cp-2
+-0x1.03e628p+1
+-0x1.fc0ad6p+0
+0x1.8f8294p+1
+0x1.8b8c84p-2
+0x1.d34d66p-3
+0x1.0d402cp+2
+0x1.158cep+2
+-0x1.35a2e6p-4
+-0x1.2e08acp-4
+-0x1.48242ep+1
+-0x1.29ed7ap-4
+-0x1.c7b494p+0
+-0x1.193bacp-1
+0x1.578c62p-1
+0x1.53c52p-1
+-0x1.493442p-4
+-0x1.da613cp-4
+-0x1.2f2194p-4
+-0x1.2fb2b6p-4
+0x1.d9e34p+1
+0x1.75d608p+1
+0x1.126b06p+2
+0x1.0142d4p+1
+-0x1.644758p+1
+-0x1.2e3b98p-4
+-0x1.be8ddep+1
+0x1.49824cp-3
+-0x1.35b23ap-1
+-0x1.2356b4p-1
+0x1.18b5acp+2
+0x1.47077cp+1
+-0x1.173db8p+1
+-0x1.665c4ap+1
+-0x1.1c6faap+1
+-0x1.310e3ap-4
+0x1.0e699cp+1
+-0x1.9aab7p+1
+-0x1.cc23acp-2
+0x1.5437c6p-1
+-0x1.0a05d2p+0
+0x1.085f18p-1
+-0x1.35b786p-4
+-0x1.6baad6p-3
+-0x1.3231dap-4
+-0x1.32939ep-4
+0x1.482856p-2
+-0x1.35a4a8p-4
+0x1.706bap-1
+-0x1.4acaf8p-1
+0x1.19de58p+2
+0x1.d143f2p-2
+-0x1.7a380ap-1
+-0x1.784deap+1
+0x1.4feed4p-2
+-0x1.261576p+4
+-0x1.ea0ce6p-5
+0x1.97c84ep+1
+0x1.08b326p+1
+-0x1.19f4ap+2
+-0x1.299982p-4
+-0x1.e70ce6p+2
+0x1.a64db8p-3
+-0x1.7423acp-2
+0x1.1b4bap+2
+-0x1.348e26p-4
+0x1.68ebc4p+1
+-0x1.9cfd68p-2
+-0x1.3bad8ep+1
+-0x1.c3cc6cp-1
+0x1.3bc00ap-1
+0x1.0eb82cp+2
+0x1.44cd7ap+2
+-0x1.4e79aep+0
+0x1.17402ep+2
+-0x1.b0636p-3
+0x1.0d71b4p+2
+0x1.bbe7bcp+0
+0x1.5bfe3ep+1
+-0x1.8edcf2p+0
+-0x1.36303p-4
+0x1.4e3ca8p+2
+0x1.319214p-1
+-0x1.09180ap+4
+0x1.726b38p+1
+0x1.9d1a86p-1
+-0x1.25fb1cp+2
+0x1.d9a272p-2
+0x1.8e93aep+1
+0x1.8aef1ep-2
+-0x1.9131eep+0
+-0x1.5e9edcp+0
+-0x1.dc1ef2p+0
+-0x1.661d22p-1
+-0x1.9ad2d6p-1
+0x1.2f195ap+1
+-0x1.5bba84p+1
+0x1.7cbff8p+1
+-0x1.300c18p-4
+0x1.d9e494p+1
+-0x1.36921cp-4
+0x1.195306p-1
+-0x1.81fda2p+1
+0x1.373e84p-2
+-0x1.dba4c6p-3
+0x1.e5196cp-2
+-0x1.223552p+1
+0x1.439eb6p+0
+-0x1.00184p+3
+-0x1.0c2daap+0
+0x1.52b014p+0
+0x1.6ff002p+0
+-0x1.33ea92p-4
+0x1.b682fp-4
+0x1.51e056p-3
+0x1.2da342p-3
+-0x1.2b40b8p-4
+-0x1.0ec358p+1
+-0x1.3648f2p-2
+0x1.410ccep-3
+-0x1.06b8f4p+0
+0x1.3716c8p+1
+0x1.9d24d2p+1
+-0x1.744f56p+1
+0x1.79f3ccp+1
+-0x1.faab38p+0
+-0x1.7c307p+1
+0x1.ecaf74p-4
+-0x1.46013cp-3
+0x1.304aa4p+1
+-0x1.2d2e0ap+0
+0x1.9ec978p+1
+-0x1.7ace0ap+0
+-0x1.36a862p-5
+0x1.1037bp+2
+-0x1.4ecc52p+1
+0x1.7b09bcp-2
+-0x1.725004p+1
+0x1.0eb17ep+2
+0x1.a3874ap-5
+0x1.621192p-2
+0x1.0aeaeap-1
+0x1.5c0f0ep-4
+0x1.d43cb6p-1
+0x1.33a642p+1
+-0x1.32e16p-1
+0x1.0c5826p-1
+-0x1.3d5f08p+0
+0x1.80616cp+1
+-0x1.151ff8p+2
+0x1.7734a4p-5
+0x1.c6bb7cp-1
+0x1.165c08p-2
+-0x1.25e9e2p-1
+0x1.824d56p+1
+-0x1.1db7f6p+1
+0x1.1550c4p-1
+0x1.abfabep-5
+0x1.5be644p-3
+-0x1.9736dp+1
+-0x1.337be6p-4
+0x1.1d50fp+2
+0x1.12f136p-3
+-0x1.4fd9b6p+1
+0x1.b48b8p-1
+0x1.928bcp+1
+-0x1.358bcep-4
+-0x1.4e92eap+0
+-0x1.4b13b4p+1
+0x1.ab4ee6p+1
+0x1.8176a4p+1
+-0x1.b9c5b6p+0
+-0x1.739fbep-2
+-0x1.e699p-3
+-0x1.0e7c3p-4
+0x1.07b746p+1
+0x1.6d05ccp+1
+0x1.d9e82ep+1
+0x1.0aae92p-8
+0x1.66466ap-3
+-0x1.ef3d28p+2
+0x1.c3e356p+0
+-0x1.ee3f16p-6
+0x1.c39f2ap-3
+-0x1.66a4cap-3
+-0x1.bfee84p-1
+0x1.81f6ep-4
+-0x1.7e7f5cp+1
+-0x1.31852cp-4
+0x1.6bed6cp-2
+-0x1.b628e2p-3
+0x1.bc7314p-2
+0x1.1e193ap-1
+-0x1.502deap+1
+-0x1.c5789cp-4
+-0x1.267a3ap-1
+0x1.44f054p-1
+-0x1.2fc60ap-4
+0x1.6d2b4ap+0
+-0x1.35983ap+4
+-0x1.73498p+0
+-0x1.7e7b2cp-7
+0x1.015cp-1
+-0x1.342c98p-4
+0x1.8d1564p+1
+0x1.168e4ap-3
+-0x1.42a24cp+1
+0x1.112dc6p-2
+0x1.e20982p-1
+-0x1.6ad56p+3
+0x1.b33ed2p+1
+0x1.7ae86cp+1
+0x1.dfb8dcp+0
+-0x1.0589dep+1
+0x1.24d3c8p-3
+0x1.499b44p+1
+-0x1.2ab0d4p+0
+-0x1.f305b4p-1
+-0x1.8424bap+0
+-0x1.c56a9cp+0
+0x1.8cc9f4p+1
+-0x1.43400ap+4
+-0x1.e3ca3ep-3
+0x1.4f4cf4p-4
+-0x1.af6c6ep+0
+0x1.544da4p+1
+0x1.3eb6d4p+0
+-0x1.6c4318p+1
+0x1.57004cp-1
+-0x1.01ccacp+0
+0x1.144bc6p-1
+0x1.2476ccp+1
+0x1.0deaecp+2
+-0x1.bdfe9cp-1
+-0x1.ceea0cp+1
+0x1.13232p-1
+0x1.58349cp-2
+-0x1.d430ccp-1
+0x1.91c14p+1
+0x1.436bccp+0
+0x1.0dd524p+2
+-0x1.eab124p-1
+-0x1.5307ap-2
+0x1.1cacb4p+2
+-0x1.d6441ap-2
+-0x1.32b6a8p-4
+0x1.1bd4ep+2
+-0x1.a591d2p-11
+-0x1.301e24p-4
+-0x1.329332p-2
+-0x1.1e6754p+1
+0x1.35b7a6p+0
+0x1.542d52p-5
+-0x1.48e368p+1
+0x1.58ceep-5
+0x1.82cdep+1
+0x1.58be32p-1
+-0x1.3c2a3p-2
+0x1.9409bap+1
+0x1.4b97bap+1
+0x1.17ca0ep+2
+-0x1.366acap-4
+-0x1.f3ace4p-1
+0x1.a0c9f8p+1
+-0x1.a2ea86p-2
+-0x1.cbde64p-2
+-0x1.7a887cp+1
+-0x1.2dd12ap-4
+0x1.a3c1ap+1
+-0x1.2b8f2ap+1
+-0x1.d42268p+1
+0x1.706948p-4
+-0x1.285f8p+1
+-0x1.7f58bcp+0
+-0x1.25ebeap+0
+-0x1.1946b8p-2
+-0x1.902626p+2
+-0x1.b2ce32p-2
+-0x1.124bc4p-3
+-0x1.075acap+1
+-0x1.32c68ap-4
+-0x1.a030bap-2
+0x1.308c56p+1
+0x1.933c64p-5
+0x1.17dafep+2
+-0x1.722dep+1
+-0x1.b2262ep-1
+-0x1.4ee21ep-3
+0x1.0a7eeep+1
+-0x1.87e73cp-1
+0x1.9dc436p-1
+0x1.ee2428p-3
+-0x1.117f16p-2
+0x1.daa778p-2
+-0x1.2dbecap-4
+0x1.0d7dd6p+2
+0x1.81440ap+1
+-0x1.88f954p+0
+-0x1.8abfd8p-2
+0x1.12f78ep+2
+0x1.1d307p+2
+0x1.b631eap-2
+-0x1.8469c6p-1
+-0x1.9091c2p+1
+0x1.4fcf6p-2
+-0x1.71764p+1
+0x1.709448p-1
+-0x1.c2300cp+0
+-0x1.530c38p-2
+0x1.247446p-1
+0x1.984faep+1
+0x1.571c4ep-6
+-0x1.939a94p+0
+-0x1.657dd4p+1
+-0x1.2bf2ccp-4
+0x1.7d061p-3
+0x1.e446b2p-4
+0x1.903e9ep+0
+-0x1.36822ap+0
+0x1.728a0cp+1
+-0x1.b795acp+0
+-0x1.dd215ep+0
+-0x1.5cb27ep+1
+0x1.66108p-4
+0x1.a783b4p-1
+0x1.e6a6bcp-5
+-0x1.182e36p-5
+-0x1.344ffep-4
+0x1.4174a4p+1
+0x1.8eeb4ap+1
+-0x1.1e29bep+1
+-0x1.0c7b16p+0
+-0x1.d5069ap+0
+0x1.12761ap-1
+-0x1.1082d6p-7
+-0x1.10d2c8p+0
+-0x1.502f0ep+1
+0x1.7a4a04p-6
+-0x1.2747bp+1
+-0x1.313d6cp-4
+-0x1.22d6fep+0
+-0x1.288d02p+1
+0x1.6193a8p+0
+0x1.d178acp-2
+-0x1.74beb8p+1
+-0x1.768aaep+0
+-0x1.45a396p+1
+-0x1.366bd6p+0
+0x1.51322ep-3
+0x1.0f4488p+2
+-0x1.1c98d2p-1
+0x1.b2dc9cp+1
+-0x1.4adad4p+1
+-0x1.0b063ap-1
+-0x1.1d91f8p+0
+0x1.1dff62p+2
+-0x1.e888cap+3
+0x1.0cccfp+1
+-0x1.352b56p-4
+-0x1.28e938p-5
+0x1.9a6954p-2
+-0x1.4164fcp-1
+0x1.9d36e8p+1
+-0x1.3067aap-4
+-0x1.f60dfap-1
+0x1.c7d7acp+0
+-0x1.358ea8p-4
+0x1.c3579cp+0
+0x1.d9e3d6p+1
+-0x1.3a0566p+0
+-0x1.b89bacp-1
+0x1.d58a28p-1
+-0x1.7601aep+1
+-0x1.4ec9f8p-10
+-0x1.6d5776p+0
+0x1.b2bfd8p-3
+0x1.88677p-1
+0x1.2db776p+1
+-0x1.a7cb9cp+0
+-0x1.31ba78p-4
+-0x1.ebd996p+1
+-0x1.410194p+0
+-0x1.2ddc58p-4
+0x1.d943a6p+0
+0x1.14a0d2p-5
+0x1.0dd346p+2
+0x1.f1b254p-2
+-0x1.3cc36ep+1
+0x1.5d021ep-2
+-0x1.0c30f4p+0
+-0x1.2beac4p+1
+0x1.9e81ap+1
+0x1.af36ap+1
+0x1.922238p+1
+-0x1.80886p-3
+-0x1.c29136p-2
+0x1.3d44b6p-3
+-0x1.edd8eap+0
+-0x1.a847acp+0
+0x1.0f79f6p+2
+0x1.53f778p+0
+-0x1.309952p-4
+-0x1.35d438p-4
+-0x1.c10eeep-3
+-0x1.806394p+0
+0x1.ff7b88p+0
+0x1.69316ep+1
+-0x1.6d0674p+0
+0x1.472c1ep+0
+0x1.0e8cbp+2
+-0x1.5ef1a4p+0
+-0x1.bab7dcp-1
+-0x1.36adb6p-4
+0x1.6dca62p+2
+-0x1.1c474ep+2
+-0x1.868c8ep-2
+-0x1.4ced6ap+2
+0x1.159d72p+2
+0x1.3c9656p+1
+0x1.4fae6p-2
+-0x1.4f8a48p+1
+0x1.bba5eap-3
+0x1.a5b6b8p+1
+-0x1.2a69f2p+2
+0x1.d2f84p-4
+-0x1.33012cp-1
+-0x1.b514e2p-1
+0x1.b23606p+1
+0x1.18a2ap+2
+-0x1.d75522p-1
+-0x1.a5bb52p-6
+0x1.9547f8p+1
+0x1.8c7182p+1
+0x1.1ac8bap+2
+-0x1.2864p-4
+-0x1.c6baa8p-2
+0x1.19c122p+1
+0x1.65acd6p-5
+0x1.c76bd8p-2
+0x1.194a94p+2
+0x1.288ad8p+1
+0x1.b2ebfp+0
+-0x1.1b7bdp+0
+-0x1.32e204p-4
+-0x1.7bc0dep-4
+0x1.68c198p-1
+0x1.1a8ef8p+2
+-0x1.b8ed5p+0
+-0x1.3109d4p-4
+0x1.3cfa08p-1
+0x1.2aebdep+1
+0x1.7cf2b2p+0
+0x1.40ea82p+2
+-0x1.6d1d98p-2
+-0x1.5fbf82p-1
+-0x1.83ed44p+1
+0x1.2e3f04p-1
+0x1.d9e37cp+1
+-0x1.432864p+1
+-0x1.cda79ep-1
+0x1.0da60ap+2
+0x1.840bf6p+1
+-0x1.3496e2p+1
+0x1.82c98p+1
+0x1.50037ep-2
+-0x1.4f6732p+1
+0x1.f7da28p-4
+-0x1.a228a8p-2
+-0x1.0cd8p-2
+0x1.a1db86p-3
+-0x1.594874p-1
+0x1.20835cp+0
+0x1.0f6acp+1
+0x1.59515ep-2
+0x1.8bea1p+1
+0x0p+0
+0x1.0fcd7p+2
+-0x1.086928p+1
+-0x1.2c535cp-4
+0x1.3d6cccp-1
+-0x1.92a8ecp+1
+-0x1.2fb916p-4
+0x1.747f3cp+1
+-0x1.a4386ep+0
+-0x1.d30c56p-2
+0x1.0fde5ep+1
+-0x1.36136ap+1
+-0x1.501534p+1
+-0x1.14c224p+2
+-0x1.d05bb6p-1
+0x1.be78dap-7
+-0x1.0451c2p-3
+0x1.bcd7d4p-2
+-0x1.4912bp-2
+0x1.a572dcp+1
+-0x1.35b01p-4
+0x1.a817fep+1
+-0x1.347608p-1
+-0x1.ceacd6p+1
+0x1.dc80d2p-4
+0x1.815a7ap+1
+0x1.1a75e6p+2
+0x1.ed45ccp-2
+0x1.3d0098p+0
+-0x1.c25928p+0
+0x1.189d3ap+2
+-0x1.4537dep-4
+0x1.4fb96ep+1
+0x1.14734ep+2
+-0x1.4d5efcp-3
+-0x1.18b74cp-2
+-0x1.5d6d18p+0
+-0x1.3590a8p+1
+-0x1.557742p-1
+-0x1.04313cp-1
+0x1.23ec9p-6
+0x1.246ef4p+0
+0x1.a35876p+1
+0x1.8770aap-2
+-0x1.32ca5p-4
+-0x1.4a9294p+0
+-0x1.79031ep-1
+0x1.40b186p-3
+0x1.b3b1a8p-3
+0x1.ca4534p+0
+-0x1.1b979cp-3
+-0x1.c0221ep-4
+0x1.278df4p-3
+-0x1.90e686p-2
+0x1.1983f2p+2
+-0x1.707a4p+1
+0x1.3a91a8p-1
+-0x1.0ae4ep-2
+0x1.93d88ep+1
+-0x1.36804ep-4
+-0x1.1664eep+1
+-0x1.bf6116p-1
+0x1.bb1f2ap-5
+0x1.5d6f24p-1
+-0x1.2f3ap-3
+0x1.8bea1cp+1
+0x1.933a2p+1
+0x1.d04b8cp-2
+-0x1.a2d34ap+0
+-0x1.807b86p-2
+0x1.44a46ep+1
+0x1.08b1p-1
+-0x1.5ac2fap+1
+0x1.93af92p+1
+-0x1.360d0cp-4
+-0x1.a9d00ep+0
+-0x1.c5730cp+0
+0x1.388076p-3
+0x1.ec991ap+0
+-0x1.eba70cp+1
+0x1.1a5e26p+2
+0x1.456762p-2
+-0x1.f6b70ep+2
+-0x1.4c4d6ap-5
+-0x1.773adap+1
+0x1.b08eacp-8
+-0x1.584bd8p+4
+0x1.aece5ep+1
+0x1.9484eep+1
+0x1.2f03cap-1
+0x1.857dc8p-2
+-0x1.7a09c2p-3
+0x1.413dcap-1
+-0x1.35e0a4p-4
+-0x1.14c224p+2
+-0x1.4b6036p+1
+0x1.72638ep+1
+-0x1.aca576p-5
+-0x1.a8005ap+1
+-0x1.7596e2p+1
+-0x1.48f8c6p+1
+0x1.17df42p+2
+-0x1.86feeep-3
+0x1.32ae9cp+0
+-0x1.3294e8p-4
+-0x1.cd56fap-2
+0x1.ed6752p-2
+0x1.52ca7ap-3
+0x1.88bd5ep+2
+-0x1.0bc4c4p-6
+-0x1.9c9c7ep+2
+-0x1.3dba0ap+1
+-0x1.22c518p-3
+0x1.1ae9bcp+2
+0x1.15e838p-2
+-0x1.828332p+1
+-0x1.54c63p+1
+-0x1.6a32f6p-1
+0x1.c55e1cp-3
+-0x1.08a5fp-3
+0x1.165574p+2
+-0x1.480b04p+1
+0x1.f8983p-3
+0x1.0d3bdap+2
+-0x1.0d26d8p+1
+-0x1.32a25p-4
+-0x1.354c2ep-4
+-0x1.36b518p-4
+0x1.d956p-2
+0x1.56d7bap+1
+0x1.0eea1ap+2
+0x1.18f428p+2
+0x1.62ad3p+1
+0x1.a35124p+1
+0x1.2745c2p-2
+-0x1.d21364p-1
+-0x1.27e588p+1
+0x1.519fc8p+2
+0x1.6f9af6p-1
+0x1.60654ap+1
+-0x1.acc2fp+0
+0x1.68b8a8p+1
+0x1.bc0924p-2
+0x1.19a1dep+2
+0x1.46286ap-2
+-0x1.611fcap+0
+0x1.3704ecp+1
+0x1.498faap+1
+-0x1.2ded8cp-4
+0x1.5329a6p-2
+0x1.1aa978p+2
+-0x1.7a949ap-2
+0x1.6638f6p+0
+0x1.60e3dcp-1
+-0x1.4eac8ep+1
+-0x1.3db95cp+1
+0x1.da4e46p-4
+-0x1.f3703p-1
+-0x1.a625fap+0
+0x1.3c17a4p+0
+0x1.f75f9p-3
+-0x1.9369bp+1
+-0x1.03c062p-2
+-0x1.ac914ep+0
+0x1.27711cp-5
+0x1.193a5ep+0
+0x1.0aeda2p-1
+-0x1.284b2cp-4
+-0x1.47ca52p+1
+-0x1.d8dcd4p+0
+0x1.340c62p-5
+0x1.966712p+1
+-0x1.8a04dap+0
+-0x1.06p+5
+0x1.693188p-1
+-0x1.33051ap+1
+0x1.4adfaep-4
+0x1.8699fep-2
+-0x1.c528a2p+3
+-0x1.87449ep-1
+-0x1.376054p+1
+-0x1.3faeb2p+1
+0x1.bf3f86p-2
+-0x1.a29252p-2
+0x1.a5e514p+1
+0x1.47e23p+1
+-0x1.04187p-1
+-0x1.dfdd0ap+1
+0x1.18fad4p+2
+0x1.5f067cp-5
+-0x1.c72628p-1
+-0x1.a7323cp+1
+0x1.0dcc54p+2
+-0x1.3ed8b4p+1
+0x1.f9b94ap+0
+-0x1.b551cp-1
+-0x1.397f1ep-1
+-0x1.51b1e2p+3
+-0x1.a692f2p-3
+0x1.69fdacp+1
+-0x1.4e1826p-1
+0x1.91c0fep-3
+-0x1.a6e1b2p+0
+0x1.8189fp-6
+0x1.d6b1bp+0
+-0x1.3138f6p-2
+-0x1.63dcc6p+1
+0x1.1e25a8p+2
+-0x1.615f82p+1
+-0x1.06116ep-6
+-0x1.2dbf32p-4
+0x1.30efb2p+1
+0x1.90d4fep+1
+-0x1.2e8768p+1
+0x1.52c482p-1
+0x1.139014p+2
+0x1.f188e6p+0
+0x1.489bap-3
+-0x1.30b51p-1
+0x1.26bebcp+1
+-0x1.473cfap-2
+0x1.189b68p+2
+-0x1.fff626p-4
+-0x1.4f04f6p+1
+-0x1.47b56cp-1
+-0x1.2b0338p-4
+0x1.5f00a4p-1
+-0x1.2453d8p+1
+0x1.63f072p-3
+-0x1.5f2a8ap-4
+0x1.0de616p+2
+0x1.04227p-1
+-0x1.11fb4ap+1
+0x1.e7937ep-4
+-0x1.b1bb1p-1
+-0x1.59229ap-3
+0x1.e54bb8p-3
+-0x1.49ced2p+1
+-0x1.3c8558p-1
+-0x1.365d0ap-4
+-0x1.d95314p-4
+-0x1.faa6a2p-1
+-0x1.4a931ep+1
+-0x1.35baf2p-4
+0x1.40e5c4p+0
+-0x1.d9ae8p+1
+0x1.1121fap-1
+0x1.3e6be4p-2
+0x1.7e0ef2p-3
+-0x1.880112p+0
+-0x1.652642p+1
+0x1.3612bep+0
+-0x1.cae1d2p-2
+-0x1.5c0edp+0
+-0x1.c4600ep-2
+0x1.c07a82p-4
+0x1.09a756p+1
+-0x1.e84cfap+0
+-0x1.c91046p+3
+0x1.2ad4eap+1
+-0x1.d5d568p-1
+0x1.3d84aap-1
+0x1.77039ep+1
+-0x1.d2310cp+0
+-0x1.cfd498p+0
+-0x1.715682p+1
+-0x1.0f89b2p-5
+-0x1.67af76p-1
+0x1.020d18p+1
+0x1.1a5e44p-1
+-0x1.2b8602p-4
+-0x1.59004ep-2
+0x1.66a0b4p+2
+0x1.44cf1p-2
+0x1.731836p-1
+-0x1.444264p+2
+0x1.7ab92p+0
+0x1.747564p-1
+-0x1.35aa9ep-4
+0x1.7c9424p+1
+0x1.cee034p+1
+-0x1.5b10fp-1
+-0x1.364912p-4
+-0x1.69bbfcp+1
+-0x1.50a1cp+1
+-0x1.f3f57p-3
+0x1.158cf8p+2
+-0x1.a72588p+1
+0x1.26afa8p-4
+-0x1.f7580ap-3
+0x1.1c73b8p-1
+-0x1.f2e3ecp-3
+0x1.363ffap-1
+0x1.1955bp+2
+-0x1.85807ap-1
+0x1.7a0e24p-1
+-0x1.2d6f04p-3
+-0x1.076d68p+1
+-0x1.0cd796p+1
+-0x1.955e58p+1
+-0x1.e74dfp+0
+0x1.94e14p+1
+-0x1.0d0d0cp+0
+-0x1.57b626p+2
+-0x1.ef69a6p+1
+-0x1.31c994p-4
+-0x1.ee21eep+1
+-0x1.357044p+1
+0x1.687e62p+1
+0x1.58074cp+1
+0x1.0d13b8p+2
+0x1.4e4534p+1
+-0x1.2b7b6ep-3
+0x1.1b4bb4p-3
+-0x1.00f538p-1
+0x1.0f0c76p+2
+0x1.5213a6p+1
+-0x1.29df0ep+0
+-0x1.ae06f2p-2
+-0x1.5221c8p+1
+0x1.e1d62ep+2
+-0x1.272b88p-4
+-0x1.6649b8p+1
+0x1.98b39cp+1
+-0x1.27c198p-4
+-0x1.434cfep-3
+0x1.3cbb2p-2
+-0x1.3c9292p-2
+0x1.0efaf4p+2
+-0x1.633b78p+0
+0x1.ec1532p-2
+-0x1.0a31f4p-2
+0x1.d473a6p-4
+0x1.6636a4p+1
+-0x1.8901dp+1
+0x1.6c011cp-5
+0x1.4159ccp-2
+-0x1.f98358p-1
+0x1.0e5a1p+2
+0x1.7c455p+0
+-0x1.2d9d62p-4
+-0x1.29249cp-4
+-0x1.07ef22p+3
+-0x1.2bf514p+1
+-0x1.45d45cp+0
+-0x1.2cabd8p-4
+0x1.f64b9ep+0
+0x1.960a98p+1
+0x1.45767cp-4
+0x1.bd19cep-2
+-0x1.0d64aep+1
+0x1.1a629ep+2
+-0x1.c7da8ap-1
+0x1.f676d2p-2
+-0x1.3ed448p+1
+-0x1.abed62p-7
+0x1.7f6afp+1
+-0x1.350bfp-4
+0x1.0da06ap+0
+0x1.097cc6p-1
+-0x1.8b5294p-6
+-0x1.3ea218p-7
+0x1.fc6b92p-5
+-0x1.1c957ep-2
+0x1.5fd2ecp+1
+-0x1.2acb2ap-4
+0x1.8d9becp-1
+0x1.99c11ap+1
+-0x1.012c68p-1
+-0x1.3294aap-4
+-0x1.340894p-4
+0x1.9a0ee2p-2
+0x1.4584d6p-4
+-0x1.2ddb48p+1
+-0x1.98374cp+1
+0x1.3383eap+1
+0x1.7d2846p+1
+-0x1.1f83bep-1
+-0x1.69b974p-2
+-0x1.0062e4p-2
+-0x1.e0c96ap-3
+-0x1.9b2cdcp-2
+0x1.b10d8ap-2
+0x1.462c08p+0
+0x1.801c0ep-4
+-0x1.91fe4ep+1
+-0x1.def94ep-7
+0x1.97541p+1
+0x1.7a346ap+1
+0x1.23d8e2p-2
+-0x1.c5295ep-1
+-0x1.308504p+1
+-0x1.7f607ap-7
+-0x1.92dcbp+0
+0x1.361d6p-1
+-0x1.279b06p+2
+-0x1.dadd1p-2
+-0x1.63de3ep+1
+-0x1.a9d38ep-3
+-0x1.330efcp-3
+0x1.5cd4cep+1
+-0x1.2d6346p-4
+0x1.aa19fcp-3
+-0x1.be1354p-1
+-0x1.1f2d94p+1
+0x1.541a54p-4
+0x1.e7e51ap-6
+0x1.327a8ap+0
+0x1.a8d34ep-2
+0x1.47e02p-1
+0x1.f0499ep-2
+-0x1.6338f4p-2
+0x1.758f7p+1
+-0x1.8dd02ep-5
+0x1.1335e4p-1
+-0x1.29400ap-4
+0x1.19e52ap+2
+0x1.7c685cp+1
+-0x1.010042p+1
+0x1.183edep+2
+-0x1.647b8cp+1
+0x1.0df434p+2
+0x1.a9173cp+0
+0x1.605c96p+1
+-0x1.375146p-1
+-0x1.96f0e4p-1
+0x1.99d6f6p+0
+0x1.475f9cp+0
+0x1.6ce1e6p-3
+-0x1.0c4ec2p-2
+0x1.979a3ep+1
+0x1.4c02b2p-3
+-0x1.5d643cp+1
+0x1.1981b4p+2
+-0x1.450f54p+2
+-0x1.daf71cp+1
+0x1.5b84f2p+1
+-0x1.4e39p-3
+0x1.2e338cp-1
+-0x1.4ac494p-1
+0x1.1a2ee4p+2
+-0x1.00c2dap+1
+-0x1.05797cp-2
+0x1.810c4cp+0
+0x1.8371f6p-2
+-0x1.2e5d5ep-4
+0x1.20568cp+1
+0x1.7533fap+1
+-0x1.2eff36p-1
+-0x1.095fc4p+1
+0x1.14268ap-5
+-0x1.a4098cp-2
+-0x1.a826c6p+1
+-0x1.2d9248p+1
+0x1.0d08ccp+2
+-0x1.caa236p+3
+0x1.bab198p-3
+-0x1.e2136ap-3
+-0x1.24ef2cp+2
+0x1.e120f8p-1
+-0x1.6f5d06p-2
+-0x1.351596p-4
+-0x1.f8c01ap+0
+0x1.24cb0cp-2
+-0x1.8772c8p+1
+-0x1.3139e4p+1
+-0x1.552332p+1
+0x1.1f01ep-1
+0x1.93975p+1
+-0x1.860b12p+0
+-0x1.325f32p+4
+-0x1.157d7cp+2
+0x1.b04adp+0
+-0x1.162d22p+1
+0x1.66397ap-3
+0x1.229e52p-5
+0x1.ef5bbcp+0
+-0x1.0ede58p+1
+0x1.4c9bf8p+2
+0x1.89aa3p+1
+0x1.5c7128p+1
+0x1.6658cp+1
+0x1.839efp-3
+-0x1.2ac61ap-5
+0x1.18cf9cp+2
+0x1.057f2cp-2
+-0x1.80098ep+0
+0x1.117f5p+2
+-0x1.602f22p+1
+-0x1.8aa62p+0
+0x1.fab3e8p-1
+-0x1.faf368p+0
+-0x1.803ab2p-1
+-0x1.93715ap-4
+0x1.24106ap-3
+0x1.301864p-1
+0x1.608766p+1
+0x1.55c9aap+1
+-0x1.297edap-1
+0x1.65432ap+1
+0x1.c27718p+2
+-0x1.3ae348p-1
+0x1.aa80a8p+1
+-0x1.3b9fa2p-1
+0x1.414f82p-2
+0x1.bdd05p+0
+0x1.6ed8ep-1
+0x1.b0fc5p+1
+-0x1.38dd7cp-1
+-0x1.3dd132p-1
+-0x1.b000dap+1
+-0x1.fa8046p+0
+0x1.ada91ep+1
+-0x1.bbacc8p-1
+-0x1.f9f426p+2
+-0x1.bc74fcp-1
+-0x1.5b356ap-2
+-0x1.ff6d66p-3
+0x1.d9dec2p+1
+-0x1.4d683p-3
+-0x1.c94956p+1
+-0x1.34e83cp+0
+0x1.4eab1cp-3
+0x1.36cf66p-2
+-0x1.35e6ecp-4
+0x1.9b228ap+1
+-0x1.3296aap-4
+-0x1.361d6p-4
+0x1.1cfa22p+2
+0x1.a1a75cp+1
+-0x1.3f464ep+0
+-0x1.ed46cep-2
+0x1.b2adeap-2
+0x1.8bb406p+1
+-0x1.25e534p-2
+-0x1.343002p-4
+-0x1.aac09ep-3
+-0x1.cdbeaep-2
+0x1.14729p+2
+0x1.0821ecp-2
+-0x1.108176p+1
+-0x1.8c30c6p+1
+-0x1.084082p+3
+0x1.5ad252p+1
+0x1.c292c2p-4
+-0x1.31a53ap-4
+0x1.c3afp-7
+0x1.967b8cp+1
+0x1.185164p-2
+-0x1.9137acp-1
+-0x1.43fc64p+1
+0x1.4b91c2p-1
+-0x1.b317f6p+1
+0x1.4a4e98p-7
+0x1.449a4ap-3
+0x1.5949e4p+1
+0x1.2e1846p-1
+-0x1.a2118p-1
+-0x1.24f4d8p-3
+0x1.85ec84p+1
+-0x1.6b47dep+1
+-0x1.bea2f6p-2
+-0x1.9f1a1ep+3
+-0x1.9bb644p-1
+-0x1.773ffep-5
+0x1.192ad2p+2
+0x1.534a58p+0
+-0x1.b68d7cp-1
+-0x1.2836d6p+0
+-0x1.de7844p+0
+-0x1.c2bbf6p+1
+0x1.b46346p-4
+0x1.e65288p-2
+0x1.7355b6p-2
+-0x1.26aeb4p+3
+-0x1.351a9cp-4
+-0x1.ef0e14p-2
+0x1.2a4abap-1
+-0x1.19c2cap+1
+-0x1.36a336p-4
+0x1.784352p-3
+0x1.96f24p+1
+-0x1.c19ae8p-1
+-0x1.3297f8p-4
+-0x1.e48354p-3
+0x1.7b33dep-1
+-0x1.6d82dcp+1
+0x1.e95628p-1
+0x1.4c4672p+1
+-0x1.02603p+0
+-0x1.2111p+0
+0x1.e3b636p-2
+-0x1.35a41ep+0
+0x1.f0b27p-1
+-0x1.229a2p-4
+0x1.544d02p-1
+-0x1.14c224p+2
+0x1.55c23p-1
+0x1.3c8eeep-1
+-0x1.2db0bep-4
+-0x1.08b4d6p+0
+-0x1.34e21ep-4
+-0x1.209ab8p+1
+-0x1.3e751p+0
+0x1.5a36f6p+1
+-0x1.4e6874p+1
+0x1.ef9c56p+2
+-0x1.abd05ep-2
+-0x1.240f5cp+1
+0x1.a5b1dap+1
+-0x1.2fe2ep-2
+0x1.190e9cp+2
+-0x1.1f19cep+1
+-0x1.5e8984p+1
+-0x1.13e68cp-5
+-0x1.2b7158p+1
+-0x1.14ca8p+2
+-0x1.72a042p+1
+-0x1.4a5f58p-2
+0x1.8487aep+1
+0x1.d9e78p+1
+0x1.b782ecp-2
+-0x1.8e3d8cp-5
+0x1.55972ap+1
+0x1.1993a6p+2
+0x1.0e317p+2
+-0x1.60a1e2p-2
+0x1.947566p+1
+0x1.455f28p-1
+0x1.2270bep-2
+-0x1.2a9576p+0
+-0x1.995a66p-1
+-0x1.14c224p+2
+-0x1.51fbcap+1
+0x1.fc0e86p+0
+0x1.15172p+0
+-0x1.34c418p-3
+0x1.176bc2p+2
+-0x1.c54b18p-5
+-0x1.548d3p+1
+-0x1.7983cap+1
+0x1.27f4bap+2
+-0x1.69b152p-1
+-0x1.299848p-1
+0x1.0324cap+3
+-0x1.32a1d6p-4
+-0x1.4fd9cp+0
+0x1.6cf24p+1
+-0x1.57b3fcp-1
+-0x1.33e9a6p-4
+0x1.781074p-10
+-0x1.1ba9bcp+0
+0x1.1a5178p+2
+-0x1.535882p+1
+0x1.9bef5cp+1
+-0x1.adc8a6p-2
+-0x1.c3536p-1
+-0x1.f85feep+2
+-0x1.2544bp+1
+0x1.fc9ef4p-2
+0x1.49aa9p+1
+-0x1.e5f78ap-4
+0x1.73cdc8p-4
+-0x1.501f9ap+1
+-0x1.3050c6p-2
+-0x1.4ddd24p+1
+-0x1.31c498p-4
+-0x1.54e8b2p-4
+-0x1.32eb68p-4
+-0x1.49c4c2p+3
+0x1.b437eap-5
+-0x1.a149a4p+1
+-0x1.31867p-4
+0x1.729434p+1
+-0x1.4ecf7cp+1
+0x1.2f09p-1
+0x1.792de6p-2
+-0x1.760a02p-1
+-0x1.00044ap+1
+-0x1.2ca72ap+1
+-0x1.28bb78p-4
+0x1.0c6ef6p+2
+-0x1.6541ep+0
+0x1.a17bbp+1
+-0x1.43fa36p+1
+-0x1.f01772p-1
+-0x1.2fb4fep-2
+-0x1.090966p+0
+-0x1.3429bp-4
+-0x1.8663d2p-2
+-0x1.687992p-2
+-0x1.201236p+1
+0x1.8eea1p+1
+-0x1.4ca762p-2
+0x1.1accb4p+2
+-0x1.2e1a5ap-4
+0x1.885802p-4
+-0x1.8f22eep-4
+-0x1.013a28p-2
+-0x1.6c4176p+1
+-0x1.5467dap+1
+-0x1.3965aep-2
+-0x1.7af334p+1
+-0x1.20fc2ep+1
+-0x1.c65aacp-4
+-0x1.31be86p-4
+0x1.9a0464p-3
+0x1.808ff4p-1
+0x1.83ebcep+1
+0x1.bf2bap-4
+-0x1.6ea6eep+1
+0x1.3c0614p+1
+-0x1.67be1p-3
+-0x1.5e68cep+1
+-0x1.0fe648p-1
+-0x1.8d5ae2p-1
+0x1.239e2ep-3
+-0x1.3204eep-4
+0x1.be1176p-4
+-0x1.36bd38p-4
+0x1.6f607cp+1
+0x1.d7ce82p-3
+-0x1.6eeff6p+0
+0x1.0d7c94p+2
+0x1.f4c93cp+0
+0x1.9c2fccp-2
+-0x1.1a65cap+1
+-0x1.89d558p+1
+0x1.89e702p-1
+-0x1.dc78b6p-3
+-0x1.114834p-7
+0x1.8a616ep+0
+-0x1.359ecep-4
+-0x1.3bf01p+1
+-0x1.4c0a78p+0
+-0x1.b84bfp-4
+0x1.7f4842p-5
+0x1.1eeabcp-1
+0x1.720f42p-2
+-0x1.497d2ep+1
+-0x1.2c5a1ep+1
+0x1.1cd364p+2
+-0x1.32f838p-4
+0x1.11ebbp-1
+0x1.08e6dep-1
+-0x1.4bbf28p-3
+0x1.765a02p+0
+0x1.a5db9p+1
+-0x1.635d1cp+0
+-0x1.16d85cp+0
+0x1.48e082p+0
+0x1.31a8d4p+1
+-0x1.ca1c54p-2
+0x1.58fc9cp-2
+-0x1.2fd26ep-4
+0x1.22db18p-6
+-0x1.2ced4ep-5
+-0x1.2842a8p-4
+0x1.181b6ap+2
+0x1.97c4dep+1
+-0x1.7161a8p-1
+0x1.012b68p-1
+-0x1.cfb272p+0
+0x1.18976ap+2
+0x1.3fde66p-1
+-0x1.330cap-4
+0x1.62cb5p+1
+-0x1.2eb88cp-4
+-0x1.6a2b6ep+1
+-0x1.35072ep-4
+0x1.2ecd0ep+1
+0x1.93a21ep-1
+0x1.9e53bp+1
+0x1.087e3cp-5
+0x1.af8516p-2
+0x1.0e74ap+2
+-0x1.ec4bc8p+2
+-0x1.8a5d82p+1
+0x1.5ea982p-1
+-0x1.3541cp-4
+-0x1.74371p-1
+-0x1.e06d5cp+0
+-0x1.3280bcp-4
+-0x1.32f774p-4
+-0x1.70ac58p+1
+-0x1.2f25aep+2
+-0x1.0dc2d8p-2
+0x1.ac224ep-4
+-0x1.bfcde4p-2
+0x1.83ce48p+1
+-0x1.0d8bb4p-4
+0x1.4ba414p-2
+0x1.5fbf6p-1
+0x1.a05ff8p+1
+-0x1.01cd14p-1
+-0x1.365478p-4
+-0x1.8f732ap-5
+-0x1.fb09ecp-1
+-0x1.043ec6p+1
+0x1.01f7cep-1
+-0x1.30f7dep-4
+-0x1.76a19p-3
+-0x1.feec72p+0
+-0x1.5eeaeep-1
+-0x1.723032p-2
+-0x1.e591b6p-2
+-0x1.6a82acp+0
+0x1.520614p+1
+-0x1.efe32p-3
+0x1.13cecap+2
+0x1.a002aep+1
+0x1.122dbep-1
+-0x1.3182d6p-1
+0x1.2904c2p-3
+-0x1.940cd6p+0
+-0x1.2bc316p-4
+-0x1.af4b52p-2
+-0x1.97f2a2p+1
+0x1.99bbe4p+1
+0x1.17c292p+2
+-0x1.268ae2p+2
+-0x1.46e27ap+1
+0x1.8e6e42p+1
+0x1.1d204ap+2
+0x1.ba4234p-6
+-0x1.354224p-4
+0x1.1a24ap-1
+-0x1.205ce8p-2
+0x1.1dc96ap+2
+-0x1.43b982p+2
+0x1.4cedfep+0
+0x1.28bdf8p+0
+0x1.07dcc6p-1
+-0x1.4e5178p-1
+-0x1.069086p+3
+-0x1.561432p+0
+0x1.4d9a08p-1
+-0x1.3628c8p-4
+-0x1.4fdecep+1
+0x1.b049bep-2
+0x1.01e4a6p+0
+-0x1.a1647ep-1
+0x1.d9e2p+1
+-0x1.35f696p-4
+0x1.92dbaap+1
+-0x1.360078p+1
+0x1.bfc58ep-3
+-0x1.d32e94p+0
+0x1.37975p-3
+-0x1.1ca94ap+4
+0x1.902da4p+1
+0x1.95e31cp+1
+0x1.2aee2ap-1
+-0x1.65d58ap+1
+-0x1.00451cp+1
+0x1.19be14p+2
+-0x1.87759ep+1
+0x1.42e32p-2
+-0x1.2f5a58p-4
+-0x1.27fb92p+2
+0x1.78136cp+1
+0x1.27ad7p+1
+0x1.0d92bep-2
+0x1.4eca7p+0
+-0x1.35f8c8p-4
+0x1.573b4cp-3
+0x1.a78904p+1
+-0x1.477fcp+1
+-0x1.d5d7fap+3
+-0x1.492ee2p+1
+0x1.813bf6p+1
+-0x1.785124p+0
+-0x1.539ccep+1
+0x1.c7229ep+2
+-0x1.52da9ap-1
+0x1.3eaceep-1
+-0x1.efcbf2p-3
+0x1.00ef8ep-4
+0x1.f4ba56p-1
+-0x1.5ef02ap+0
+-0x1.345798p-4
+-0x1.fe005ap+2
+0x1.a79bf6p+1
+-0x1.4c5ebep-4
+-0x1.14c224p+2
+-0x1.0182a6p+1
+-0x1.72f084p+1
+0x1.9714b8p+1
+0x1.63ea48p-4
+0x1.006dfp-1
+0x1.d9e87p+1
+0x1.584fecp-2
+0x1.479bp-2
+0x1.83c21cp+1
+-0x1.bd177cp+0
+0x1.ae7256p-4
+-0x1.31ad44p-1
+-0x1.154218p+1
+0x1.55e3f6p-1
+-0x1.0a097cp+1
+0x1.a4aa2cp+1
+-0x1.2c0b1ep-4
+0x1.03afbp-1
+-0x1.4457b4p+0
+0x1.768e52p-5
+0x1.4e0458p-1
+-0x1.591124p+1
+0x1.1b53d2p+2
+0x1.117152p-1
+0x1.ac1a62p+1
+0x1.036db4p-4
+-0x1.99fccp-3
+0x1.aefd9cp+1
+0x1.67622p+1
+-0x1.7b603ap-7
+-0x1.369f8cp-4
+-0x1.47ef54p+0
+0x1.8ccf44p+1
+-0x1.1c9e86p-7
+-0x1.f1b734p+0
+-0x1.2f5b3ap-4
+0x1.df5724p+0
+-0x1.32bc2cp-4
+-0x1.b1437p+0
+-0x1.273b8p-4
+-0x1.dc6104p-1
+-0x1.5944d6p+1
+-0x1.2b1dccp+1
+-0x1.5cad7cp+0
+0x1.71a4fp-2
+-0x1.5e61e8p-2
+0x1.17f392p+2
+0x1.301478p-2
+-0x1.32d82ap-4
+-0x1.6e3d4ep+1
+0x1.15097ep+2
+-0x1.d498a2p-6
+0x1.c33044p-4
+-0x1.5c56e8p+2
+-0x1.07d544p-1
+-0x1.2c81fcp-4
+0x1.4add72p+0
+0x1.eda0dap-2
+-0x1.9f8208p+1
+0x1.44f78p-1
+-0x1.632352p+0
+-0x1.f30448p-1
+0x1.756074p+1
+0x1.46dc4p-2
+-0x1.30e0cp+1
+0x1.1da808p-2
+0x1.4c0066p-1
+0x1.57c40ap-4
+0x1.0ed704p-2
+0x1.e20af6p+0
+0x1.3f9d9ep-1
+0x1.e3963cp-2
+0x1.9962bep+1
+0x1.1970e4p+2
+-0x1.367d5ap-4
+0x1.7c379cp-3
+-0x1.535108p+1
+-0x1.a18f2ap+0
+-0x1.15105ep+2
+0x1.1b784p+2
+0x1.3a4166p-3
+0x1.b7f37ep-1
+0x1.2329bp-4
+0x1.5b87b6p+1
+-0x1.5ee2bcp+0
+-0x1.8b0e2ep-2
+-0x1.56d3ep+1
+0x1.10f4dep+2
+-0x1.0bf5a6p+0
+-0x1.732da6p-4
+0x1.03c83ap+1
+-0x1.47477ep+1
+-0x1.1a484cp+0
+0x1.54e216p+1
+-0x1.607414p+1
+0x1.3af45ep+1
+0x1.2d35dap-3
+-0x1.6c0594p+0
+-0x1.337242p-3
+0x1.9c45e4p+1
+-0x1.63708cp-2
+0x1.58e512p+1
+-0x1.40e748p-7
+0x1.6d6436p-2
+-0x1.70756p+3
+-0x1.13d5bp+1
+-0x1.0bdb8ap+3
+0x1.76ba4ap+1
+0x1.74c826p+1
+-0x1.30a1d8p-4
+0x1.210e5cp-2
+0x1.0d781ap+2
+0x1.8e798cp+1
+-0x1.35df74p-4
+-0x1.2e04dcp-4
+0x1.66940ep+1
+0x1.6a04b2p-2
+0x1.d7c0c6p-6
+-0x1.3777d8p-1
+0x1.781b4ap+0
+0x1.9b9eb6p-4
+-0x1.52ca5cp+1
+-0x1.bd3f38p-2
+0x1.321e0ap-1
+-0x1.139e9ap+1
+0x1.a54e7p+2
+0x1.e5424ap-4
+-0x1.e1a202p-1
+0x1.9663a2p+1
+0x1.5168ccp+1
+-0x1.4a0188p-2
+-0x1.fa0c48p-1
+0x1.6c0bccp+1
+0x1.0e3b7cp+2
+0x1.1e5b42p+0
+0x1.cc844p-2
+-0x1.637bccp+1
+-0x1.36ad66p-4
+-0x1.156c24p+1
+0x1.71e292p-2
+-0x1.d9793ap-1
+0x1.fa92f8p-3
+-0x1.488b06p+0
+0x1.07cd1ap-4
+-0x1.8702a2p-2
+-0x1.225c9ep+1
+-0x1.7f7204p-3
+0x1.3a85c6p-2
+-0x1.1f5404p+1
+0x1.2c18aep-3
+-0x1.02c0aep-5
+-0x1.5e04dcp+1
+0x1.7c36b8p+1
+0x1.96c038p+1
+-0x1.db2e8cp-2
+-0x1.cd07d8p-3
+0x1.7b3e0cp+1
+0x1.1c8c62p+2
+-0x1.617268p+1
+-0x1.e6645p+0
+-0x1.08b348p-4
+0x1.1ac63ep+2
+0x1.0dfb3cp+2
+0x1.1e3e4ep-1
+0x1.6dc63cp+1
+-0x1.45a632p-3
+0x1.714c24p-2
+0x1.ee9792p-1
+0x1.afc428p-2
+-0x1.07fedcp+0
+0x1.55a38ap-2
+0x1.14c72ep-2
+0x1.226b88p-1
+-0x1.2f4d32p-4
+0x1.3e2c1ap+0
+0x1.6a05d4p+1
+0x1.14bf0cp-1
+-0x1.32a40cp-4
+-0x1.a5aa4ap-5
+-0x1.1f319ep+2
+0x1.3b6b16p-2
+0x1.d9e6f2p+1
+0x1.0186fp-1
+0x1.14dcdcp-3
+-0x1.73ec3ep+1
+-0x1.0e6aaep-3
+0x1.9ea2f4p+1
+-0x1.13233ap+4
+-0x1.34f558p-4
+-0x1.0e0352p-1
+-0x1.737926p-2
+0x1.645f06p-4
+0x1.7073b4p+0
+0x1.1e13a6p+1
+-0x1.03cef8p+1
+0x1.131784p+2
+0x1.11a526p+1
+-0x1.fcbca6p+0
+0x1.7b65e6p-2
+-0x1.418c16p+1
+0x1.38fd4p-1
+0x1.62fe14p+1
+0x1.780cb6p+1
+-0x1.e8d1fp-1
+0x1.228b02p-6
+0x1.85b9dcp+1
+0x1.0e283ap+2
+-0x1.d5a52cp+0
+-0x1.9209b4p+3
+-0x1.cb4b88p+1
+-0x1.71d56ap+0
+-0x1.43d83ep-8
+-0x1.354fcep-4
+0x1.816a8p+1
+-0x1.0c00ccp-4
+-0x1.3700fep-4
+0x1.74853cp-5
+-0x1.f78656p-2
+0x1.1b84a2p-1
+-0x1.dad15p-2
+-0x1.46dffp+1
+-0x1.b7d5e6p-2
+-0x1.b73ee2p-11
+0x1.81e878p+1
+-0x1.2dd9f4p-4
+0x1.1c6e4p+0
+0x1.207204p-1
+-0x1.8ba2fap-1
+0x1.4b0e1p+0
+0x1.7606eep+0
+0x1.6125b2p+1
+-0x1.8e964ep-1
+0x1.9e5e94p+1
+-0x1.326f4p-4
+0x1.a89b54p+1
+-0x1.6378d8p-1
+-0x1.23a9d2p+2
+0x1.892ac4p+1
+0x1.4aef3cp+1
+-0x1.87e214p+1
+-0x1.52ebf8p+1
+0x1.78eedap+1
+-0x1.6185eap+3
+-0x1.28c228p+2
+-0x1.975928p+1
+0x1.31bdbcp-4
+0x1.86aec2p-7
+0x1.5abb42p-2
+-0x1.18b8f8p-2
+-0x1.73433ep-2
+-0x1.6ec38ap-3
+0x1.1a330ep+2
+-0x1.97b946p+2
+0x1.077e5p+1
+0x1.18f0a4p+2
+-0x1.351ab4p-4
+0x1.3817d8p-1
+0x1.55e486p+1
+-0x1.1deec8p-1
+-0x1.838984p+0
+-0x1.bfe726p+0
+-0x1.139b52p+4
+0x1.1c8ecap+2
+-0x1.385deep-2
+0x1.7ad5bep+1
+-0x1.ca4ea2p-1
+-0x1.528404p+1
+0x1.965e58p+1
+-0x1.3f8154p+1
+-0x1.dfabap-2
+-0x1.303b3cp-4
+0x1.15e698p+1
+0x1.15663ep+0
+-0x1.38e5bep+1
+0x1.1aa762p+0
+-0x1.f4a76p+0
+-0x1.34a1a8p-4
+-0x1.287326p+1
+-0x1.243778p+1
+0x1.b13e2p-2
+0x1.18aaacp+2
+-0x1.399494p+1
+0x1.6a5d54p+1
+-0x1.329d12p-4
+-0x1.4e209ap+1
+-0x1.0406fcp+1
+0x1.d1f2eep-4
+0x1.3be89cp+1
+0x1.ad9acap-2
+0x1.1303e6p-1
+-0x1.8dd6bap+3
+-0x1.7fe85ap-3
+0x1.964c34p-2
+-0x1.060912p+1
+-0x1.f2eff6p-6
+0x1.39aeacp+1
+0x1.83e306p+1
+-0x1.3cc9c2p+1
+-0x1.296034p-4
+0x1.d3fe14p-2
+0x1.5a2b0ep+1
+-0x1.687954p-5
+0x1.1947f8p-2
+0x1.0d6d1p+2
+-0x1.d56f06p-1
+-0x1.64804p+1
+-0x1.2d370ep-4
+-0x1.fd54b6p-1
+-0x1.469a58p+1
+-0x1.2600ccp-3
+0x1.4a52a2p+1
+0x1.143b5ap+1
+-0x1.3ee13p+0
+0x1.992f76p+1
+-0x1.22f3aap-1
+0x1.0c5358p-2
+-0x1.8268f2p-12
+-0x1.4a87f2p+0
+0x1.f09afcp-2
+0x1.c8f29ap+0
+0x1.5f28ccp+1
+-0x1.5b39b2p+1
+0x1.ceaa38p-6
+0x1.1971ecp+0
+-0x1.0db4d4p+0
+-0x1.31e0c6p-4
+-0x1.29491ap-4
+-0x1.32b39ep-4
+0x1.b237d8p-3
+0x1.937e58p+1
+-0x1.130dccp-7
+0x1.86e96p+1
+-0x1.bf69d8p-3
+-0x1.36035cp+4
+-0x1.58c7b8p+0
+-0x1.49eb1ep+1
+0x1.5c5262p-1
+0x1.53fcc8p-2
+0x1.3bc1f6p+1
+-0x1.347122p-4
+0x1.774766p+1
+-0x1.b131c6p+0
+-0x1.1ab9fcp+0
+-0x1.312e72p-4
+-0x1.6158bp+1
+0x1.020bf2p-1
+-0x1.95e65cp-1
+0x1.0f855p-1
+0x1.753114p-2
+-0x1.fa4ap-2
+-0x1.f5789cp+0
+0x1.c7f504p-5
+0x1.130f1ep-1
+0x1.8259d6p+1
+0x1.fd4d5p-2
+-0x1.09fbb6p+1
+0x1.0d403p+2
+-0x1.3fedf6p-4
+-0x1.4e95b4p+3
+0x1.157abep+2
+0x1.1581cp+2
+0x1.0f18ccp+0
+-0x1.ba5008p-3
+-0x1.0450f4p-2
+0x1.9f78b4p+1
+0x1.45e0dap-1
+0x1.700002p+0
+-0x1.c749d2p+1
+0x1.2d70bp+1
+-0x1.6772e2p-3
+-0x1.68b22ep+0
+-0x1.9767ecp+0
+-0x1.29b4dap-4
+0x1.e3f134p-1
+-0x1.31b36ap-4
+-0x1.bc7d5p+1
+-0x1.0f42fp+0
+-0x1.7f8552p+0
+0x1.10d28ep+1
+0x1.1a463cp+2
+0x1.2478a6p-9
+-0x1.2a63acp+1
+0x1.1d6f0ep+2
+0x1.4ca544p-2
+-0x1.fb922ep-12
+0x1.798756p+2
+0x1.8c9b7cp+1
+0x1.0d1ff2p+2
+-0x1.67d556p-1
+-0x1.44c0f4p-4
+-0x1.2e8d9ep-4
+-0x1.dcc188p-2
+-0x1.9624d4p+1
+-0x1.649b1p-1
+0x1.a69b1p+1
+0x1.fb523cp-1
+0x1.57c3fep-2
+0x1.6a83a8p-8
+-0x1.33fc56p-4
+0x1.a6601ep+1
+-0x1.552a5ep+0
+-0x1.5cd282p+4
+-0x1.014422p-2
+0x1.919078p+1
+-0x1.03e91cp+0
+0x1.4e8f42p+1
+0x1.49c32p-2
+0x1.1c34fap-1
+-0x1.d0cacp+2
+-0x1.a6e4a6p-3
+0x1.1979d2p+2
+-0x1.5c7444p+1
+-0x1.204fa8p+1
+-0x1.74de44p-5
+0x1.0d3e2ep+2
+-0x1.59b50cp-2
+0x1.1d7a2cp+2
+-0x1.d84d02p-2
+-0x1.e823d4p-4
+-0x1.a6bf2p-1
+0x1.8e54fp+1
+0x1.a35faep-2
+-0x1.0c803p-1
+0x1.3d3d6ap+1
+0x1.bc89dep-1
+-0x1.3d136ap+1
+-0x1.1291d4p-6
+-0x1.864fb2p-4
+0x1.62ba24p-1
+0x1.6e8daep+1
+-0x1.5e7486p-4
+0x1.0e6faap+2
+0x1.31a202p-1
+-0x1.3cd606p+3
+-0x1.c5d49p+0
+0x1.1f738ap+0
+0x1.1c5f44p+2
+-0x1.072c08p-4
+0x1.0cf76cp+2
+-0x1.b957c4p-2
+-0x1.1ad3c8p-1
+0x1.b6578p-2
+-0x1.703f3ap-6
+-0x1.68a344p+0
+-0x1.eb8188p+0
+0x1.0e0802p+2
+0x1.dbd8e4p-2
+0x1.364246p-2
+-0x1.ffc1cep-1
+0x1.749832p+0
+-0x1.cf3a6ep-7
+-0x1.66df6p-1
+-0x1.1017bep+3
+0x1.05c8fcp-1
+-0x1.7ab2dap-7
+0x1.9d6a3p+1
+-0x1.337716p-4
+-0x1.c1934cp-1
+-0x1.138ebcp-1
+-0x1.35f16p-4
+-0x1.64780ap-6
+-0x1.167f94p+3
+-0x1.5158d2p+1
+-0x1.fdd872p-3
+0x1.a2b46p+1
+0x1.2436fcp-2
+-0x1.68d52ap-2
+0x1.8efb64p-3
+0x1.a0dc7ep+1
+-0x1.a0112cp+0
+-0x1.1a17cep+0
+-0x1.6c7ee2p+0
+-0x1.05f67cp+0
+-0x1.0b36b8p+3
+-0x1.36523ep-4
+0x1.f11a42p-1
+0x1.15ab74p+2
+-0x1.5bc8ecp+0
+-0x1.2ea89cp-4
+0x1.73c892p-1
+0x1.1bf5cep-2
+-0x1.81da28p+0
+0x1.08eee6p-1
+0x1.20aaa8p+0
+-0x1.433b2p-1
+-0x1.2e48c8p-4
+0x1.33ef54p-1
+-0x1.8d8fap-1
+0x1.a5c5bcp-4
+-0x1.3478eap-4
+0x1.2e3552p+0
+0x1.12a2dp+2
+0x1.e446b2p-4
+0x1.7979ecp+1
+0x1.166012p+2
+-0x1.454876p-2
+0x1.aa6f0ap-4
+-0x1.20bd32p+1
+-0x1.34c7d8p+0
+-0x1.4cfd8ap-7
+-0x1.36b0e4p-4
+-0x1.db3a1cp-3
+0x1.d9eabp+1
+0x1.9898dap+1
+-0x1.0fdefep+1
+0x1.7aa95ep+1
+-0x1.e05838p-1
+-0x1.11bb4ep+1
+0x1.9be3cap+1
+-0x1.36a57ap-4
+-0x1.2d24dp+4
+0x1.6f97eep+1
+-0x1.264e28p-3
+-0x1.152cbap+1
+0x1.136628p+2
+-0x1.a79d3ep-4
+0x1.1f1dd2p-1
+-0x1.3a5e08p-2
+0x1.74f1a2p-1
+0x1.0da394p+2
+-0x1.b18996p+2
+-0x1.326c62p-4
+-0x1.c774eep-1
+-0x1.6e756ep-2
+0x1.1d8ce4p+2
+-0x1.27e158p-2
+-0x1.ef3134p-1
+-0x1.d4146ep-5
+-0x1.8b522ap+3
+0x1.92447ap+1
+-0x1.184f48p+0
+0x1.17c732p+2
+-0x1.5fcfb6p+1
+-0x1.35528ap+1
+0x1.0ece64p+2
+-0x1.09e0c6p+1
+0x1.853272p+1
+0x1.0390dap-1
+-0x1.808252p-6
+0x1.b05244p+0
+-0x1.e4320ap-2
+0x1.3a682ep-1
+0x1.9939c2p+1
+-0x1.ff5038p-2
+-0x1.7c7414p+1
+0x1.1271c8p+1
+0x1.10db3ep+2
+0x1.08362ep+1
+0x1.7dc1fcp+1
+0x1.f9b97ep+0
+0x1.7f991p+1
+0x1.13b7fp-5
+-0x1.36f9a6p+1
+-0x1.bf33aap-17
+0x1.4d48eap+1
+0x1.814322p+1
+0x1.104532p+2
+-0x1.cc3924p-1
+0x1.a82e48p+1
+-0x1.8066e4p-1
+-0x1.31c88p-4
+0x1.1c0d22p+1
+0x1.45a4a2p+0
+-0x1.952a72p-2
+-0x1.b8945p+0
+0x1.4d78c8p+1
+-0x1.1d5f4p+4
+0x1.13ef6cp-1
+-0x1.808e5ap+1
+0x1.17c234p+2
+0x1.11b728p+0
+-0x1.a9d59cp-4
+0x1.8938aap-6
+-0x1.1f29cep+3
+0x1.c99c2ap-4
+0x1.6209eap+1
+0x1.15c72ap+2
+0x1.120c28p+2
+0x1.592c44p-5
+0x1.7b32e4p-3
+-0x1.ea1faep-3
+0x1.07e47cp-4
+0x1.1824e2p+2
+0x1.623f26p-1
+-0x1.535f3p-3
+0x1.5b77e4p+1
+0x1.166e9p+0
+-0x1.d7f864p-9
+0x1.6be938p+1
+-0x1.053aa8p-6
+-0x1.3a1f6p+0
+0x1.d11a72p-4
+0x1.066e6ep-1
+-0x1.553c24p-3
+0x1.4a1adep+1
+-0x1.165dfep-3
+0x1.9aea0cp+1
+0x1.3fa66p-1
+0x1.44717ep+1
+0x1.d4b5ep+0
+-0x1.4ce712p+1
+0x1.90dc5p+1
+-0x1.bb9926p+1
+-0x1.ea6a6p+0
+0x1.a4f664p+0
+-0x1.d0789ep+1
+0x1.47ff3p+0
+-0x1.a4582ap-2
+0x1.0f1fbcp+2
+-0x1.851cbep+0
+-0x1.cad56p+0
+0x1.fb3c08p-1
+-0x1.8600c4p+0
+-0x1.280b14p-4
+0x1.453bcep+1
+-0x1.65a45p-2
+-0x1.02c716p+1
+-0x1.0f67dcp+0
+-0x1.3329dcp-4
+-0x1.813234p+0
+0x1.48ab04p+0
+0x1.959152p+1
+0x1.1d050ap+2
+0x1.44c6dcp-3
+0x1.18537cp+2
+-0x1.92e60ep+1
+-0x1.525a6p+3
+0x1.279f9ap-1
+0x1.d03c6p-2
+-0x1.95b67p-2
+0x1.2b892p+1
+0x1.8aed26p+0
+0x1.71a006p+1
+0x1.2e8d8cp+0
+-0x1.56105cp-2
+-0x1.361ac2p-4
+0x1.e8907cp-3
+0x1.2e161p+2
+0x1.10c198p+2
+0x1.e31decp+2
+-0x1.413e02p+1
+-0x1.c12e1p-2
+0x1.9daef2p-2
+-0x1.b2a0f4p+0
+-0x1.59e422p-3
+-0x1.041c7ep+0
+0x1.790cd8p+1
+0x1.6650fcp+1
+-0x1.35f2dep-4
+-0x1.ff881cp+0
+-0x1.2704d2p+1
+0x1.9e0808p-3
+0x1.96a51p+1
+0x1.1aeb02p+2
+-0x1.2e50b8p-2
+-0x1.74685cp+1
+0x1.9bf692p+1
+-0x1.35fff4p-4
+-0x1.41eb4ap+4
+-0x1.e8ac7p+1
+0x1.4c0388p-1
+-0x1.30d8aap-4
+0x1.a4a072p+0
+-0x1.437f74p+1
+-0x1.1593a4p+0
+0x1.77bdeep+1
+0x1.7cda62p+1
+-0x1.19d11cp+2
+0x1.1de2e2p+2
+0x1.964d1p-4
+-0x1.db69fep-2
+-0x1.a3d6cep-3
+0x1.9f68cap-2
+-0x1.04116cp-5
+0x1.05b658p-1
+0x1.1d7a04p+0
+0x1.19b26ap+2
+0x1.0d19eep+2
+0x1.6ddca6p-2
+0x1.429242p-2
+0x1.79bd98p-2
+0x1.460756p+1
+0x1.4ef02p-3
+0x1.5ab3bap+1
+0x1.81525ep+1
+-0x1.21c3bcp+1
+0x1.99bf02p+1
+-0x1.f42bc6p+0
+0x1.2191ap+2
+-0x1.1fa0bcp+2
+-0x1.1e539cp-3
+0x1.1aaaaep+2
+0x1.1e9862p-2
+-0x1.34fb92p-5
+0x1.78626ep+1
+0x1.a1dd9ap+1
+-0x1.24e6dap+2
+-0x1.0d049p-3
+-0x1.ed15acp+0
+0x1.2c3006p-1
+0x1.751326p-3
+0x1.9b3f0cp+1
+-0x1.53880cp-2
+0x1.d9e45p+1
+0x1.ef5dfap+0
+0x1.aa1c96p+1
+0x1.746548p+1
+0x1.6f4152p-1
+-0x1.d895a6p-5
+-0x1.3de39cp+4
+-0x1.2d7adap-1
+0x1.5fe768p-1
+-0x1.2d176ep+1
+0x1.3c92eep+3
+0x1.76be62p+0
+0x1.91f7aap+1
+0x1.cba684p-2
+-0x1.350b24p-4
+0x1.e89612p+0
+-0x1.e0d5dcp-1
+-0x1.7c4b6ep+1
+-0x1.ce6d08p-4
+-0x1.e4e1fp+0
+0x1.1e69a6p+2
+-0x1.a72352p+2
+-0x1.fa0866p-3
+0x1.193b9ep+2
+-0x1.e5a2dcp+0
+0x1.bac746p-4
+-0x1.a74954p+1
+0x1.b6958ap+1
+0x1.10dfd8p+2
+-0x1.238eeep+1
+0x1.5fef46p+0
+-0x1.b72a8ap-1
+0x1.f9e15ep-2
+0x1.d82a3ap-8
+-0x1.28248ap+1
+-0x1.aa113ap-5
+-0x1.1a412ep+1
+0x1.679748p-1
+0x1.22106ep-2
+-0x1.3122d6p-1
+0x1.0c6e18p+2
+0x1.a79f02p+1
+-0x1.8f3d18p+0
+0x1.14ddb2p-1
+0x1.7ebb34p+1
+-0x1.2e5b18p+3
+-0x1.c61e0cp+1
+0x1.59dcb4p+1
+0x1.79d2bap-3
+0x1.cfc494p-4
+-0x1.2ac43ap+2
+0x1.13727p+2
+-0x1.033e3ap-2
+-0x1.06p+5
+-0x1.23a906p-3
+0x1.bd019ep-2
+-0x1.f5986cp+0
+-0x1.313e8cp+1
+0x1.5ed728p-5
+-0x1.88d504p+1
+0x1.7a0fc8p+1
+-0x1.bba7fep-2
+0x1.2d0bccp+0
+0x1.68e3p+1
+0x1.8c6fb6p+1
+0x1.5531a6p-2
+-0x1.46bc7cp+1
+-0x1.706772p-3
+0x1.c008d6p+0
+-0x1.36eb54p-4
+-0x1.6f548p+1
+0x1.ffadf6p-4
+0x1.972fb6p+1
+0x1.d9eff8p+1
+0x1.0acaecp+0
+0x1.1a5ac2p+2
+0x1.79d0cep+1
+0x1.857eaep+1
+-0x1.0691d2p+1
+0x1.26905p-2
+-0x1.e91e28p-2
+0x1.0a9cbep-2
+-0x1.34f3f4p-4
+0x1.9f93d4p-2
+-0x1.b74e3p-1
+0x1.8300cap+1
+-0x1.43973ap+1
+-0x1.d1cb64p+0
+0x1.154c14p+2
+0x1.e48fap-1
+0x1.bc715ep-2
+-0x1.142f68p-6
+-0x1.ce93ep+1
+-0x1.c96304p-5
+0x1.0cde26p+2
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 03/17] benchtests: Add exp2m1f benchmark
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
  2024-10-25 18:21 ` [PATCH 01/17] math: Add e_gammaf_r to glibc code and style Adhemerval Zanella
  2024-10-25 18:21 ` [PATCH 02/17] benchtests: Add exp10m1f benchmark Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-29 18:18   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 04/17] benchtests: Add expm1f benchmark Adhemerval Zanella
                   ` (14 subsequent siblings)
  17 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

The input is based on exp2f benchmark.
---
 benchtests/Makefile       |    1 +
 benchtests/exp2m1f-inputs | 2388 +++++++++++++++++++++++++++++++++++++
 2 files changed, 2389 insertions(+)
 create mode 100644 benchtests/exp2m1f-inputs

diff --git a/benchtests/Makefile b/benchtests/Makefile
index 6d57155437..25dfe700a6 100644
--- a/benchtests/Makefile
+++ b/benchtests/Makefile
@@ -45,6 +45,7 @@ bench-math := \
   exp10m1f \
   exp2 \
   exp2f \
+  exp2m1f \
   expf \
   expm1 \
   floor \
diff --git a/benchtests/exp2m1f-inputs b/benchtests/exp2m1f-inputs
new file mode 100644
index 0000000000..fc47072354
--- /dev/null
+++ b/benchtests/exp2m1f-inputs
@@ -0,0 +1,2388 @@
+## args: float
+## ret: float
+## includes: math.h
+## name: workload-spec2017.wrf
+-0x0p+0
+-0x1.092bd4p+2
+-0x1.8af5ecp-1
+0x1.45659p+3
+0x1.388742p+3
+0x1.3857eep+3
+-0x1.80f2ep+0
+-0x1.3a3adcp+1
+-0x1.07b87ap+0
+0x1.3c5c22p+3
+0x1.ede768p+2
+-0x1.bb5bcp-2
+-0x1.0e7d6ep+5
+-0x1.79ac4p+4
+0x1.20fe8ap+3
+-0x1.616dd4p+3
+-0x1.7d3bc2p+0
+0x1.0b8384p+0
+0x1.44422ap+3
+0x1.e3bce8p+2
+0x1.44d11ap+3
+0x1.cfdd92p+2
+-0x1.b5093p+1
+0x1.9d1724p+1
+0x1.9471bcp+2
+0x1.9ccc52p+0
+-0x1.e1ea14p+0
+-0x1.46d1ecp-3
+0x1.927332p-2
+-0x1.d553a2p+1
+0x1.923732p+0
+0x1.6aea06p+2
+0x1.92eb6cp-1
+-0x1.a7cd8ep+2
+-0x1.bda41p+2
+-0x1.312bb8p+1
+0x1.b52ab2p+1
+-0x1.a90d4ep+2
+-0x1.26bc92p+2
+-0x1.6035eep-3
+-0x1.7dbc7ep+3
+-0x1.736a64p-1
+-0x1.7595c8p+2
+-0x1.dade16p-1
+0x1.b3d2c8p+2
+-0x1.ec98dep+1
+-0x1.134a88p+0
+0x1.c5fafap+1
+0x1.255ee4p-3
+-0x1.2da37ep+6
+-0x1.7e171ep+0
+0x1.d9f48ap+2
+-0x1.75f3eep+2
+0x1.3e8f9ap+3
+-0x1.608296p-3
+0x1.b5f2dcp+2
+0x1.d86428p+0
+0x1.412beap+3
+-0x1.3ea40ap+1
+-0x1.41dfc4p+2
+-0x1.21bd5p-2
+-0x1.54fdf8p+2
+-0x1.608d6ap-3
+-0x1.863facp+2
+0x1.ae490ap+2
+-0x1.b04428p+0
+0x1.e5a47p+1
+0x1.bcf1aep+0
+0x1.3c662ap+0
+-0x1.3b0756p+0
+-0x1.6bafb2p+2
+0x1.7bc0dcp+2
+0x1.444f44p+3
+0x1.44609ap+3
+0x1.165ffep+0
+0x1.d47be6p+2
+-0x1.4263ecp+1
+-0x1.8e061ep+2
+0x1.0f0eb8p+0
+-0x1.3fd988p+2
+0x1.4f49f6p+1
+-0x1.543c3cp+3
+-0x1.5f0aa4p-3
+-0x1.5c3fa2p+2
+-0x1.82b9b2p+2
+-0x1.64ce3ap-3
+0x1.79f9f8p+2
+0x1.b24b12p+2
+-0x1.43658cp+3
+-0x1.658068p+0
+0x1.203d1cp+0
+-0x1.c142c6p-1
+0x1.9a1cd6p+1
+-0x1.ade766p+1
+0x1.daf22p+2
+-0x1.62f814p-1
+-0x1.79bb9cp+0
+-0x1.38a3e4p+0
+-0x1.dea0fp+2
+-0x1.f09064p+1
+0x1.e8baep-1
+-0x1.deb80cp+0
+0x1.bc846ap+2
+0x1.ebc59ep+2
+-0x1.4e3848p+3
+0x1.d42b04p+2
+0x1.e0cb2ep-3
+-0x1.7ee3d6p-2
+0x1.dfc3a4p+2
+-0x1.7b7d56p+2
+-0x1.59d8b6p+2
+-0x1.17cea4p+0
+-0x1.a9839ep+2
+0x1.e985b6p+2
+-0x1.eb72dp+2
+0x1.0dd7aep-1
+-0x1.0325eap+1
+0x1.a7f02ep+1
+-0x1.fab7e2p+1
+0x1.ab8e12p+2
+0x1.a28b4ep+2
+0x1.136d86p-4
+-0x1.eafep+0
+-0x1.a5b8ep+4
+-0x1.217af6p+0
+-0x1.517d18p-1
+-0x1.525346p+2
+0x1.4b30ccp-1
+-0x1.5ea04ep-3
+-0x1.b96c1p+2
+-0x1.23c61ep+1
+0x1.1e53dcp-2
+-0x1.f550e2p-2
+0x1.9d8e66p+0
+0x1.c1578cp+2
+0x1.c4bbfcp+2
+-0x1.5a1902p+2
+0x1.d8469cp+2
+0x1.43d612p+3
+-0x1.578826p+1
+-0x1.0ff7e6p+3
+-0x1.f89a3cp-3
+0x1.71853ap+2
+0x1.a8240cp+2
+-0x1.40a39ap+0
+-0x1.2130e4p+2
+0x1.3abdbep+0
+0x1.9b57d6p+0
+-0x1.21eed8p+3
+-0x1.593d7cp-1
+0x1.a0b0d4p+2
+0x1.1f2aa4p+0
+0x1.e06742p+1
+0x1.bab072p+2
+0x1.46825ep+1
+-0x1.6c8604p+2
+0x1.980152p+2
+-0x1.76b6eep-1
+0x1.3d30c2p+3
+0x1.996adap+2
+0x1.3b8866p+3
+-0x1.7b4842p-2
+-0x1.1df6b8p-1
+-0x1.daa564p+2
+0x1.cc7028p+1
+0x1.71de86p+0
+-0x1.6c3d08p+0
+0x1.91c468p-1
+-0x1.3ba51ep-3
+-0x1.135962p-4
+-0x1.1f891p+2
+0x1.aa1e92p+2
+0x1.ccb4eap+2
+0x1.cca312p+2
+-0x1.bbb332p-3
+-0x1.e86bc8p+1
+0x1.53c07ap-1
+0x1.35d8cp+3
+0x1.47f866p+0
+0x1.9808a4p-1
+-0x1.fbf91cp+2
+-0x1.956b98p+1
+-0x1.8c3e7ap+2
+-0x1.a907e2p+2
+-0x1.792b7p+1
+-0x1.5c0e9p-7
+0x1.4629ecp-1
+0x1.30fed6p+1
+-0x1.aa670ap+4
+-0x1.65a70ap-2
+0x1.668866p+0
+0x1.572f5cp-2
+-0x1.55aa82p+2
+-0x1.1336c2p+1
+0x1.3a2c32p+2
+0x1.17d2b8p-1
+0x1.c1f8bcp+1
+0x1.10cb0ep+3
+-0x1.b28c42p+1
+-0x1.adc0fcp-1
+-0x1.7260c4p+2
+-0x1.5e4ae4p-2
+0x1.a4763ap+2
+-0x1.314ab2p-3
+-0x1.81ef1cp+2
+-0x1.a36d9ep+2
+-0x1.d85266p-1
+-0x1.503506p+5
+0x1.45401ep+3
+-0x1.0b5af6p+0
+-0x1.bfd03ap+2
+0x1.487766p+3
+-0x1.490c08p+4
+0x1.5f2852p-3
+-0x1.0e805cp+0
+-0x1.4d25aap+5
+-0x1.14973ep+2
+-0x1.a416b2p-1
+0x1.0e2bccp+1
+0x1.213eb8p-4
+0x1.3fabaep+0
+0x1.ebf592p-1
+-0x1.58f156p+2
+-0x1.e47384p-1
+0x1.41a968p+3
+-0x1.62169ap+1
+-0x1.24518ap+0
+-0x1.2b3848p+2
+-0x1.2473e2p+2
+0x1.cbf3f6p+2
+0x1.c7647ap-1
+0x1.0d0038p-1
+0x1.35fc7ep+3
+0x1.3f8aa6p+3
+-0x1.647b64p-3
+-0x1.5bbab6p-3
+-0x1.79c962p+2
+-0x1.57007ap-3
+-0x1.06533ap+2
+-0x1.43c814p+0
+0x1.8b8652p+0
+0x1.872cb8p+0
+-0x1.7b02ap-3
+-0x1.111332p-2
+-0x1.5cfe1ep-3
+-0x1.5da536p-3
+0x1.10caacp+3
+0x1.ae6508p+2
+0x1.3bef7ap+3
+0x1.282ec8p+2
+-0x1.9a2e56p+2
+-0x1.5bf556p-3
+-0x1.010ea8p+3
+0x1.7b5c7ap-2
+-0x1.648d0ap+0
+-0x1.4f6a82p+0
+0x1.432dcep+3
+0x1.78819ep+2
+-0x1.417cfap+2
+-0x1.9c93eap+2
+-0x1.477822p+2
+-0x1.5f354ep-3
+0x1.3752eep+2
+-0x1.d8cd0ap+2
+-0x1.08e0a4p+0
+0x1.87b0b8p+0
+-0x1.32451ep+1
+0x1.305e7p+0
+-0x1.649322p-3
+-0x1.a2bp-2
+-0x1.60850cp-3
+-0x1.60f59ap-3
+0x1.79ce2cp-1
+-0x1.647d6ap-3
+0x1.a828ep+0
+-0x1.7cd6ep+0
+0x1.44835ep+3
+0x1.0bd40cp+0
+-0x1.b370ccp+0
+-0x1.b13c84p+2
+0x1.82c1dp-1
+-0x1.529398p+5
+-0x1.1a187ep-3
+0x1.d57a16p+2
+0x1.30bf36p+2
+-0x1.449d04p+3
+-0x1.569fcep-3
+-0x1.185e66p+4
+0x1.e631eap-2
+-0x1.ac70f6p-1
+0x1.4627e8p+3
+-0x1.633cc4p-3
+0x1.9f868ep+2
+-0x1.db78ep-1
+-0x1.6b700ap+2
+-0x1.04137ep+1
+0x1.6b8552p+0
+0x1.37ad6p+3
+0x1.75f16p+3
+-0x1.811434p+1
+0x1.417fcep+3
+-0x1.f1ce28p-2
+0x1.363584p+3
+0x1.ff1094p+1
+0x1.90a454p+2
+-0x1.cb3544p+1
+-0x1.651e0ep-3
+0x1.80cdf4p+3
+0x1.5fcd1ap+0
+-0x1.31335cp+5
+0x1.aa75dep+2
+0x1.db9a66p+0
+-0x1.52754p+3
+0x1.10a55ep+0
+0x1.cae0eap+2
+0x1.c6af44p-1
+-0x1.cde492p+1
+-0x1.93aab4p+1
+-0x1.1213c4p+2
+-0x1.9c4b32p+0
+-0x1.d8fa66p+0
+0x1.5cf4a6p+2
+-0x1.90565ap+2
+0x1.b65acp+2
+-0x1.5e0c1ep-3
+0x1.10cb7p+3
+-0x1.658ecap-3
+0x1.43e2f6p+0
+-0x1.bc6366p+2
+0x1.665548p-1
+-0x1.11cd7p-1
+0x1.173eep+0
+-0x1.4e1d58p+2
+0x1.7494ccp+1
+-0x1.26d708p+4
+-0x1.34c074p+1
+0x1.85edc2p+1
+0x1.a79a8ep+1
+-0x1.628072p-3
+0x1.f8daep-3
+0x1.84fe96p-2
+0x1.5b45f4p-2
+-0x1.58870cp-3
+-0x1.37ba3ep+2
+-0x1.653a8ep-1
+0x1.719f5cp-2
+-0x1.2e786ep+1
+0x1.662788p+2
+0x1.dba64p+2
+-0x1.aca33ap+2
+0x1.b3223ap+2
+-0x1.23a97ap+2
+-0x1.b5b582p+2
+0x1.1b9cccp-2
+-0x1.7753bp-2
+0x1.5e542p+2
+-0x1.5abfp+1
+0x1.dd8a8ap+2
+-0x1.b41d7ep+1
+-0x1.65a87p-4
+0x1.3966eap+3
+-0x1.81735ap+2
+0x1.b46238p-1
+-0x1.aa568ep+2
+0x1.37a5bp+3
+0x1.e3p-4
+0x1.97a2f6p-1
+0x1.334cep+0
+0x1.90b7aep-3
+0x1.0d89fap+1
+0x1.6231ccp+2
+-0x1.614f2p+0
+0x1.34f15cp+0
+-0x1.6d631ap+1
+0x1.ba88d2p+2
+-0x1.3f0d44p+3
+0x1.aff8bp-4
+0x1.05c3d6p+1
+0x1.407924p-1
+-0x1.52616cp+0
+0x1.bcbf28p+2
+-0x1.48f218p+2
+0x1.3f457p+0
+0x1.ecbac4p-4
+0x1.9088bap-2
+-0x1.d4d294p+2
+-0x1.620106p-3
+0x1.487b7cp+3
+0x1.3c89f8p-2
+-0x1.82a98p+2
+0x1.f69746p+0
+0x1.cf72b6p+2
+-0x1.6460cep-3
+-0x1.813142p+1
+-0x1.7d2a9cp+2
+0x1.ebf4eep+2
+0x1.bbc7fcp+2
+-0x1.fc9bf2p+1
+-0x1.abd912p-1
+-0x1.181baep-1
+-0x1.376852p-3
+0x1.2f9d3ap+2
+0x1.a43f72p+2
+0x1.10cd82p+3
+0x1.330766p-7
+0x1.9c7abap-2
+-0x1.1d151ap+4
+0x1.0420aep+2
+-0x1.1c82d8p-4
+0x1.03f97p-1
+-0x1.9ce762p-2
+-0x1.01d9a8p+1
+0x1.bc5b9ep-3
+-0x1.b85dd4p+2
+-0x1.5fbe3ep-3
+0x1.a2fca8p-1
+-0x1.f87332p-2
+0x1.ffb102p-1
+0x1.496214p+0
+-0x1.830a7p+2
+-0x1.0509fap-2
+-0x1.53079ap+0
+0x1.76198p+0
+-0x1.5dbb76p-3
+0x1.a46a9ep+1
+-0x1.646f1ap+5
+-0x1.ab75c8p+1
+-0x1.b85902p-6
+0x1.284bc2p+0
+-0x1.62cc74p-3
+0x1.c928cap+2
+0x1.40b302p-2
+-0x1.737232p+2
+0x1.3a823cp-1
+0x1.157b9ep+1
+-0x1.a1ba3ep+4
+0x1.f51844p+2
+0x1.b43bdep+2
+0x1.142676p+2
+-0x1.2d1b7ep+2
+0x1.51213ep-2
+0x1.7b7938p+2
+-0x1.57e164p+1
+-0x1.1f42a4p+1
+-0x1.bedddep+1
+-0x1.0501eap+2
+0x1.c8d1fp+2
+-0x1.7427cep+5
+-0x1.167deep-1
+0x1.820772p-3
+-0x1.f0b1dap+1
+0x1.87c9e4p+2
+0x1.6eeeeap+1
+-0x1.a35f4ap+2
+0x1.8ae50ap+0
+-0x1.28cd7ap+1
+0x1.3e18f6p+0
+0x1.50b63p+2
+0x1.36c114p+3
+-0x1.00bc3p+1
+-0x1.0a799p+3
+0x1.3cc37p+0
+0x1.8c48p-1
+-0x1.0d831ep+1
+0x1.ce8994p+2
+0x1.745a2ep+1
+0x1.36a8p+3
+-0x1.1a770ap+1
+-0x1.86528ep-1
+0x1.47be68p+3
+-0x1.0eb4f6p+0
+-0x1.611df2p-3
+0x1.46c5ecp+3
+-0x1.e55996p-10
+-0x1.5e20e4p-3
+-0x1.60f51ep-1
+-0x1.49bcp+2
+0x1.649348p+1
+0x1.87a4aep-4
+-0x1.7aa58cp+2
+0x1.8cf99ap-4
+0x1.bd5326p+2
+0x1.8ce666p+0
+-0x1.6bff88p-1
+0x1.d12a7ap+2
+0x1.7dc29cp+2
+0x1.421e8ap+3
+-0x1.656186p-3
+-0x1.1fa2e2p+1
+0x1.dfd894p+2
+-0x1.e24b84p-1
+-0x1.08b8c2p+0
+-0x1.b3cd68p+2
+-0x1.5b7acep-3
+0x1.e3432ap+2
+-0x1.58e15cp+2
+-0x1.0d7ad6p+3
+0x1.a8262ep-3
+-0x1.55364ap+2
+-0x1.b95818p+1
+-0x1.5263c2p+1
+-0x1.43d4ccp-1
+-0x1.ccb046p+3
+-0x1.f4969ap-1
+-0x1.3bcb7ep-2
+-0x1.2f32cp+2
+-0x1.61303ap-3
+-0x1.df2826p-1
+0x1.5e9fc2p+2
+0x1.d03e14p-4
+0x1.42320cp+3
+-0x1.aa2f4p+2
+-0x1.f3d52ap+0
+-0x1.818c72p-2
+0x1.32d08ep+2
+-0x1.c332p+0
+0x1.dc5dc2p+0
+0x1.1c7358p-1
+-0x1.3adfd8p-1
+0x1.113bap+0
+-0x1.5b65a6p-3
+0x1.36437cp+3
+0x1.bb8dbap+2
+-0x1.c46d9p+1
+-0x1.c678d6p-1
+0x1.3c9146p+3
+0x1.485612p+3
+0x1.f87d98p-1
+-0x1.bf2d5cp+0
+-0x1.cd2c2ap+2
+0x1.829d9ap-1
+-0x1.a95bd8p+2
+0x1.a857aep+0
+-0x1.03261cp+2
+-0x1.8657d6p-1
+0x1.50b348p+0
+0x1.d615fp+2
+0x1.8b0548p-5
+-0x1.d0aa84p+1
+-0x1.9b93cap+2
+-0x1.595412p-3
+0x1.b6ab74p-2
+0x1.16c592p-2
+0x1.cccc72p+1
+-0x1.657c7p+1
+0x1.aa995cp+2
+-0x1.fa172ep+1
+-0x1.12a886p+2
+-0x1.9173d8p+2
+0x1.9c3ca8p-3
+0x1.e796ccp+0
+0x1.182396p-3
+-0x1.4291dap-4
+-0x1.62f536p-3
+0x1.7216e8p+2
+0x1.cb45c8p+2
+-0x1.497518p+2
+-0x1.351996p+1
+-0x1.0dfe32p+2
+0x1.3bfc3cp+0
+-0x1.39bd7p-6
+-0x1.3a197ap+1
+-0x1.830bc2p+2
+0x1.b3857ep-5
+-0x1.53f426p+2
+-0x1.5f6ba2p-3
+-0x1.4ed77ap+1
+-0x1.556abp+2
+0x1.9712p+1
+0x1.0bf266p+0
+-0x1.ad2376p+2
+-0x1.af3504p+1
+-0x1.76e7ep+2
+-0x1.6562bap+1
+0x1.843614p-2
+0x1.384ef8p+3
+-0x1.47a784p+0
+0x1.f4a732p+2
+-0x1.7ce922p+2
+-0x1.336c52p+0
+-0x1.48c65cp+1
+0x1.494452p+3
+-0x1.193914p+5
+0x1.3577d2p+2
+-0x1.63f1bep-3
+-0x1.55d4d8p-4
+0x1.d880eep-1
+-0x1.7204ep+0
+0x1.dbbb12p+2
+-0x1.5e758ap-3
+-0x1.21018p+1
+0x1.06676ep+2
+-0x1.646416p-3
+0x1.03d04p+2
+0x1.10cb02p+3
+-0x1.6987b8p+1
+-0x1.fb44dp+0
+0x1.0e49ecp+1
+-0x1.ae974ap+2
+-0x1.8170a4p-9
+-0x1.a49d78p+1
+0x1.f48614p-2
+0x1.c3c598p+0
+0x1.5b5d38p+2
+-0x1.e7e994p+1
+-0x1.5ffb9ap-3
+-0x1.1b21bp+3
+-0x1.71927p+1
+-0x1.5b87aep-3
+0x1.106eccp+2
+0x1.3e7aep-4
+0x1.36a5d8p+3
+0x1.1e7f48p+0
+-0x1.6caff6p+2
+0x1.91cf84p-1
+-0x1.34c43cp+1
+-0x1.594ad2p+2
+0x1.dd37d4p+2
+0x1.f073e8p+2
+0x1.cef936p+2
+-0x1.bab5acp-2
+-0x1.035e0ap+0
+0x1.6d44ccp-2
+-0x1.1c4808p+2
+-0x1.e8786ap+1
+0x1.388c7cp+3
+0x1.8766aep+1
+-0x1.5eaeb6p-3
+-0x1.64b42cp-3
+-0x1.027faep-1
+-0x1.ba8b4ep+1
+0x1.266edap+2
+0x1.9fd6c2p+2
+-0x1.a44034p+1
+0x1.78abccp+1
+0x1.377b5p+3
+-0x1.940a02p+1
+-0x1.fdb2bcp+0
+-0x1.65ae92p-3
+0x1.a521c8p+3
+-0x1.4749aap+3
+-0x1.c1a2dep-1
+-0x1.7f4bfep+3
+0x1.3f9db8p+3
+0x1.6c7c0ap+2
+0x1.82779cp-1
+-0x1.824e0ep+2
+0x1.fec4ccp-2
+0x1.e58412p+2
+-0x1.578fc8p+3
+0x1.0ccf34p-2
+-0x1.6173bcp+0
+-0x1.f7357p+0
+0x1.f3e768p+2
+0x1.4317e2p+3
+-0x1.0f5222p+1
+-0x1.e5895ep-5
+0x1.d298dep+2
+0x1.c86c1ep+2
+0x1.459134p+3
+-0x1.553b7ap-3
+-0x1.05c35cp+0
+0x1.4461bcp+2
+0x1.9bc9eap-4
+0x1.06295cp+0
+0x1.43d93ep+3
+0x1.556832p+2
+0x1.f4b8d6p+1
+-0x1.465f64p+1
+-0x1.614fdep-3
+-0x1.b5350ep-3
+0x1.9f56p+0
+0x1.454eb6p+3
+-0x1.fba2cep+1
+-0x1.5f303cp-3
+0x1.6ceed2p+0
+0x1.58255cp+2
+0x1.b69528p+1
+0x1.7177ep+3
+-0x1.a45ad8p-1
+-0x1.94f706p+0
+-0x1.be9e04p+2
+0x1.5bf948p+0
+0x1.10cacep+3
+-0x1.740c94p+2
+-0x1.09bff6p+1
+0x1.3671c4p+3
+0x1.bec15cp+2
+-0x1.6346d4p+2
+0x1.bd4e1cp+2
+0x1.82d99ap-1
+-0x1.8225a8p+2
+0x1.220a66p-2
+-0x1.e16c52p-1
+-0x1.35848ep-1
+0x1.e11384p-2
+-0x1.8d8592p+0
+0x1.4c29bcp+1
+0x1.387af8p+2
+0x1.8d8fd6p-1
+0x1.c7d02ep+2
+-0x0p+0
+0x1.38ec96p+3
+-0x1.306a06p+2
+-0x1.59c33ep-3
+0x1.6d72f4p+0
+-0x1.cf944cp+2
+-0x1.5dac8cp-3
+0x1.acda6p+2
+-0x1.e3cbf2p+1
+-0x1.0cdac4p+0
+0x1.390014p+2
+-0x1.64fceep+2
+-0x1.82edfep+2
+-0x1.3ea13cp+3
+-0x1.0b4e5cp+1
+0x1.01028ep-5
+-0x1.2bb428p-2
+0x1.00128p+0
+-0x1.7adbfap-1
+0x1.e535f2p+2
+-0x1.648a8cp-3
+0x1.e84186p+2
+-0x1.6321p+0
+-0x1.0a5654p+3
+0x1.124c1cp-2
+0x1.bba78ep+2
+0x1.4531d8p+3
+0x1.1bf358p+0
+0x1.6cf66p+1
+-0x1.033dc6p+2
+0x1.4311aap+3
+-0x1.766bdcp-3
+0x1.828456p+2
+0x1.3e467ap+3
+-0x1.7fcebep-2
+-0x1.432faep-1
+-0x1.924aaep+1
+-0x1.646662p+2
+-0x1.892088p+0
+-0x1.2b8eb8p+0
+0x1.50170ap-5
+0x1.50ad28p+1
+0x1.e2ca16p+2
+0x1.c2a97cp-1
+-0x1.613492p-3
+-0x1.7c95f4p+1
+-0x1.b20d22p+0
+0x1.713644p-2
+0x1.f59c7ap-2
+0x1.07cd36p+2
+-0x1.467f64p-2
+-0x1.01f75cp-2
+0x1.54450cp-2
+-0x1.cd8dc2p-1
+0x1.441b4ap+3
+-0x1.a839b6p+2
+0x1.6a2932p+0
+-0x1.3345ecp-1
+0x1.d0f1dep+2
+-0x1.657a4cp-3
+-0x1.408364p+2
+-0x1.01883ep+1
+0x1.fe29aap-4
+0x1.924d0ap+0
+-0x1.5d1a3cp-2
+0x1.c7d03cp+2
+0x1.d03b78p+2
+0x1.0b450ep+0
+-0x1.e230c4p+1
+-0x1.baa6ep-1
+0x1.75c21ep+2
+0x1.30bcbcp+0
+-0x1.8f395cp+2
+0x1.d0c2aep+2
+-0x1.64f59ap-3
+-0x1.ea3c2ap+1
+-0x1.0506c6p+2
+0x1.67c7fp-2
+0x1.1b8feep+2
+-0x1.1b0498p+3
+0x1.451682p+3
+0x1.76a29p-1
+-0x1.2162d4p+4
+-0x1.7e93c8p-4
+-0x1.afffd6p+2
+0x1.f2p-7
+-0x1.8c62bep+5
+0x1.effbep+2
+0x1.d1b852p+2
+0x1.5cdbd2p+0
+0x1.c06b2p-1
+-0x1.b33b84p-2
+0x1.71d7c2p+0
+-0x1.64c27ap-3
+-0x1.3ea13cp+3
+-0x1.7d82b2p+2
+0x1.aa6d0cp+2
+-0x1.ed7f5p-4
+-0x1.e8264ep+2
+-0x1.ae1c56p+2
+-0x1.7abe24p+2
+0x1.4236f4p+3
+-0x1.c2268cp-2
+0x1.6114aep+1
+-0x1.60f716p-3
+-0x1.09918ap+0
+0x1.1c06a4p+0
+0x1.860c26p-2
+0x1.c42886p+3
+-0x1.3447aep-5
+-0x1.db094cp+3
+-0x1.6dcbep+2
+-0x1.4ec2dep-2
+0x1.45b736p+3
+0x1.3ff3dp-1
+-0x1.bcfd2ap+2
+-0x1.8854acp+2
+-0x1.a0ff42p+0
+0x1.04fab8p-1
+-0x1.30bp-2
+0x1.407192p+3
+-0x1.79ac6ap+2
+0x1.2277cap-1
+0x1.35f784p+3
+-0x1.35df54p+2
+-0x1.610686p-3
+-0x1.64178ep-3
+-0x1.65b712p-3
+0x1.10795cp+0
+0x1.8ab654p+2
+0x1.37e6dcp+3
+0x1.4375bep+3
+0x1.98562p+2
+0x1.e2c1a8p+2
+0x1.53f1ecp-1
+-0x1.0c4b76p+1
+-0x1.54a9ep+2
+0x1.84b444p+3
+0x1.a738a4p+0
+0x1.95b5e4p+2
+-0x1.eda14p+1
+0x1.9f4bb6p+2
+0x1.ff370ap-1
+0x1.443dbcp+3
+0x1.7780ccp-1
+-0x1.968c9ap+1
+0x1.6612fap+2
+0x1.7b6bdep+2
+-0x1.5b9b7cp-3
+0x1.8679b8p-1
+0x1.456d38p+3
+-0x1.b3db5cp-1
+0x1.9c6b3cp+1
+0x1.96479cp+0
+-0x1.814ec8p+2
+-0x1.6dcb18p+2
+0x1.110848p-2
+-0x1.1f7ffp+1
+-0x1.e60428p+1
+0x1.6bea2ep+1
+0x1.21c3d4p-1
+-0x1.d0723ap+2
+-0x1.2b0ccap-1
+-0x1.ed681cp+1
+0x1.5423d6p-4
+0x1.43c694p+1
+0x1.335p+0
+-0x1.551ee4p-3
+-0x1.7961eep+2
+-0x1.10339cp+2
+0x1.62a75ep-4
+0x1.d3e368p+2
+-0x1.c5a18ep+1
+-0x1.2da37ep+6
+0x1.9fd6ep+0
+-0x1.617842p+2
+0x1.7ceeb8p-3
+0x1.c1b256p-1
+-0x1.04dbfp+5
+-0x1.c276c6p+0
+-0x1.667c36p+2
+-0x1.700c48p+2
+0x1.0174ecp+0
+-0x1.e1e5f8p-1
+0x1.e5b97p+2
+0x1.797d68p+2
+-0x1.2b722ap+0
+-0x1.143b4ap+3
+0x1.437d6ep+3
+0x1.942202p-4
+-0x1.06013ep+1
+-0x1.e739p+2
+0x1.369ddap+3
+-0x1.6f15eap+2
+0x1.231e36p+2
+-0x1.f77b84p+0
+-0x1.68ed1ep+0
+-0x1.84c91ap+4
+-0x1.e6819cp-2
+0x1.a0c1e6p+2
+-0x1.80a3ecp+0
+0x1.ce8948p-2
+-0x1.e6dc46p+1
+0x1.bbde32p-5
+0x1.0ef40cp+2
+-0x1.5f668p-1
+-0x1.99b3a4p+2
+0x1.497064p+3
+-0x1.96d5f6p+2
+-0x1.2db79p-5
+-0x1.5b661ep-3
+0x1.5f1226p+2
+0x1.cd7992p+2
+-0x1.5c4c9ep+2
+0x1.860548p+0
+0x1.3d40ep+3
+0x1.1e676ep+2
+0x1.7a52e6p-2
+-0x1.5ecea6p+0
+0x1.53567ap+2
+-0x1.78bf34p-1
+0x1.430f92p+3
+-0x1.26b57p-2
+-0x1.81b49p+2
+-0x1.7949ep+0
+-0x1.58403ep-3
+0x1.941b48p+0
+-0x1.508df4p+2
+0x1.99ca4ap-2
+-0x1.944b84p-3
+0x1.36bb82p+3
+0x1.2b7daep+0
+-0x1.3b6ed8p+2
+0x1.18abep-2
+-0x1.f359d6p+0
+-0x1.8d59fep-2
+0x1.175bd4p-1
+-0x1.7bb492p+2
+-0x1.6c687ap+0
+-0x1.6551b2p-3
+-0x1.1077aep-2
+-0x1.23a6d6p+1
+-0x1.7c9692p+2
+-0x1.649712p-3
+0x1.71726ap+1
+-0x1.10ac4ep+3
+0x1.3a74a6p+0
+0x1.6e98a4p-1
+0x1.b7dc68p-2
+-0x1.c34fbep+1
+-0x1.9b2efap+2
+0x1.64fc28p+1
+-0x1.08275ep+0
+-0x1.90b768p+1
+-0x1.04687ap+0
+0x1.022a3ep-2
+0x1.31d856p+2
+-0x1.1916a6p+2
+-0x1.071b6p+5
+0x1.580aeep+2
+-0x1.0e753ep+1
+0x1.6d8e6ep+0
+0x1.afc04p+2
+-0x1.0c5c88p+2
+-0x1.0b0094p+2
+-0x1.a9374cp+2
+-0x1.389e9ap-4
+-0x1.9e1a66p+0
+0x1.2917a4p+2
+0x1.4516a4p+0
+-0x1.58d6d2p-3
+-0x1.8d3282p-1
+0x1.9ce2acp+3
+0x1.75f332p-1
+0x1.ab3d0ap+0
+-0x1.75513ep+3
+0x1.b4056ap+1
+0x1.accf0ap+0
+-0x1.648446p-3
+0x1.b6284ap+2
+0x1.0a73e6p+3
+-0x1.8f931ep+0
+-0x1.653ab4p-3
+-0x1.a07646p+2
+-0x1.838fcep+2
+-0x1.1fcca4p-1
+0x1.3f8acp+3
+-0x1.e72a6p+2
+0x1.53451ep-3
+-0x1.21bf8p-1
+0x1.477cccp+0
+-0x1.1f2f32p-1
+0x1.65303cp+0
+0x1.43e608p+3
+-0x1.c06e3cp+0
+0x1.b3408ep+0
+-0x1.5b09dp-2
+-0x1.2f482ep+2
+-0x1.358416p+2
+-0x1.d2b2ap+2
+-0x1.1883d6p+2
+0x1.d2229cp+2
+-0x1.35c1a2p+1
+-0x1.8bb666p+3
+-0x1.1d2eb6p+3
+-0x1.600dp-3
+-0x1.1c721p+3
+-0x1.644118p+2
+0x1.9f08ap+2
+0x1.8c13d4p+2
+0x1.35c95p+3
+0x1.80d7cap+2
+-0x1.58caa4p-2
+0x1.4628p-2
+-0x1.27d56ep+0
+0x1.380e6cp+3
+0x1.8539aap+2
+-0x1.56efep+1
+-0x1.ef1648p-1
+-0x1.8549eep+2
+0x1.155e12p+4
+-0x1.53d3bap-3
+-0x1.9c7e88p+2
+0x1.d688fcp+2
+-0x1.54807ep-3
+-0x1.7436b8p-2
+0x1.6ca666p-1
+-0x1.6c77b6p-1
+0x1.37fa42p+3
+-0x1.98f9eep+1
+0x1.1b44p+0
+-0x1.3277eep-1
+0x1.0da99ap-2
+0x1.9c6892p+2
+-0x1.c47754p+2
+0x1.a31352p-4
+0x1.71f8p-1
+-0x1.22ff28p+1
+0x1.374108p+3
+0x1.b5cd8ap+1
+-0x1.5b3f32p-3
+-0x1.56193ap-3
+-0x1.2fdd8ap+4
+-0x1.5956b2p+2
+-0x1.772006p+1
+-0x1.5a291cp-3
+0x1.2124fcp+2
+0x1.d378fp+2
+0x1.76b3f4p-3
+0x1.00387ap+0
+-0x1.362686p+2
+0x1.451ba6p+3
+-0x1.066914p+1
+0x1.213ddap+0
+-0x1.6f10d2p+2
+-0x1.ecab64p-6
+0x1.b96d0cp+2
+-0x1.63cd96p-3
+0x1.366b4cp+1
+0x1.31a756p+0
+-0x1.c721c6p-5
+-0x1.6ed70ap-6
+0x1.24ab92p-3
+-0x1.47a3aep-1
+0x1.950d6p+2
+-0x1.57ffb6p-3
+0x1.c9c3aep+0
+0x1.d7bf4p+2
+-0x1.2814f6p+0
+-0x1.60f6cep-3
+-0x1.62a2fep-3
+0x1.d818ccp-1
+0x1.76c47ap-3
+-0x1.5b8674p+2
+-0x1.d5f9dep+2
+0x1.620a42p+2
+0x1.b6d2d6p+2
+-0x1.4b037p+0
+-0x1.a0735cp-1
+-0x1.272cf6p-1
+-0x1.14c35cp-1
+-0x1.d9620ap-1
+0x1.f2921p-1
+0x1.7784f6p+1
+0x1.ba38f6p-3
+-0x1.cecfdep+2
+-0x1.13b832p-5
+0x1.d4f442p+2
+0x1.b36cap+2
+0x1.500062p-1
+-0x1.04dc5cp+1
+-0x1.5e9754p+2
+-0x1.b961p-6
+-0x1.cfcfe6p+1
+0x1.650866p+0
+-0x1.545418p+3
+-0x1.115a7ap+0
+-0x1.99b554p+2
+-0x1.ea403p-2
+-0x1.6183a2p-2
+0x1.919b5ap+2
+-0x1.5afc4ap-3
+0x1.ea9146p-2
+-0x1.00c81ep+1
+-0x1.4aa03ep+2
+0x1.878edp-3
+0x1.18dadap-4
+0x1.60d8bcp+1
+0x1.e9192cp-1
+0x1.797b0ap+0
+0x1.1dafa4p+0
+-0x1.98f70ap-1
+0x1.ae13c2p+2
+-0x1.c9ffd6p-4
+0x1.3cd90ap+0
+-0x1.5638cep-3
+0x1.448b38p+3
+0x1.b5f5e4p+2
+-0x1.27e222p+2
+0x1.42a508p+3
+-0x1.9a6a7p+2
+0x1.36cbc2p+3
+0x1.e9676p+1
+0x1.95abdep+2
+-0x1.666aep+0
+-0x1.d48214p+0
+0x1.d7d86ap+1
+0x1.78e714p+1
+0x1.a4161ep-2
+-0x1.34e68ep-1
+0x1.d5450cp+2
+0x1.7e3dc2p-2
+-0x1.92407ap+2
+0x1.4418b4p+3
+-0x1.763d3p+3
+-0x1.116978p+3
+0x1.9018aep+2
+-0x1.80c9bep-2
+0x1.5bec14p+0
+-0x1.7ccf84p+0
+0x1.44e018p+3
+-0x1.279b7p+2
+-0x1.2d08ap-1
+0x1.bb4d8ep+1
+0x1.be100ep-1
+-0x1.5c1c3ap-3
+0x1.4bf624p+2
+0x1.adaa76p+2
+-0x1.5cd68ep+0
+-0x1.3185fp+2
+0x1.3dee18p-4
+-0x1.e395f8p-1
+-0x1.e8528ap+2
+-0x1.5b326ap+2
+0x1.35bcbcp+3
+-0x1.0802cp+5
+0x1.fdab84p-2
+-0x1.158152p-1
+-0x1.5140c6p+3
+0x1.14f5c2p+1
+-0x1.a6f156p-1
+-0x1.63d8b2p-3
+-0x1.228ec4p+2
+0x1.51173p-1
+-0x1.c2abeep+2
+-0x1.5f6792p+2
+-0x1.88bfc2p+2
+0x1.4a6decp+0
+0x1.d0a6cp+2
+-0x1.c10dccp+1
+-0x1.60b94p+5
+-0x1.3f78eep+3
+0x1.f1b1ep+1
+-0x1.404326p+2
+0x1.9c6bd6p-2
+0x1.4e963cp-4
+0x1.1d26b4p+2
+-0x1.37d952p+2
+0x1.7eee38p+3
+0x1.c5392ep+2
+0x1.9128ap+2
+0x1.9c8fd6p+2
+0x1.be43d6p-2
+-0x1.57f9e2p-4
+0x1.434bacp+3
+0x1.2d0f2cp-1
+-0x1.ba23aap+1
+0x1.3ae01cp+3
+-0x1.95778ap+2
+-0x1.c65b3cp+1
+0x1.23ae7ap+1
+-0x1.23d308p+2
+-0x1.ba5c3cp+0
+-0x1.d07b0ep-3
+0x1.504052p-2
+0x1.5e1a46p+0
+0x1.95dd28p+2
+0x1.897f68p+2
+-0x1.56811ep+0
+0x1.9b504p+2
+0x1.034f02p+4
+-0x1.6a872ap+0
+0x1.eb077ap+2
+-0x1.6b6004p+0
+0x1.71ec28p-1
+0x1.00a18ap+2
+0x1.a65932p+0
+0x1.f27e3cp+2
+-0x1.683308p+0
+-0x1.6de68ap+0
+-0x1.f15cbap+2
+-0x1.2390c2p+2
+0x1.eeaa42p+2
+-0x1.feccb4p+0
+-0x1.234018p+4
+-0x1.ffb332p+0
+-0x1.8fbd1ep-1
+-0x1.2666b8p-1
+0x1.10c816p+3
+-0x1.7fd956p-2
+-0x1.073c3ap+3
+-0x1.63a47cp+1
+0x1.814d1ep-2
+0x1.65d55ap-1
+-0x1.64c9b4p-3
+0x1.d9562ap+2
+-0x1.60f91cp-3
+-0x1.650866p-3
+0x1.48178cp+3
+0x1.e0d776p+2
+-0x1.6f9418p+1
+-0x1.1bf3ecp+0
+0x1.f4717p-1
+0x1.c791f6p+2
+-0x1.525c08p-1
+-0x1.62d062p-3
+-0x1.eb511ep-2
+-0x1.09cd3cp+0
+0x1.3e45ap+3
+0x1.301802p-1
+-0x1.39bbdap+2
+-0x1.c82196p+2
+-0x1.303b3ap+4
+0x1.8f4b08p+2
+0x1.035eeep-2
+-0x1.5fe326p-3
+0x1.04028ep-5
+0x1.d3fafcp+2
+0x1.42ba5ap-1
+-0x1.cdeb2ep+0
+-0x1.7500a8p+2
+0x1.7dbbbcp+0
+-0x1.f4eb86p+2
+0x1.7c47aep-6
+0x1.75b67p-2
+0x1.8d873ap+2
+0x1.5bccacp+0
+-0x1.e151a8p+0
+-0x1.51474ep-2
+0x1.c0ea9ep+2
+-0x1.a23e0ep+2
+-0x1.011accp+0
+-0x1.dde764p+4
+-0x1.da003cp+0
+-0x1.b005c2p-4
+0x1.43b4aep+3
+0x1.869f5cp+1
+-0x1.f8e706p+0
+-0x1.55077ap+1
+-0x1.136deap+2
+-0x1.0376a6p+3
+0x1.f668f6p-3
+0x1.17f31ep+0
+0x1.ab83d8p-1
+-0x1.534404p+4
+-0x1.63de7cp-3
+-0x1.1cfap+0
+0x1.576bd6p+0
+-0x1.4463a4p+2
+-0x1.65a27cp-3
+0x1.b13052p-2
+0x1.d483a4p+2
+-0x1.02d042p+1
+-0x1.60fa9cp-3
+-0x1.16e87ap-1
+0x1.b492b8p+0
+-0x1.a4cf6ep+2
+0x1.19af4cp+1
+0x1.7e8bc2p+2
+-0x1.29775p+1
+-0x1.4cccccp+1
+0x1.167266p+0
+-0x1.647cccp+1
+0x1.1debfap+1
+-0x1.4e9166p-3
+0x1.87c92ap+0
+-0x1.3ea13cp+3
+0x1.8976ccp+0
+0x1.6c7384p+0
+-0x1.5b557cp-3
+-0x1.30c126p+1
+-0x1.639d72p-3
+-0x1.4c44ap+2
+-0x1.6ea332p+1
+0x1.8e982ap+2
+-0x1.81006p+2
+0x1.1d4be4p+4
+-0x1.ec89fcp-1
+-0x1.503f1ap+2
+0x1.e57e76p+2
+-0x1.5ddcaap-1
+0x1.439434p+3
+-0x1.4a897ap+2
+-0x1.939222p+2
+-0x1.3da46cp-4
+-0x1.58bf08p+2
+-0x1.3eaadep+3
+-0x1.aab2eep+2
+-0x1.7c5af6p-1
+0x1.bf4fccp+2
+0x1.10cd1ep+3
+0x1.fa0198p-1
+-0x1.ca7dc2p-4
+0x1.894544p+2
+0x1.442d5ep+3
+0x1.371242p+3
+-0x1.95fba6p-1
+0x1.d1a67p+2
+0x1.769918p+0
+0x1.4e61c2p-1
+-0x1.57c1ep+1
+-0x1.d74902p+0
+-0x1.3ea13cp+3
+-0x1.851e32p+2
+0x1.247602p+2
+0x1.3f0314p+1
+-0x1.637aep-2
+0x1.41b1fap+3
+-0x1.04efc6p-3
+-0x1.88130cp+2
+-0x1.b2a146p+2
+0x1.54bb5ep+3
+-0x1.a06ap+0
+-0x1.569e66p+0
+0x1.2a59a8p+4
+-0x1.6105fap-3
+-0x1.82a98cp+1
+0x1.a428f2p+2
+-0x1.8bb3eap+0
+-0x1.627f62p-3
+0x1.b0f5c2p-9
+-0x1.469442p+1
+0x1.4507e8p+3
+-0x1.86afacp+2
+0x1.da41f8p+2
+-0x1.eece8ep-1
+-0x1.03cddp+1
+-0x1.225768p+4
+-0x1.51a33ap+2
+0x1.24c926p+0
+0x1.7b8ad4p+2
+-0x1.17bebcp-2
+0x1.ac0e14p-3
+-0x1.82f9f6p+2
+-0x1.5e5b3p-1
+-0x1.805ffcp+2
+-0x1.600742p-3
+-0x1.887c68p-3
+-0x1.615aacp-3
+-0x1.7ba8fep+4
+0x1.f6370ap-4
+-0x1.e06b9p+2
+-0x1.5fbfb2p-3
+0x1.aaa50ep+2
+-0x1.8176fep+2
+0x1.5ce1d2p+0
+0x1.b23e64p-1
+-0x1.aea0ep+0
+-0x1.26c00cp+2
+-0x1.5a23bap+2
+-0x1.55a02ep-3
+0x1.350bap+3
+-0x1.9b4ec6p+1
+0x1.e0a52ep+2
+-0x1.74fe26p+2
+-0x1.1d92c2p+1
+-0x1.5da7d6p-1
+-0x1.312282p+1
+-0x1.62c91cp-3
+-0x1.c173f8p-1
+-0x1.9f0316p-1
+-0x1.4ba776p+2
+0x1.cb445ep+2
+-0x1.7efb5cp-1
+0x1.4595cap+3
+-0x1.5bcf12p-3
+0x1.c3b3d6p-3
+-0x1.cb85d8p-3
+-0x1.2824ccp-1
+-0x1.a35d68p+2
+-0x1.87e812p+2
+-0x1.68cfd6p-1
+-0x1.b44846p+2
+-0x1.4cb4d4p+2
+-0x1.058c1cp-2
+-0x1.600046p-3
+0x1.d80cb8p-2
+0x1.babe66p+0
+0x1.be9c56p+2
+0x1.016978p-2
+-0x1.a61fbp+2
+0x1.6bd5f6p+2
+-0x1.9e2b36p-2
+-0x1.936c78p+2
+-0x1.390932p+0
+-0x1.c978ccp+0
+0x1.4fbcccp-2
+-0x1.605154p-3
+0x1.00c70ap-2
+-0x1.65c06cp-3
+0x1.a6f552p+2
+0x1.0f98p-1
+-0x1.a673c6p+1
+0x1.36420ap+3
+0x1.20469p+2
+0x1.da8c28p-1
+-0x1.451f4ep+2
+-0x1.c56adcp+2
+0x1.c57f32p+0
+-0x1.12477p-1
+-0x1.3aa0aap-6
+0x1.c60c24p+1
+-0x1.6476acp-3
+-0x1.6bbc9cp+2
+-0x1.7e46b6p+1
+-0x1.fae904p-3
+0x1.b9451ep-4
+0x1.4a5348p+0
+0x1.aa0cp-1
+-0x1.7b5694p+2
+-0x1.59cb04p+2
+0x1.47eaf2p+3
+-0x1.61696cp-3
+0x1.3b5cep+0
+0x1.30facp+0
+-0x1.7dfp-2
+0x1.aefcfap+1
+0x1.e5ae7cp+2
+-0x1.9920aap+1
+-0x1.410848p+1
+0x1.7aa234p+1
+0x1.5fe74cp+2
+-0x1.07b5aep+0
+0x1.8d2e4p-1
+-0x1.5dc9bap-3
+0x1.4edc32p-5
+-0x1.5a747ap-4
+-0x1.551516p-3
+0x1.427c36p+3
+0x1.d5762p+2
+-0x1.a94422p+0
+0x1.2813dp+0
+-0x1.0aececp+2
+0x1.430af8p+3
+0x1.704334p+0
+-0x1.6180ecp-3
+0x1.9878cep+2
+-0x1.5c8532p-3
+-0x1.a0f696p+2
+-0x1.63c81cp-3
+0x1.5c9ccep+2
+0x1.d0b332p+0
+0x1.dd02fp+2
+0x1.30824ap-4
+0x1.f0ce3cp-1
+0x1.375f9cp+3
+-0x1.1b636cp+4
+-0x1.c607ap+2
+0x1.93b6f6p+0
+-0x1.640b8ap-3
+-0x1.ac8748p+0
+-0x1.148e5ep+2
+-0x1.60dfdep-3
+-0x1.61688cp-3
+-0x1.a87362p+2
+-0x1.5d02d8p+3
+-0x1.3692eep-1
+0x1.ece852p-3
+-0x1.01c6ep+0
+0x1.be7a58p+2
+-0x1.365372p-3
+0x1.7dd0d4p-1
+0x1.94f6ep+0
+0x1.df5e8ap+2
+-0x1.28cdf2p+0
+-0x1.6547d2p-3
+-0x1.cbe236p-4
+-0x1.23dffep+1
+-0x1.2b9e4ep+2
+0x1.28ff22p+0
+-0x1.5f1b8ep-3
+-0x1.af4f5cp-2
+-0x1.261c7cp+2
+-0x1.940248p+0
+-0x1.aa31eap-1
+-0x1.17841ep+0
+-0x1.a15b06p+1
+0x1.852a0ap+2
+-0x1.1d74a4p-1
+0x1.3d8912p+3
+0x1.def324p+2
+0x1.3ba8eep+0
+-0x1.5fbb8ep+0
+0x1.55f48ep-2
+-0x1.d12e1p+1
+-0x1.591d24p-3
+-0x1.f08bbcp-1
+-0x1.d5aadp+2
+0x1.d7b94p+2
+0x1.4215ecp+3
+-0x1.531ac8p+3
+-0x1.785704p+2
+0x1.cab5d6p+2
+0x1.48437ap+3
+0x1.fd2b46p-5
+-0x1.640bfep-3
+0x1.44d448p+0
+-0x1.4bfd76p-1
+0x1.49063p+3
+-0x1.74b3a8p+3
+0x1.7f4ca8p+1
+0x1.55a30ep+1
+0x1.2fc866p+0
+-0x1.80e5eap+0
+-0x1.2e49e2p+4
+-0x1.89d538p+1
+0x1.8012b8p+0
+-0x1.651586p-3
+-0x1.82af5cp+2
+0x1.f1b0a4p-1
+0x1.28e914p+1
+-0x1.e08a7ap+0
+0x1.10c9f4p+3
+-0x1.64dbbcp-3
+0x1.cfceb8p+2
+-0x1.64e71ep+2
+0x1.01c214p-1
+-0x1.0cee7ap+2
+0x1.66bb84p-2
+-0x1.47ba7ap+5
+0x1.ccb8e8p+2
+0x1.d34b7cp+2
+0x1.5828p+0
+-0x1.9bf8c6p+2
+-0x1.270aacp+2
+0x1.445e38p+3
+-0x1.c2af3p+2
+0x1.73bcd6p-1
+-0x1.5d3f7ap-3
+-0x1.54c33ep+3
+0x1.b0f92ep+2
+0x1.54694ap+2
+0x1.365b8ep-1
+0x1.81712ep+1
+-0x1.64de44p-3
+0x1.8b28f6p-2
+0x1.e79ceap+2
+-0x1.790c14p+2
+-0x1.0e76b8p+5
+-0x1.7afc7p+2
+0x1.bb846ep+2
+-0x1.b1403cp+1
+-0x1.86fe4cp+2
+0x1.05ff34p+4
+-0x1.861eb8p+0
+0x1.6ee384p+0
+-0x1.1d674cp-1
+0x1.27cee8p-3
+0x1.203dfcp+1
+-0x1.94085p+1
+-0x1.62fdf6p-3
+-0x1.259494p+4
+0x1.e7b2bap+2
+-0x1.7ea7bcp-3
+-0x1.3ea13cp+3
+-0x1.287842p+2
+-0x1.ab0f56p+2
+0x1.d4ab54p+2
+0x1.99c332p-3
+0x1.2739aep+0
+0x1.10cda8p+3
+0x1.8c677p-1
+0x1.792b74p-1
+0x1.be6c56p+2
+-0x1.003724p+2
+0x1.ef91eap-3
+-0x1.5fec66p+0
+-0x1.3f348cp+2
+0x1.899daep+0
+-0x1.324956p+2
+0x1.e44ee4p+2
+-0x1.597012p-3
+0x1.2af992p+0
+-0x1.7569c8p+1
+0x1.af3934p-4
+0x1.808d1ep+0
+-0x1.8d45e4p+2
+0x1.463158p+3
+0x1.3adp+0
+0x1.ecdf32p+2
+0x1.2aad9ap-3
+-0x1.d803ecp-2
+0x1.f03244p+2
+0x1.9dc15cp+2
+-0x1.b4c5cap-6
+-0x1.659e44p-3
+-0x1.798c8ap+1
+0x1.c8d80ep+2
+-0x1.47ae14p-6
+-0x1.1e8216p+2
+-0x1.5d407ep-3
+0x1.13ee36p+2
+-0x1.61244cp-3
+-0x1.f2d01ep+1
+-0x1.53e61ep-3
+-0x1.1239ccp+1
+-0x1.8d8168p+2
+-0x1.585ed8p+2
+-0x1.916e16p+1
+0x1.a99198p-1
+-0x1.936488p-1
+0x1.424e58p+3
+0x1.5e15c2p-1
+-0x1.614486p-3
+-0x1.a5a616p+2
+0x1.3ef362p+3
+-0x1.0dbee4p-4
+0x1.03b99ap-2
+-0x1.910a68p+3
+-0x1.2fbfc2p+0
+-0x1.59f8eap-3
+0x1.7cec24p+1
+0x1.1c27c2p+0
+-0x1.de5f06p+2
+0x1.7621c2p+0
+-0x1.98de22p+1
+-0x1.1f41d2p+1
+0x1.adddaap+2
+0x1.784fd8p-1
+-0x1.5f00f2p+2
+0x1.48dfc2p-1
+0x1.7e3b1ep+0
+0x1.8bc666p-3
+0x1.37d0e2p-1
+0x1.157c74p+2
+0x1.6ff89ep+0
+0x1.165ffep+0
+0x1.d7529ep+2
+0x1.44055ap+3
+-0x1.6576e4p-3
+0x1.b5bdc2p-2
+-0x1.86a71p+2
+-0x1.e0bb9ap+1
+-0x1.3efb4ep+3
+0x1.465b4ap+3
+0x1.69ccccp-2
+0x1.fa8332p+0
+0x1.4f36aep-3
+0x1.901bdcp+2
+-0x1.93f8dap+1
+-0x1.c6d308p-1
+-0x1.8ab1e6p+2
+0x1.3a40b8p+3
+-0x1.347ff6p+1
+-0x1.ab55b8p-3
+0x1.2b15d2p+2
+-0x1.78cb5p+2
+-0x1.44fd58p+1
+0x1.8874ccp+2
+-0x1.95c6eap+2
+0x1.6a9ad6p+2
+0x1.5ac8p-2
+-0x1.a31878p+1
+-0x1.61f5eep-2
+0x1.daa598p+2
+-0x1.99370ap-1
+0x1.8d1328p+2
+-0x1.717428p-6
+0x1.a4ac26p-1
+-0x1.a8341ap+4
+-0x1.3d9104p+2
+-0x1.3461e8p+4
+0x1.af6bd4p+2
+0x1.ad2e52p+2
+-0x1.5eb886p-3
+0x1.4cc9c2p-1
+0x1.363ce2p+3
+0x1.cac2d4p+2
+-0x1.64c11ap-3
+-0x1.5bb654p-3
+0x1.9cd41ep+2
+0x1.a0c9fep-1
+0x1.0f9018p-4
+-0x1.669748p+0
+0x1.b1023cp+1
+0x1.d9e51ep-3
+-0x1.860c04p+2
+-0x1.004e04p+0
+0x1.606e3cp+0
+-0x1.3d5198p+2
+0x1.e50c02p+3
+0x1.175666p-2
+-0x1.15400ap+1
+0x1.d3df72p+2
+0x1.8474f6p+2
+-0x1.7beef6p-1
+-0x1.234dfcp+1
+0x1.a31fap+2
+0x1.371dd2p+3
+0x1.49ae1ap+1
+0x1.09183cp+0
+-0x1.9943fep+2
+-0x1.65ae36p-3
+-0x1.3f64f6p+2
+0x1.a9d88cp-1
+-0x1.108da4p+1
+0x1.239b84p-1
+-0x1.7a3fcap+1
+0x1.2fb65cp-3
+-0x1.c22adp-1
+-0x1.4e4a96p+2
+-0x1.b97532p-2
+0x1.6a1b84p-1
+-0x1.4acc7ep+2
+0x1.597faep-2
+-0x1.29e666p-4
+-0x1.92f968p+2
+0x1.b5bcbcp+2
+0x1.d44a0ap+2
+-0x1.118962p+0
+-0x1.0963fcp-1
+0x1.b49e72p+2
+0x1.479932p+3
+-0x1.96ebb8p+2
+-0x1.17fd5ap+2
+-0x1.30bf5cp-3
+0x1.458e58p+3
+0x1.36d3dap+3
+0x1.498cc4p+0
+0x1.a51dp+2
+-0x1.76eaep-2
+0x1.a92b5cp-1
+0x1.1cb5c8p+1
+0x1.f116dap-1
+-0x1.2fefa4p+1
+0x1.895384p-1
+0x1.3ea70ap-1
+0x1.4e5bc2p+0
+-0x1.5d3056p-3
+0x1.6e4f32p+1
+0x1.a0cb4ap+2
+0x1.3e9daep+0
+-0x1.610884p-3
+-0x1.e575c2p-4
+-0x1.4aa4e4p+3
+0x1.6b2384p-1
+0x1.10ccccp+3
+0x1.287d32p+0
+0x1.3ecp-2
+-0x1.ac3126p+2
+-0x1.375428p-2
+0x1.dd5e32p+2
+-0x1.3cc38cp+5
+-0x1.63b394p-3
+-0x1.36dd2ap+0
+-0x1.abaca4p-1
+0x1.9a4998p-3
+0x1.a8322ep+1
+0x1.495ba8p+2
+-0x1.2b1d96p+2
+0x1.3cb612p+3
+0x1.3b0bacp+2
+-0x1.24da3ep+2
+0x1.b4cc52p-1
+-0x1.7231e6p+2
+0x1.68579ap+0
+0x1.98b34p+2
+0x1.b0f174p+2
+-0x1.19633p+1
+0x1.4e8p-5
+0x1.c0b04cp+2
+0x1.3707a8p+3
+-0x1.0e597ap+2
+-0x1.cedcfep+4
+-0x1.086438p+3
+-0x1.a9c966p+1
+-0x1.74d70ap-7
+-0x1.641bbap-3
+0x1.bbba02p+2
+-0x1.348cccp-3
+-0x1.660e72p-3
+0x1.ace148p-4
+-0x1.21da26p+0
+0x1.46698ap+0
+-0x1.1153b6p+0
+-0x1.785416p+2
+-0x1.fa611ep-1
+-0x1.f9b342p-10
+0x1.bc4b08p+2
+-0x1.5b84eep-3
+0x1.47768p+1
+0x1.4c15c2p+0
+-0x1.c77e56p+0
+0x1.7d241ep+1
+0x1.ae9d56p+1
+0x1.969368p+2
+-0x1.cae3fp+0
+0x1.dd0f7ap+2
+-0x1.60cbbcp-3
+0x1.e8d8bap+2
+-0x1.994098p+0
+-0x1.4fca34p+3
+0x1.c4a67ap+2
+0x1.7d00ap+2
+-0x1.c32c1p+2
+-0x1.8632b6p+2
+0x1.b1f5cep+2
+-0x1.97022ep+4
+-0x1.55a7ep+3
+-0x1.d4fa1ep+2
+0x1.5fff5cp-3
+0x1.c1ca3ep-6
+0x1.8f307ap-1
+-0x1.43319ap-1
+-0x1.ab6e94p-1
+-0x1.a640ap-2
+0x1.44e4e4p+3
+-0x1.d568c8p+3
+0x1.2f5ba6p+2
+0x1.4371b2p+3
+-0x1.63de96p-3
+0x1.674f7ep+0
+0x1.899e56p+2
+-0x1.493136p+0
+-0x1.be2b2ep+1
+-0x1.01d56ap+2
+-0x1.3d4ddp+5
+0x1.479bf6p+3
+-0x1.67a02ep-1
+0x1.b4265cp+2
+-0x1.07d2a4p+1
+-0x1.85bb08p+2
+0x1.d3d95cp+2
+-0x1.6fd80cp+2
+-0x1.141ed8p+0
+-0x1.5e4264p-3
+0x1.3ff1fp+2
+0x1.3f5e2ap+1
+-0x1.683c8ap+2
+0x1.456ad2p+1
+-0x1.203312p+2
+-0x1.63533ap-3
+-0x1.554ceap+2
+-0x1.506d48p+2
+0x1.f2cap-1
+0x1.432124p+3
+-0x1.6905d4p+2
+0x1.a13008p+2
+-0x1.61007cp-3
+-0x1.80ada8p+2
+-0x1.2b5e12p+2
+0x1.0c38c6p-2
+0x1.6bb408p+2
+0x1.ee99c2p-1
+0x1.3c9f7cp+0
+-0x1.ca076p+4
+-0x1.b9fd7p-2
+0x1.d3c47ap-1
+-0x1.2dadfp+2
+-0x1.1f362p-4
+0x1.6923dep+2
+0x1.be923ap+2
+-0x1.6cb73ep+2
+-0x1.565dd6p-3
+0x1.0d65ecp+0
+0x1.8e8a76p+2
+-0x1.9f02cep-4
+0x1.43d63ep-1
+0x1.36302cp+3
+-0x1.0e3a4ep+1
+-0x1.9a6fdap+2
+-0x1.5ac962p-3
+-0x1.2531c6p+1
+-0x1.7803f8p+2
+-0x1.527bccp-2
+0x1.7c4c54p+2
+0x1.3e060ep+2
+-0x1.6f1faep+1
+0x1.d71794p+2
+-0x1.4ef87cp+0
+0x1.34ebd6p-1
+-0x1.bcdef2p-11
+-0x1.7c89b4p+1
+0x1.1dde7ap+0
+0x1.070a4cp+2
+0x1.944982p+2
+-0x1.8fc20cp+2
+0x1.0a54d2p-4
+0x1.44068ap+1
+-0x1.3682ccp+1
+-0x1.6027b4p-3
+-0x1.56433cp-3
+-0x1.611a72p-3
+0x1.f3e98p-2
+0x1.d08a02p+2
+-0x1.3caae2p-6
+0x1.c20dbcp+2
+-0x1.018d48p-1
+-0x1.64ea72p+5
+-0x1.8cf15cp+1
+-0x1.7bd526p+2
+0x1.910532p+0
+0x1.876cccp-1
+0x1.6b878ap+2
+-0x1.631b5cp-3
+0x1.b00e48p+2
+-0x1.f2bbc8p+1
+-0x1.45803cp+1
+-0x1.5f5a66p-3
+-0x1.96ce1cp+2
+0x1.291652p+0
+-0x1.d34f3ap+0
+0x1.38998ep+0
+0x1.ada72p-1
+-0x1.237184p+0
+-0x1.20ab84p+2
+0x1.067852p-3
+0x1.3cac66p+0
+0x1.bccd8ep+2
+0x1.252d84p+0
+-0x1.32397ap+2
+0x1.35fc82p+3
+-0x1.70551ep-3
+-0x1.813478p+4
+0x1.3f75c4p+3
+0x1.3f7dd6p+3
+0x1.381c9ep+1
+-0x1.fd3b32p-2
+-0x1.2bb33cp-1
+0x1.de544ap+2
+0x1.772e6ap+0
+0x1.a7acfap+1
+-0x1.0615c6p+3
+0x1.5b0bbcp+2
+-0x1.9dd4a8p-2
+-0x1.9f4442p+1
+-0x1.d50b1ep+1
+-0x1.56bf4ap-3
+0x1.16945cp+1
+-0x1.5ff37ap-3
+-0x1.ffbccap+2
+-0x1.384d24p+1
+-0x1.b98b6cp+1
+0x1.3a1936p+2
+0x1.44faf8p+3
+0x1.50b852p-8
+-0x1.57888ep+2
+0x1.489e2ap+3
+0x1.7ef8eep-1
+-0x1.242e6ep-10
+0x1.b2a55cp+3
+0x1.c89c72p+2
+0x1.35d764p+3
+-0x1.9e46p+0
+-0x1.75e2f4p-3
+-0x1.5c53c6p-3
+-0x1.12715cp+0
+-0x1.d39724p+2
+-0x1.9a8eb8p+0
+0x1.e68af6p+2
+0x1.24099ep+1
+0x1.8bc658p-1
+0x1.a15c28p-7
+-0x1.6294e6p-3
+0x1.e64718p+2
+-0x1.88c804p+1
+-0x1.9198b6p+5
+-0x1.283048p-1
+0x1.ce516ap+2
+-0x1.2b3baep+1
+0x1.812d0cp+2
+0x1.7ba71cp-1
+0x1.47349p+0
+-0x1.0b8e48p+4
+-0x1.e6dfaep-2
+0x1.440fa2p+3
+-0x1.912c34p+2
+-0x1.4bee34p+2
+-0x1.ad47c8p-4
+0x1.35fa32p+3
+-0x1.8e0298p-1
+0x1.48aaf6p+3
+-0x1.0fe0d2p+0
+-0x1.18fef6p-2
+-0x1.e6b47ap+0
+0x1.ca98aep+2
+0x1.e2d266p-1
+-0x1.351f76p+0
+0x1.6d3c66p+2
+0x1.ffcb3ep+0
+-0x1.6d0c0cp+2
+-0x1.3c1c28p-5
+-0x1.c15cccp-3
+0x1.98650ap+0
+0x1.a6029ep+2
+-0x1.9379f8p-3
+0x1.3759e6p+3
+0x1.5fdf7p+0
+-0x1.6cc55ep+4
+-0x1.053ee8p+2
+0x1.4af0c8p+1
+0x1.47654p+3
+-0x1.2efceap-3
+0x1.35a8bcp+3
+-0x1.fc1d5ep-1
+-0x1.459dfp+0
+0x1.f8a8dep-1
+-0x1.a7f5c2p-5
+-0x1.9f3316p+1
+-0x1.1aefp+2
+0x1.36e29p+3
+0x1.11eb7p+0
+0x1.6532ep-1
+-0x1.26974ep+1
+0x1.acf71ep+1
+-0x1.0aa7d6p-5
+-0x1.9d2ad4p+0
+-0x1.394222p+4
+0x1.2d6428p+0
+-0x1.b3fe3p-6
+0x1.dbf61cp+2
+-0x1.61fb7cp-3
+-0x1.02cbep+1
+-0x1.3d3f54p+0
+-0x1.64d5bep-3
+-0x1.9a6666p-5
+-0x1.40a212p+4
+-0x1.846292p+2
+-0x1.257d9cp-1
+0x1.e20d2ep+2
+0x1.506cbap-1
+-0x1.9f6c8ap-1
+0x1.cb5852p-2
+0x1.dfede8p+2
+-0x1.df03d2p+1
+-0x1.44c584p+1
+-0x1.a3a42p+1
+-0x1.2d988ap+1
+-0x1.33a426p+4
+-0x1.654542p-3
+0x1.1e27bep+1
+0x1.3faddap+3
+-0x1.9066fp+1
+-0x1.5c72dap-3
+0x1.ac0814p+0
+0x1.46ebd6p-1
+-0x1.bc3a8ep+1
+0x1.3104p+0
+0x1.4c56fap+1
+-0x1.742226p+0
+-0x1.5c0486p-3
+0x1.6285ecp+0
+-0x1.c9b584p+0
+0x1.e5955cp-3
+-0x1.632452p-3
+0x1.5bee1ep+1
+0x1.3c2fb6p+3
+0x1.16c592p-2
+0x1.b295eap+2
+0x1.407dcap+3
+-0x1.767ef6p-1
+0x1.eaf332p-3
+-0x1.4c6c5p+2
+-0x1.637f32p+1
+-0x1.7f5e8ep-6
+-0x1.65b23ap-3
+-0x1.11900ap-1
+0x1.10cef4p+3
+0x1.d66a2ep+2
+-0x1.3900ccp+2
+0x1.b3f344p+2
+-0x1.148232p+1
+-0x1.3b252ep+2
+0x1.da34a6p+2
+-0x1.65a516p-3
+-0x1.5ab462p+5
+0x1.a73528p+2
+-0x1.52d4dcp-2
+-0x1.3f1bf4p+2
+0x1.3d109cp+3
+-0x1.e7b434p-3
+0x1.4a8e1ap+0
+-0x1.69edc2p-1
+0x1.ad5e14p+0
+0x1.366efp+3
+-0x1.f320ep+3
+-0x1.60c86ep-3
+-0x1.062e96p+1
+-0x1.a5e6b4p-1
+0x1.48c082p+3
+-0x1.54a50cp-1
+-0x1.1d0e38p+1
+-0x1.0d72cap-3
+-0x1.c7214cp+4
+0x1.cf20a8p+2
+-0x1.42b7ecp+1
+0x1.421b4p+3
+-0x1.9509aep+2
+-0x1.641eep+2
+0x1.37c6f4p+3
+-0x1.321a78p+2
+0x1.c01464p+2
+0x1.2ad612p+0
+-0x1.baaeb4p-5
+0x1.f1ba76p+1
+-0x1.16b9aep+0
+0x1.69f97p+0
+0x1.d7236ep+2
+-0x1.2655ecp+0
+-0x1.b6036p+2
+0x1.3bf742p+2
+0x1.3a2338p+3
+0x1.302f54p+2
+0x1.b783cep+2
+0x1.231e54p+2
+0x1.b9a226p+2
+0x1.3d6ec4p-4
+-0x1.6605fep+2
+-0x1.016e18p-15
+0x1.7fb554p+2
+0x1.bb8caep+2
+0x1.397678p+3
+-0x1.08edp+1
+0x1.e85b2ep+2
+-0x1.ba8f1ep+0
+-0x1.600bc2p-3
+0x1.4706b2p+2
+0x1.76e914p+1
+-0x1.d276ep-1
+-0x1.fb3c58p+1
+0x1.7fec7p+2
+-0x1.488bf6p+5
+0x1.3daea4p+0
+-0x1.babc8ep+2
+0x1.421582p+3
+0x1.3b2066p+1
+-0x1.ea428ep-3
+0x1.c4b67ap-5
+-0x1.4a9be6p+4
+0x1.076be8p-2
+0x1.979a26p+2
+0x1.3fcdcp+3
+0x1.3b8242p+3
+0x1.8d651ep-4
+0x1.b4919ap-2
+-0x1.1a234ep-1
+0x1.2fd148p-3
+0x1.42871cp+3
+0x1.97d77p+0
+-0x1.86b75cp-2
+0x1.9009a6p+2
+0x1.408e7ap+1
+-0x1.0fb01cp-7
+0x1.a2f7d2p+2
+-0x1.2cc04ap-5
+-0x1.69a5ap+1
+0x1.0bbc28p-2
+0x1.2e22a2p+0
+-0x1.88dc7ap-2
+0x1.7c0c2p+2
+-0x1.407b66p-2
+0x1.d9152p+2
+0x1.7002b4p+0
+0x1.758778p+2
+0x1.0dcfbap+2
+-0x1.7f44bp+2
+0x1.cd82p+2
+-0x1.feb61ap+2
+-0x1.1a4e4ep+2
+0x1.e4a6a4p+1
+-0x1.0b5fp+3
+0x1.799eccp+1
+-0x1.e3f07ap-1
+0x1.38249cp+3
+-0x1.bffb68p+1
+-0x1.082034p+2
+0x1.23fcd6p+1
+-0x1.c101eep+1
+-0x1.54d51ap-3
+0x1.767064p+2
+-0x1.9bc01ap-1
+-0x1.29edc6p+2
+-0x1.3877a4p+1
+-0x1.61a294p-3
+-0x1.bb793p+1
+0x1.7a649ep+1
+0x1.d2ed52p+2
+0x1.48241cp+3
+0x1.75e9c2p-2
+0x1.42bcc4p+3
+-0x1.cfdaaep+2
+-0x1.858b18p+4
+0x1.54595cp+0
+0x1.0b3c52p+0
+-0x1.d3180cp-1
+0x1.58da68p+2
+0x1.c6adp+1
+0x1.a98beep+2
+0x1.5c53b2p+1
+-0x1.89d0ccp-1
+-0x1.650562p-3
+0x1.193d82p-1
+0x1.5bca22p+3
+0x1.3a05bp+3
+0x1.161abcp+4
+-0x1.71d802p+2
+-0x1.02919ap+0
+0x1.dc4546p-1
+-0x1.f46284p+1
+-0x1.8e38cep-2
+-0x1.2b76d6p+1
+0x1.b21856p+2
+0x1.9c86e6p+2
+-0x1.64d776p-3
+-0x1.267618p+2
+-0x1.53a72ap+2
+0x1.dcabd6p-2
+0x1.d42ac6p+2
+0x1.45b8acp+3
+-0x1.5c0da8p-1
+-0x1.acc00ap+2
+0x1.da4a46p+2
+-0x1.64e686p-3
+-0x1.729f8p+5
+-0x1.194d9ap+3
+0x1.7e3eb8p+0
+-0x1.5ef7a2p-3
+0x1.e443b2p+1
+-0x1.7470dp+2
+-0x1.3f927p+1
+0x1.b096cp+2
+0x1.b6792ap+2
+-0x1.44742p+3
+0x1.492384p+3
+0x1.d3c576p-3
+-0x1.11ab9ap+0
+-0x1.e35b8cp-2
+0x1.de41f6p-1
+-0x1.2b6a16p-4
+0x1.2d4eb2p+0
+0x1.48aac8p+1
+0x1.4450cap+3
+0x1.35d076p+3
+0x1.a536cep-1
+0x1.735fbcp-1
+0x1.b2e3d2p-1
+0x1.775ab8p+2
+0x1.819c92p-2
+0x1.8f27cep+2
+0x1.bb9e3ap+2
+-0x1.4d9a94p+2
+0x1.d7bcd8p+2
+-0x1.1febecp+2
+0x1.4d60e2p+3
+-0x1.4b24d2p+3
+-0x1.49a54cp-2
+0x1.456e9ep+3
+0x1.49f47ap-1
+-0x1.63babep-4
+0x1.b15424p+2
+0x1.e115eap+2
+-0x1.513732p+3
+-0x1.35b7dep-2
+-0x1.1bd7a4p+2
+0x1.599a8ep+0
+0x1.ad84aap-2
+0x1.d976fcp+2
+-0x1.86e666p-1
+0x1.10cb48p+3
+0x1.1d27fep+2
+0x1.ea9446p+2
+0x1.acbc8p+2
+0x1.a6d17p+0
+-0x1.100aa2p-3
+-0x1.6dfbbep+5
+-0x1.5b177p+0
+0x1.9524f6p+0
+-0x1.5aa4fap+2
+0x1.6c782p+4
+0x1.af708ap+1
+0x1.cec838p+2
+0x1.089898p+0
+-0x1.63ccacp-3
+0x1.1940bap+2
+-0x1.14ca86p+1
+-0x1.b5d494p+2
+-0x1.0a319ap-2
+-0x1.171efp+2
+0x1.49beaap+3
+-0x1.e727d4p+3
+-0x1.234bcp-1
+0x1.43c804p+3
+-0x1.178dfep+2
+0x1.fdc47ap-3
+-0x1.e75396p+2
+0x1.f8f04cp+2
+0x1.3a2882p+3
+-0x1.4fab3ep+2
+0x1.952e04p+1
+-0x1.f99bd6p+0
+0x1.233548p+0
+0x1.0fccccp-6
+-0x1.54f26ap+2
+-0x1.ea8732p-4
+-0x1.44f526p+2
+0x1.9dfe8ep+0
+0x1.4df2ep-1
+-0x1.5f4d08p+0
+0x1.350aap+3
+0x1.e7b63cp+2
+-0x1.cba3f6p+1
+0x1.3ec0f6p+0
+0x1.b8a2bap+2
+-0x1.5c199cp+4
+-0x1.056936p+3
+0x1.8e304p+2
+0x1.b2fc28p-2
+0x1.0af75cp-2
+-0x1.57f7b8p+3
+0x1.3d1ecp+3
+-0x1.2a76fp-1
+-0x1.2da37ep+6
+-0x1.4fc948p-2
+0x1.002a8ep+0
+-0x1.20bdd4p+2
+-0x1.5f6ceep+2
+0x1.93eb84p-4
+-0x1.c443cp+2
+0x1.b34272p+2
+-0x1.fec732p-1
+0x1.5a9794p+1
+0x1.9f7c76p+2
+0x1.c86a0cp+2
+0x1.88d064p-1
+-0x1.782b46p+2
+-0x1.a8241p-2
+0x1.01e8cep+2
+-0x1.65f582p-3
+-0x1.a6e786p+2
+0x1.268be2p-2
+0x1.d4ca68p+2
+0x1.10d1fep+3
+0x1.33280ap+1
+0x1.45129ap+3
+0x1.b2f9fp+2
+0x1.c06c2ap+2
+-0x1.2e4b6p+2
+0x1.532108p-1
+-0x1.198f1p+0
+0x1.32f2ep-1
+-0x1.63b1fap-3
+0x1.de7384p-1
+-0x1.f9c4ep+0
+0x1.bd8dc4p+2
+-0x1.748c3p+2
+-0x1.0c2204p+2
+0x1.3f400cp+3
+0x1.16ef8ep+1
+0x1.ffaf0ap-1
+-0x1.3df84ep-5
+-0x1.0a47f6p+3
+-0x1.074b02p-3
+0x1.358ba2p+3
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 04/17] benchtests: Add expm1f benchmark
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (2 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 03/17] benchtests: Add exp2m1f benchmark Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-29 18:28   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 05/17] benchtests: Add log10f benchmark Adhemerval Zanella
                   ` (13 subsequent siblings)
  17 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

The inputs are modeled based on expm1-inputs, with the range
adapted to binary32 range.
---
 benchtests/Makefile      |   1 +
 benchtests/expm1f-inputs | 799 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 800 insertions(+)
 create mode 100644 benchtests/expm1f-inputs

diff --git a/benchtests/Makefile b/benchtests/Makefile
index 25dfe700a6..bb21721057 100644
--- a/benchtests/Makefile
+++ b/benchtests/Makefile
@@ -48,6 +48,7 @@ bench-math := \
   exp2m1f \
   expf \
   expm1 \
+  expm1f \
   floor \
   floorf \
   fmax \
diff --git a/benchtests/expm1f-inputs b/benchtests/expm1f-inputs
new file mode 100644
index 0000000000..6b80475401
--- /dev/null
+++ b/benchtests/expm1f-inputs
@@ -0,0 +1,799 @@
+## args: float
+## ret: float
+## includes: math.h
+## name: workload-random
+# Random inputs in [a=-14.495465,b=88.722832]
+# where a is the smallest number such that expm1f does not round to -1
+# and b is the smallest number such that expm1 rounds to +Inf (to nearest)
+0x1.3810cp+6
+0x1.d5f38p+3
+0x1.5bbafp+4
+0x1.274218p+5
+-0x1.4e6a94p+2
+-0x1.898c1ap-1
+0x1.609cf8p+5
+0x1.9cc3a4p+4
+0x1.2df7eep+4
+0x1.73defep+5
+0x1.dd4ddap+3
+-0x1.9fe548p+3
+0x1.b3c8f2p+1
+0x1.3ac27cp+6
+0x1.b43346p+5
+0x1.1e7d4ep+2
+0x1.a65c52p+5
+0x1.3c2c3ap+5
+0x1.0ae18ep+6
+0x1.5d1cccp+6
+0x1.5e376ep+6
+0x1.46e41ap+5
+0x1.58bd84p+0
+-0x1.ad6876p+3
+0x1.ac642ep+4
+0x1.45482ep+2
+0x1.6a3fe6p+1
+0x1.b1da94p+3
+0x1.0bac6ep+6
+0x1.b7f212p+5
+0x1.4c9a62p+6
+0x1.903de4p+5
+0x1.0021e8p+4
+0x1.17b81p+3
+0x1.5cf974p+6
+0x1.1ca20ap+6
+0x1.aeb732p+5
+0x1.c60614p+5
+0x1.186b38p+6
+0x1.abbb34p+5
+0x1.5c2474p-2
+0x1.e6855cp+3
+0x1.14068cp+4
+0x1.710416p+4
+-0x1.cc704cp+2
+0x1.534bdap+6
+0x1.8b0c18p+3
+0x1.36de48p+1
+0x1.33b7f4p+5
+0x1.19c128p+5
+0x1.d9d7dap+5
+0x1.343482p+6
+0x1.c82f4ap+5
+-0x1.1123ep-1
+0x1.a66ed2p+5
+0x1.30fd8p+6
+0x1.221296p+6
+-0x1.cb7386p+1
+0x1.00cdccp+5
+-0x1.8d3f3ap+2
+-0x1.d4dbf6p+2
+0x1.fdf25ap+4
+0x1.d5fd5cp+3
+0x1.fbd1ep+4
+0x1.116b76p+6
+0x1.b9b8b4p+1
+0x1.b5dfdp+2
+0x1.c49f3cp+5
+0x1.608052p+6
+0x1.34cb2p+6
+0x1.e95b62p+3
+0x1.1984f4p+6
+0x1.f7a902p+5
+0x1.55b80ep+3
+0x1.e63ffap+3
+-0x1.acc202p+1
+0x1.2670c4p+4
+0x1.3cb908p-1
+0x1.2a3b32p+3
+0x1.ef2c8ap+5
+-0x1.86fb0ap+2
+-0x1.10ce8ap+1
+-0x1.ee4398p+2
+0x1.317bacp+6
+-0x1.7844b8p+3
+0x1.cc4ac8p+5
+0x1.56d116p+4
+-0x1.b79b38p+3
+0x1.34dcaep+5
+0x1.79f55cp+4
+0x1.6c0398p+5
+-0x1.04565cp+3
+0x1.9340ccp+2
+0x1.d8856cp+5
+-0x1.bc5034p+1
+0x1.97348cp+5
+0x1.76a472p+5
+0x1.111a1ep+5
+0x1.19bc32p+4
+0x1.5d75c2p+6
+0x1.a1dcaap+5
+0x1.079abcp+6
+0x1.8b0ca8p+5
+0x1.2e6548p+6
+0x1.24d536p+5
+0x1.3d8efcp+5
+-0x1.fa06c8p+2
+0x1.c20454p+5
+0x1.bbd65cp+3
+0x1.53db36p+6
+0x1.7f69b2p+4
+0x1.f8aab8p+4
+0x1.42f736p+5
+0x1.121742p+5
+0x1.2dc1c2p+5
+0x1.0d4e32p+5
+0x1.0a6128p+6
+0x1.afc1d6p+5
+0x1.1a29ap+6
+-0x1.c5e0c2p+3
+0x1.15b464p+6
+0x1.b1eb2ap+5
+-0x1.6f737p+0
+0x1.8c9f04p+0
+-0x1.56ad02p+3
+0x1.c595aap+5
+0x1.1c4056p+6
+0x1.45ba98p+5
+0x1.aff522p+5
+0x1.ac9542p+4
+0x1.4cc0d6p+1
+0x1.4adb2ep+6
+0x1.3491c2p+5
+0x1.559a82p+3
+0x1.def4p+5
+0x1.23f276p+5
+-0x1.d5eff8p+2
+0x1.e6ca08p+4
+0x1.f83e38p+3
+0x1.331a4p+6
+0x1.57df6cp+3
+-0x1.852c2ep+3
+0x1.bd56fcp+5
+-0x1.3720a6p+3
+0x1.3e49cp+1
+0x1.3a1e0ap+5
+0x1.7525c8p+5
+0x1.5ff3c8p+6
+0x1.5fbbd6p+6
+0x1.40f626p+5
+-0x1.87d02ep+3
+0x1.56345ep+2
+0x1.a735aep+2
+0x1.3b30bap+5
+-0x1.da7242p+2
+-0x1.9b8284p+1
+0x1.16a344p+6
+0x1.af11e4p+3
+0x1.53f7e6p+5
+0x1.50e1a8p+5
+0x1.242fe4p+6
+-0x1.18156ap+3
+-0x1.1ac67cp+2
+0x1.d53c02p+5
+0x1.5217c4p+6
+0x1.6da49ep+5
+0x1.17bfbp+6
+-0x1.0e3c48p+2
+-0x1.3b7a1ap+2
+0x1.41462cp+6
+0x1.aaee8p+4
+0x1.d2579cp+5
+-0x1.865634p+3
+0x1.a3876cp+5
+0x1.e512d8p+3
+0x1.bc6f4ep+4
+0x1.b14bfep+5
+0x1.ec787cp+4
+0x1.268bf6p+4
+-0x1.bf2e34p+2
+0x1.861576p+5
+0x1.41c256p+4
+0x1.69b71cp+5
+0x1.601c7ap+6
+0x1.b97298p+4
+0x1.82e8bp+5
+0x1.83c418p+5
+0x1.21dee6p+3
+0x1.cb17fap+5
+0x1.38c41cp+6
+-0x1.c2683cp+3
+0x1.3d6fcp+5
+0x1.d1ef44p+5
+0x1.47d6c2p+3
+0x1.380822p+6
+0x1.442deap+6
+0x1.25b0dcp+5
+0x1.03867cp+5
+0x1.8e554ep+5
+0x1.26befep+4
+-0x1.37db3ap+0
+-0x1.0508eap+3
+0x1.d25cecp+5
+0x1.05cf7cp+6
+0x1.c31c7p+5
+0x1.a86266p+5
+0x1.59e8a2p+6
+0x1.ef79ep+4
+0x1.212d2p+1
+-0x1.b8245ap+3
+0x1.30aec4p+5
+0x1.5fe628p+6
+0x1.caa0fap+5
+0x1.229bap+4
+0x1.1e5278p+6
+0x1.146544p+6
+0x1.009ecp+6
+0x1.9c90b4p+5
+0x1.0145dep+6
+0x1.6b25ap+5
+-0x1.9c2698p+1
+0x1.441204p+4
+0x1.396798p+5
+0x1.5b5dc8p+4
+0x1.27f358p+6
+0x1.79b952p+3
+0x1.1a30ecp+6
+0x1.0eb864p+6
+0x1.bd1f6ep+5
+0x1.90f39ap+4
+0x1.d00fa4p+5
+0x1.38d37ep+5
+0x1.942356p+4
+0x1.041a1ap+6
+0x1.ff196cp+3
+0x1.24bcd4p+6
+-0x1.3d97eap+3
+0x1.f6224p+5
+0x1.2cfdbep+5
+0x1.42fa36p+5
+0x1.844ce4p+5
+0x1.5810aep+6
+0x1.df2214p+5
+0x1.580ba4p+6
+0x1.620818p+3
+0x1.7e9a86p+5
+0x1.5fc452p+6
+-0x1.b0f38cp+3
+-0x1.b4c3ap+0
+0x1.ae6154p+4
+0x1.334348p+6
+0x1.daa71p+4
+0x1.9c2e0ep+5
+0x1.140af2p+5
+0x1.5dc292p+6
+0x1.f7f7e4p+5
+-0x1.d74c66p+2
+0x1.249b98p+6
+0x1.750da8p+3
+0x1.3782ccp+5
+0x1.3ad2f4p+6
+0x1.1b2256p+6
+0x1.be193p+3
+0x1.6074f2p+4
+0x1.926602p+5
+0x1.640a02p+3
+0x1.4d343p+0
+0x1.5eaabcp+4
+0x1.7e4ff4p+5
+0x1.631a3ap+4
+0x1.2bcc8p+3
+0x1.6abe2ap+5
+0x1.85e932p+5
+0x1.6ea55ap+2
+-0x1.a9a304p+2
+0x1.05ba9ep+6
+-0x1.ca222cp+2
+0x1.64940ep+5
+0x1.2ebe6cp+4
+0x1.7c91c2p+5
+0x1.f0368ap+4
+-0x1.129f02p+1
+0x1.7ed0a4p+4
+0x1.11beb2p+6
+0x1.330d7ap+4
+0x1.3bc6eep-1
+0x1.02348p+6
+0x1.35064ap+5
+0x1.3c44p+5
+0x1.c128eep+5
+0x1.837444p+3
+0x1.9116dap+5
+-0x1.7fb6f2p+3
+0x1.d74884p+4
+-0x1.dd8e86p+2
+0x1.db84e2p+5
+-0x1.9aa036p+2
+0x1.a108cep+5
+0x1.60ed52p+4
+0x1.c738eap+5
+0x1.1d9b9p+1
+0x1.5542ep+6
+0x1.074218p+0
+0x1.16afeep+6
+0x1.31b3dp+5
+0x1.8127a8p+5
+0x1.27d12p+2
+0x1.962ad2p+3
+0x1.726aacp+2
+0x1.e9e8bap+5
+0x1.b54284p+5
+0x1.acb4fcp+5
+0x1.2a671p+6
+0x1.de6a98p+5
+0x1.6a2454p+2
+0x1.85b1b8p+5
+0x1.a50b94p+5
+0x1.77bfaep+2
+0x1.41c6ap+3
+0x1.e51cdep+5
+0x1.4de72cp+6
+0x1.413186p+6
+-0x1.bbc70ap+3
+-0x1.f138fcp+2
+0x1.78855p+5
+0x1.dd16bep+4
+0x1.2c491p+2
+0x1.500ff6p+6
+-0x1.035c0ep+2
+0x1.3a7688p+5
+0x1.82bb26p+5
+0x1.0c41d2p+6
+-0x1.85128cp+1
+0x1.54a6f8p+5
+0x1.66e21cp+5
+0x1.d3cce6p+1
+0x1.a16cbap+3
+-0x1.096126p+2
+-0x1.a45e04p+3
+0x1.7d697p+5
+0x1.106d1ap+6
+0x1.04e974p+4
+0x1.6ce8b4p+3
+0x1.8b3bd4p+3
+0x1.7db442p+4
+0x1.3c3318p+6
+0x1.91a55ep+4
+0x1.378ffap+6
+-0x1.5f7422p+2
+0x1.6c9034p+3
+-0x1.f8ff9ep+1
+0x1.d2f0dp+4
+0x1.4e15dcp+6
+-0x1.a41644p+2
+0x1.1074f4p+5
+0x1.c08daap+5
+0x1.0a83a2p+3
+-0x1.e24802p+1
+0x1.54555cp+6
+0x1.b6cac8p+5
+-0x1.3f30dap+1
+0x1.c9d7e6p+4
+0x1.054b78p+6
+0x1.9a9d3cp+5
+0x1.eaea98p+5
+0x1.e6dcd2p+4
+0x1.4c5e9ap+2
+0x1.990a46p+3
+0x1.5b856p+5
+0x1.53b10cp+6
+0x1.3085b8p+2
+0x1.33623ap+6
+0x1.79211cp+2
+0x1.487144p+6
+0x1.8540c4p+5
+0x1.7d81eep+4
+0x1.c2663ep+5
+0x1.177a4ep+6
+0x1.9d505cp+5
+0x1.656852p+4
+-0x1.cc7e2cp+1
+0x1.a8057ap+4
+0x1.86fd48p+3
+-0x1.148908p+1
+0x1.5bc9fep+2
+0x1.4cd724p+5
+0x1.5cff22p+6
+-0x1.aaecc8p+2
+0x1.14cb74p+5
+0x1.ce6106p+4
+0x1.51cda4p+4
+0x1.171dbp+6
+0x1.4a3d88p+1
+0x1.1bd39ep+6
+0x1.7a88a4p+5
+0x1.7a31e4p+4
+0x1.1b585cp+6
+0x1.528cc6p+5
+0x1.a58ccep+4
+0x1.c26ed8p+4
+0x1.22021cp+6
+0x1.1b8a9p+6
+0x1.e2c44p+5
+0x1.fe1bb4p+5
+0x1.0548acp+6
+0x1.12ce22p+6
+0x1.623584p+6
+0x1.7a0d8p+5
+0x1.9b770ep+3
+0x1.3c827ap+4
+0x1.54d708p+4
+0x1.114dc6p+6
+0x1.a34a9ap+4
+-0x1.85b6bcp+3
+0x1.cba9f2p+4
+0x1.a81124p+4
+-0x1.a0265cp+3
+0x1.376a9p+5
+0x1.f878p+5
+0x1.3a403ep+6
+0x1.3b4e9cp+6
+0x1.3a7ecp+6
+0x1.0e7c34p+4
+0x1.d974ecp+3
+0x1.f96p+3
+0x1.b07262p+5
+0x1.c0761ep+5
+-0x1.8d95aap+3
+0x1.f9b2eap+2
+0x1.c45722p+3
+0x1.22035cp+3
+-0x1.14f90cp+2
+0x1.f3f58p+5
+-0x1.3f0d4p+3
+0x1.712122p+4
+0x1.6c70b4p+4
+0x1.5386p+5
+-0x1.676fcep+3
+0x1.087cdap+6
+0x1.5e31bcp+6
+0x1.59c27p+6
+0x1.8fda26p+5
+0x1.bac6dcp+5
+0x1.94bcbap+1
+0x1.b4272cp+4
+0x1.28b6e6p+4
+0x1.15d214p+5
+-0x1.258ca8p+2
+0x1.67d242p+4
+0x1.b463bep+4
+0x1.82d508p-1
+0x1.453544p+6
+0x1.59c3e2p+5
+0x1.a5444cp+0
+0x1.023312p+2
+0x1.4e49a2p+6
+0x1.3b2906p+3
+0x1.db3a42p+0
+0x1.482b3cp+4
+0x1.1b5f4p+4
+0x1.0a249ap+5
+-0x1.4d103cp+3
+-0x1.3f9a6p+1
+0x1.fb22d4p+4
+0x1.ae6726p+5
+0x1.5065c8p+5
+0x1.85a07ap+3
+0x1.08e6p+4
+0x1.9e5ddep+4
+0x1.5c2b96p+6
+0x1.025d3ep+3
+-0x1.b61288p+2
+0x1.767a9p+4
+-0x1.e1d398p+2
+0x1.61a05ap+4
+0x1.c1dcbep+4
+0x1.bc94c4p+5
+0x1.bab56ep+5
+0x1.3dd33ap+4
+0x1.57b106p+6
+-0x1.d493dcp+2
+0x1.c7c276p+5
+0x1.d177d8p+3
+0x1.e07254p+4
+0x1.e7a35ap+4
+0x1.f5361cp+3
+0x1.9124ap+5
+0x1.7cde4cp+5
+0x1.5868d6p+5
+0x1.34e748p+5
+0x1.883d3ap+5
+0x1.5a718ep+5
+0x1.416afcp+5
+0x1.b75ad8p+5
+0x1.000a84p+5
+0x1.dfbf96p+3
+0x1.caf566p+5
+0x1.47b68p+6
+0x1.179f6ep+5
+0x1.6139e6p+6
+0x1.79aba4p+4
+0x1.3314fcp+4
+-0x1.9396e4p+0
+0x1.d1f398p+5
+-0x1.4d93ecp+2
+-0x1.13ffbap+3
+0x1.43af3cp+6
+0x1.02fe76p+6
+0x1.ea2a1cp+5
+0x1.b46644p+5
+0x1.29812ap+6
+-0x1.9a4f28p+2
+0x1.33970ep+4
+0x1.22e908p+1
+0x1.5fe03ap+6
+0x1.593f74p-2
+0x1.12a9b6p+6
+0x1.d0aa12p+5
+0x1.d9bd7ap+4
+0x1.6abe46p+5
+0x1.6a7cd2p+5
+-0x1.243e06p+3
+0x1.8dc5b2p+5
+0x1.d19254p+5
+0x1.0d324p+4
+0x1.167128p+6
+0x1.667ba8p+5
+0x1.44c732p+6
+0x1.e452aep+5
+0x1.d9ad26p+5
+0x1.a6b18cp+5
+0x1.44778p+4
+0x1.6de93cp+5
+-0x1.749e0ap+3
+0x1.384234p+5
+0x1.baf766p+5
+0x1.155178p+5
+0x1.746b38p+5
+-0x1.108cf6p+3
+0x1.a42fcap+3
+0x1.e524aep+4
+0x1.70d73p+3
+0x1.10af9ap+6
+-0x1.fb00cep+1
+0x1.2084acp+6
+0x1.3ae402p+4
+0x1.3e95f2p+5
+0x1.424342p+6
+0x1.08ace2p+6
+0x1.eb0efep+5
+0x1.a4a3dap+5
+0x1.a438e8p+4
+0x1.39696ap+5
+0x1.2a706ep+6
+0x1.6fff2p+2
+0x1.ef4e3cp+5
+-0x1.20a1dp+3
+0x1.1fd284p+5
+0x1.240be4p+6
+0x1.5da7bp+4
+-0x1.49ca52p+1
+0x1.93cb38p+4
+0x1.179b56p+5
+0x1.18cf6cp+4
+0x1.d8c7cep+5
+0x1.54e87ap+6
+0x1.0556ap+6
+-0x1.f9dd92p+2
+0x1.1429eep+6
+0x1.295ef2p+5
+0x1.07eedcp+5
+0x1.58afeap+5
+0x1.e5bcc8p+2
+-0x1.a038c8p+3
+0x1.4e70a6p+6
+-0x1.172cfep-4
+0x1.355898p+3
+0x1.90292ep+5
+0x1.277aeap+4
+0x1.0e9c1cp+6
+0x1.54c948p+6
+0x1.17dc44p+2
+0x1.005c26p+3
+0x1.6c2d44p+5
+0x1.067ce8p+5
+0x1.188b3ap+1
+-0x1.c44378p+1
+0x1.16c9c4p+3
+0x1.40b782p+5
+0x1.8f8ecep+5
+0x1.aa8fbp+2
+0x1.40242ap+6
+0x1.78607cp+3
+0x1.209358p+6
+0x1.db1404p+4
+-0x1.b8ceap+1
+0x1.1e67p+6
+-0x1.c9f25ap+0
+0x1.eef1fp+5
+0x1.d17786p+4
+0x1.422a98p+6
+0x1.6efbaap+3
+0x1.5b11fep+6
+0x1.35d254p+6
+0x1.9b5daap-1
+-0x1.36c61cp+3
+0x1.5c19b4p+5
+-0x1.9dabdp+0
+0x1.b600c6p+5
+0x1.2a4238p+4
+-0x1.91e754p+2
+0x1.9740aap+4
+-0x1.77a118p+2
+0x1.125a76p+5
+0x1.08e4e2p+6
+0x1.2d6fp+4
+0x1.0046bap+4
+0x1.62c562p+6
+0x1.0d6c4p+6
+0x1.06cdbcp+6
+0x1.e88312p+5
+-0x1.903494p+3
+0x1.5d8044p+6
+0x1.0330e2p+4
+0x1.956188p+3
+0x1.9716c8p+5
+0x1.9b053ep+2
+0x1.26b98ap+5
+0x1.0b77p+3
+-0x1.ad2e28p+3
+0x1.30a1fap+4
+0x1.f41f1ep+2
+0x1.58c6eep+6
+0x1.4cd264p+3
+0x1.2f67c2p+6
+0x1.17e59ap+5
+0x1.59172cp+6
+0x1.3bb328p+4
+0x1.2a1c4ap+4
+0x1.11986p+6
+0x1.694528p+5
+0x1.d5535ap+4
+0x1.c2a2a4p+5
+0x1.4d88eap+4
+-0x1.e7e718p-1
+0x1.69dd4ap+5
+-0x1.4eca08p+1
+-0x1.c3eb44p+3
+0x1.2a4a8p+3
+0x1.d38d02p+5
+0x1.521b76p+6
+0x1.307698p+4
+0x1.8609c2p+4
+-0x1.facdd8p-3
+-0x1.2292p+3
+0x1.35cbf8p+1
+0x1.4390ecp+4
+0x1.948c06p+4
+-0x1.58cfb4p+3
+0x1.4b4b1cp+3
+0x1.ec863ap+5
+0x1.7868acp+4
+0x1.0c6a56p+6
+0x1.e8f6a6p+1
+0x1.f904cep+5
+0x1.d293c8p+4
+-0x1.35c3e8p+3
+0x1.323624p+4
+0x1.1985dep+4
+0x1.300366p+2
+0x1.cf14fap+5
+0x1.a32ab2p+5
+0x1.fb2286p+5
+0x1.071ed4p+6
+-0x1.25c488p+3
+0x1.5bd4b6p+5
+0x1.bfa83ap+4
+0x1.08f0dep+3
+0x1.f997b4p+4
+0x1.7368ccp+5
+0x1.590e04p+5
+0x1.57d704p+6
+0x1.c5aacep+5
+-0x1.54ee06p+2
+0x1.6191aap+3
+0x1.da9cap+5
+0x1.2fde0ap+5
+0x1.065a4ap+6
+0x1.1d3006p+6
+0x1.81e26ep+2
+0x1.ebf4dap+5
+0x1.cef564p+4
+0x1.922a5ep+3
+0x1.05e368p+3
+-0x1.245f16p+1
+0x1.479e9ap+3
+0x1.2b5394p+5
+0x1.ad8dacp+3
+0x1.ae750ep+3
+0x1.9a4daap+4
+-0x1.825edep+2
+0x1.312b9ap+6
+0x1.18e142p+4
+0x1.63bd86p+5
+0x1.252456p+4
+0x1.ba9c2ep+5
+-0x1.e576a4p+0
+0x1.14a2c4p+6
+0x1.0a073cp+5
+0x1.dcec16p+4
+-0x1.9ff9fap+2
+-0x1.5eb4f8p-2
+-0x1.d4075p+2
+0x1.cb0356p+2
+0x1.b902d6p+5
+0x1.3fdc32p+2
+0x1.5d971p+6
+0x1.84e158p+4
+0x1.95b4c4p+5
+-0x1.3e79ep+3
+0x1.fd2dc8p+5
+0x1.0d6f1ep+6
+0x1.4d02bp+5
+0x1.f11f1p+4
+0x1.576072p+4
+0x1.6dd086p+4
+0x1.0e00d2p+5
+0x1.995574p+5
+0x1.483b64p+5
+0x1.32e292p+3
+0x1.564096p+5
+0x1.64c174p+5
+0x1.54eccap+2
+0x1.10debap+5
+0x1.622066p+5
+0x1.207182p+2
+0x1.e8fb92p+5
+0x1.fc096ap+5
+0x1.3a7646p+1
+0x1.2b9d32p-1
+0x1.1b13f8p+6
+0x1.90947ap+2
+-0x1.b8d3acp+3
+0x1.b6a486p+3
+0x1.49a914p+6
+0x1.2e0d82p+6
+0x1.a6b1aep+5
+0x1.2511e4p+5
+0x1.da5904p+5
+0x1.d5b054p+4
+0x1.2a5f2cp+6
+0x1.08678ap+6
+0x1.f9e99ap+5
+0x1.916dfp+4
+0x1.bca612p+5
+0x1.1d10fcp+5
+0x1.5f1accp+6
+-0x1.cdae76p+2
+0x1.4cc6d2p+6
+0x1.496142p+6
+-0x1.a2389ap+3
+0x1.de417ap+5
+0x1.5db35ap+2
+0x1.c3bfp+4
+0x1.494e5cp+1
+0x1.653f3ep+3
+0x1.184762p+0
+0x1.11cd68p+6
+0x1.278d82p+5
+0x1.ee46e8p+3
+0x1.3eedbap+6
+0x1.2f0584p+5
+0x1.1c418ap+5
+0x1.4c0c6ap+5
+0x1.20bc1ap+5
+0x1.4a866cp+4
+0x1.f57228p+4
+0x1.0d82a8p+6
+0x1.4b7808p+6
+0x1.32497p+6
+0x1.53a728p+6
+0x1.a90c84p+5
+0x1.e1b57cp+5
+-0x1.2e0af6p+2
+0x1.c3ee6cp+2
+0x1.271e9ap+4
+0x1.62dcfap+6
+0x1.d0991p+1
+0x1.3b6862p+6
+0x1.dad92p+4
+0x1.28e45ap+3
+0x1.a299a8p+3
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 05/17] benchtests: Add log10f benchmark
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (3 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 04/17] benchtests: Add expm1f benchmark Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-29 18:32   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 06/17] benchtests: Add log2p1f benchmark Adhemerval Zanella
                   ` (12 subsequent siblings)
  17 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

The inputs are random numbers in the form x*2^e where x is random
in [0x1p-1,0x1p+0] and e in [-126,127].
---
 benchtests/Makefile      |    1 +
 benchtests/log10f-inputs | 1005 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 1006 insertions(+)
 create mode 100644 benchtests/log10f-inputs

diff --git a/benchtests/Makefile b/benchtests/Makefile
index bb21721057..f948139ace 100644
--- a/benchtests/Makefile
+++ b/benchtests/Makefile
@@ -71,6 +71,7 @@ bench-math := \
   llrintf \
   log \
   log10 \
+  log10f \
   log1p \
   log2 \
   log2f \
diff --git a/benchtests/log10f-inputs b/benchtests/log10f-inputs
new file mode 100644
index 0000000000..09d2b5316e
--- /dev/null
+++ b/benchtests/log10f-inputs
@@ -0,0 +1,1005 @@
+## args: float
+## ret: float
+## includes: math.h
+# Random inputs x*2^e where x is random in [0x1p-1,0x1p+0] and e in [-126,127]
+## name: workload-random
+0x1.da16e6p-106
+0x1.670c3cp-44
+0x1.b238f8p+57
+0x1.55b736p-17
+0x1.3a0424p+101
+0x1.d5741p+54
+0x1.b4abbcp-10
+0x1.51ea1cp+96
+0x1.27b328p-29
+0x1.bd7b1ap+92
+0x1.fe1fap+77
+0x1.192fc2p+14
+0x1.c503fp+5
+0x1.d20c3ep-94
+0x1.586c14p-96
+0x1.e89f4cp-78
+0x1.a77f04p+3
+0x1.fe4a58p+66
+0x1.e67aa4p-3
+0x1.c22b3ap+35
+0x1.898044p-60
+0x1.7e5374p+24
+0x1.f8a3fp+81
+0x1.c9f37p+12
+0x1.c4760cp-94
+0x1.70457ep+97
+0x1.82cc9cp-57
+0x1.8528c8p-71
+0x1.1b90a8p+53
+0x1.76b5e2p+30
+0x1.999c7ap+111
+0x1.27731ap+116
+0x1.c2e128p-52
+0x1.a4ef2ep-46
+0x1.78fce8p-92
+0x1.d3a338p+0
+0x1.8de54cp+72
+0x1.20be3p+37
+0x1.290122p-118
+0x1.9f19e4p-36
+0x1.317c34p+80
+0x1.0f3f3ep-126
+0x1.a50fcp+44
+0x1.12ef54p-98
+0x1.69b3a6p+17
+0x1.ec0e44p+28
+0x1.d699d8p-113
+0x1.ae1134p+106
+0x1.b2333cp-63
+0x1.694f68p+91
+0x1.fcb1ap+112
+0x1.1e492p-45
+0x1.d7ac74p-6
+0x1.8122d4p-106
+0x1.070b92p+8
+0x1.1f3c0ap+30
+0x1.617eb2p+68
+0x1.7e64a4p-126
+0x1.1c4b92p+37
+0x1.ed1f1ep+21
+0x1.5f1a2p+43
+0x1.166282p+28
+0x1.78f48cp+126
+0x1.c344bp+81
+0x1.74a788p+34
+0x1.76e186p+79
+0x1.670aeap+124
+0x1.9df346p+77
+0x1.5add7ap+2
+0x1.da11fcp+81
+0x1.e7dba4p-123
+0x1.abbdep-65
+0x1.c557ap+122
+0x1.45572p-37
+0x1.249f44p-44
+0x1.5845fp-40
+0x1.66442cp-122
+0x1.12b0fp-97
+0x1.d0cd96p-23
+0x1.397968p-47
+0x1.65c0a2p-54
+0x1.32ace6p+116
+0x1.7b7a8cp+42
+0x1.9207eep-57
+0x1.16a338p-74
+0x1.9debc4p+96
+0x1.db29cp+17
+0x1.871b3cp-114
+0x1.a84948p-29
+0x1.0a16aep-41
+0x1.55c0dcp+103
+0x1.454dep+122
+0x1.0ae7a4p+109
+0x1.a1e65cp-101
+0x1.3aad16p-70
+0x1.95678ap+63
+0x1.5cba44p+72
+0x1.a5806ap+17
+0x1.f69a2p-127
+0x1.cfe828p+18
+0x1.93b8ap-66
+0x1.9bb51p+12
+0x1.15a764p+32
+0x1.9a26b4p-29
+0x1.b270b6p-122
+0x1.fe10e8p-120
+0x1.7f69b8p+116
+0x1.e2f38ep+99
+0x1.3bcafep+11
+0x1.87ee32p-89
+0x1.897feep-82
+0x1.b73098p+86
+0x1.904a14p+110
+0x1.2ccbcp+115
+0x1.bf3952p-52
+0x1.ad968p-13
+0x1.7fbc7ap-81
+0x1.01ad34p-109
+0x1.6bbadep+57
+0x1.9f097cp-88
+0x1.3e045p+13
+0x1.f39b0cp-56
+0x1.76c1d8p+48
+0x1.dc89acp+81
+0x1.9f4c76p-43
+0x1.d9b334p+4
+0x1.48b044p-84
+0x1.d9e254p+25
+0x1.05338ep-5
+0x1.e35e74p-50
+0x1.4d41bap-105
+0x1.a42d5ep+30
+0x1.f94e9ap+23
+0x1.8dbe34p+65
+0x1.0b305ep+20
+0x1.7f9e3ep-18
+0x1.a6c068p+34
+0x1.319b28p+64
+0x1.f96bep-102
+0x1.a567e4p-56
+0x1.a25f7p-88
+0x1.2efa1ep-89
+0x1.4e5fbcp-17
+0x1.2ba0ep-49
+0x1.43d7a8p-124
+0x1.befe96p-68
+0x1.cfcea4p-120
+0x1.83f31p+73
+0x1.133bfcp+70
+0x1.7093b2p+111
+0x1.d2124ap+46
+0x1.235cf6p+43
+0x1.81e624p-84
+0x1.b95f88p-81
+0x1.62f0ccp+46
+0x1.fee13cp-11
+0x1.9b96ecp+80
+0x1.1a18b8p-52
+0x1.d08758p-26
+0x1.2aac9cp+41
+0x1.d72052p+10
+0x1.ec9e44p+10
+0x1.3d17ap+89
+0x1.bf813p+58
+0x1.8f861cp+45
+0x1.cb02bp-98
+0x1.30292p+91
+0x1.759878p-20
+0x1.3b5ef8p+87
+0x1.d515fcp+22
+0x1.00c96cp+39
+0x1.43f8cap+2
+0x1.b2ba98p+119
+0x1.5f4574p+71
+0x1.d7d1bap-118
+0x1.bbc718p-116
+0x1.bfec3ep-81
+0x1.d60c98p+84
+0x1.21d388p+69
+0x1.e61d9p+30
+0x1.521fa4p+27
+0x1.81c3ecp-27
+0x1.0128b8p-104
+0x1.799af4p+43
+0x1.0b4494p+66
+0x1.286a46p-39
+0x1.30b7acp-22
+0x1.2769f6p+29
+0x1.fba108p-118
+0x1.ae818cp+58
+0x1.829338p+15
+0x1.eacd54p-50
+0x1.a3ddcep-73
+0x1.0a7cbep+3
+0x1.053fb2p+24
+0x1.977f4ap-90
+0x1.a1f9f6p-94
+0x1.35e1b8p-11
+0x1.568ad4p+51
+0x1.ed295cp-74
+0x1.67d44cp+34
+0x1.1dcc42p-51
+0x1.765f5ap-18
+0x1.f0b462p+81
+0x1.5be91ep-90
+0x1.3ae462p-24
+0x1.95c2fp-79
+0x1.60e24cp+40
+0x1.ed5388p-121
+0x1.f3b5f4p-81
+0x1.0aac5cp+57
+0x1.a52ebcp+30
+0x1.c8875cp-81
+0x1.b24d7cp+123
+0x1.294ad8p+111
+0x1.04ce6ep+12
+0x1.b31978p-51
+0x1.6f4a34p-16
+0x1.e4844p+38
+0x1.4fa35cp-18
+0x1.6702fap+115
+0x1.81bafep-100
+0x1.ff39fcp-72
+0x1.593832p-8
+0x1.8393bcp-40
+0x1.1d2b1ap+119
+0x1.0d9676p-111
+0x1.07c464p+109
+0x1.97d358p+51
+0x1.09f466p+12
+0x1.aaaa08p+0
+0x1.cdc2dep+52
+0x1.5a5914p+14
+0x1.85c484p-87
+0x1.6be4a6p-16
+0x1.d2b9a4p+25
+0x1.029092p-31
+0x1.00c192p+35
+0x1.09b8e2p-55
+0x1.7e39fcp-111
+0x1.e70afcp+2
+0x1.373c5cp-36
+0x1.0d242ap+64
+0x1.5e5a74p+4
+0x1.2049bp+69
+0x1.3a4a6ep+107
+0x1.8864c4p+15
+0x1.169e34p+107
+0x1.8a34dp+16
+0x1.492ba6p+80
+0x1.852282p+28
+0x1.bcaef8p+3
+0x1.2d1f62p-25
+0x1.fb7e44p-97
+0x1.dc3f8ep+79
+0x1.6667b2p-94
+0x1.53e6f4p-33
+0x1.c58c9p+15
+0x1.df9ecap-78
+0x1.19237ep-23
+0x1.865f4ap+89
+0x1.3a1ab4p+47
+0x1.523edp+25
+0x1.a88f98p-21
+0x1.26a16ap-80
+0x1.31b9d4p+30
+0x1.f2f44cp+4
+0x1.2bf848p+56
+0x1.18e23ep+44
+0x1.eb53acp+66
+0x1.f1ae2cp+96
+0x1.3b2864p+87
+0x1.34ea48p-126
+0x1.a21ef8p+30
+0x1.ed7cdp+28
+0x1.c62e2p+124
+0x1.cc0edp+95
+0x1.26deaep+100
+0x1.46e9dcp+35
+0x1.f7f808p+60
+0x1.05cf94p-2
+0x1.33046ap-26
+0x1.eda126p+109
+0x1.1a2c22p-57
+0x1.42f4fap+96
+0x1.4a529ep-11
+0x1.db8a26p-53
+0x1.b8de04p+119
+0x1.4bb944p-16
+0x1.044df4p+25
+0x1.93a748p+74
+0x1.671124p+22
+0x1.9ad676p-10
+0x1.0534dcp+80
+0x1.ec2a64p+82
+0x1.0f8aacp-39
+0x1.7fba92p+49
+0x1.1f844ap-90
+0x1.ba683p-114
+0x1.ff2418p+26
+0x1.b8f23p-92
+0x1.20843cp+72
+0x1.75b76ep-35
+0x1.42d08cp+9
+0x1.0213f6p-20
+0x1.4ea9b4p-25
+0x1.7afdfap+55
+0x1.b7f224p-6
+0x1.56f9fap-74
+0x1.e9eff6p+8
+0x1.ba5568p-67
+0x1.602878p-127
+0x1.5f1212p+27
+0x1.d8c36p-125
+0x1.595be4p+31
+0x1.6b8c2p+60
+0x1.9c0bfep+86
+0x1.3054d8p-110
+0x1.2de4e2p-114
+0x1.d30c88p+91
+0x1.92b73cp-68
+0x1.cecccp+99
+0x1.f61878p+63
+0x1.660bfep+29
+0x1.082f72p-29
+0x1.0b02f6p+110
+0x1.13fdc4p-7
+0x1.454f9p-22
+0x1.8e5e8cp+96
+0x1.266ep-127
+0x1.cbdef4p+26
+0x1.16454ep-96
+0x1.23fdc8p+105
+0x1.4b50bap+32
+0x1.a9a79p-72
+0x1.1d30dcp-13
+0x1.418554p+24
+0x1.b772ecp+89
+0x1.de553cp+45
+0x1.04c0b6p-120
+0x1.c02f08p-48
+0x1.186b22p-94
+0x1.8866b6p-112
+0x1.63ab38p-3
+0x1.d4d124p+109
+0x1.921c7p+8
+0x1.02e724p+20
+0x1.7b93a8p-101
+0x1.aa0cbcp-86
+0x1.bd3e86p-44
+0x1.fc4d2p-84
+0x1.71868ep-71
+0x1.4dd6a6p-57
+0x1.a987b2p-116
+0x1.ab61d4p+35
+0x1.cdab24p+30
+0x1.0b5594p-96
+0x1.eaa8f4p+121
+0x1.8fd794p+17
+0x1.1b63b6p-81
+0x1.8e99bcp-113
+0x1.043c5cp-105
+0x1.5013d4p-58
+0x1.601568p-98
+0x1.783708p-27
+0x1.e26e5cp+58
+0x1.bee95p+71
+0x1.df371ap+26
+0x1.2d7b7p-125
+0x1.60c5cep-38
+0x1.46cb7ep+88
+0x1.e16038p-13
+0x1.23f7cap-31
+0x1.90d4bcp-2
+0x1.f4fa2p-47
+0x1.0adef2p+50
+0x1.ce7c8cp-45
+0x1.d81b52p+104
+0x1.43d436p-95
+0x1.faa8ecp-24
+0x1.7d4b4p+86
+0x1.7c8994p-83
+0x1.c4b67cp+40
+0x1.1b1922p-112
+0x1.4b7ecep-15
+0x1.dcb6fep-14
+0x1.20dbf6p-55
+0x1.3e777p-109
+0x1.22360ap-118
+0x1.7c01bcp-43
+0x1.9218fep+38
+0x1.1a7e04p-57
+0x1.4623d6p+90
+0x1.56cb4p-70
+0x1.88e8cp-24
+0x1.d3b234p-40
+0x1.d3461p+28
+0x1.e03eap-80
+0x1.866d8cp+2
+0x1.efd52p+17
+0x1.b9466cp+62
+0x1.6e3274p+50
+0x1.16b192p+99
+0x1.2d1f76p-20
+0x1.018a1ep-109
+0x1.e64edcp-61
+0x1.badf04p+7
+0x1.fd69c4p-85
+0x1.789cc6p-4
+0x1.4d7b2ap+80
+0x1.c7e56p+35
+0x1.edb216p-57
+0x1.6b581p-30
+0x1.a60178p+42
+0x1.10322ep-50
+0x1.af924ep+45
+0x1.5413bp+87
+0x1.2db0cp+46
+0x1.650a2cp-2
+0x1.57b896p-104
+0x1.6b2dap+0
+0x1.e7063ep-53
+0x1.4bb8ep-42
+0x1.7d72dp+123
+0x1.dcd8fap-87
+0x1.fae3f4p+11
+0x1.6de0dap+68
+0x1.624738p-78
+0x1.dbe44cp-23
+0x1.5e0f9ap-46
+0x1.0c9dp-104
+0x1.c565d8p+33
+0x1.c07118p-63
+0x1.c9d942p+85
+0x1.773dfp+3
+0x1.15bfap+87
+0x1.fdbd2cp+14
+0x1.d996fap-57
+0x1.2a7c7cp-45
+0x1.e690fep-71
+0x1.f5c04p-95
+0x1.d17398p+123
+0x1.c5dc6cp-117
+0x1.d9f2ccp+82
+0x1.da8d44p-16
+0x1.bda39p-67
+0x1.5a646cp-10
+0x1.412e4ap-58
+0x1.d91868p+80
+0x1.35d738p+68
+0x1.5045d4p-103
+0x1.bb697p-120
+0x1.68d014p-75
+0x1.0a3754p+54
+0x1.9bb66ap+100
+0x1.c2fdcp+33
+0x1.c2023p-98
+0x1.2e3106p+20
+0x1.3b5d34p-29
+0x1.1c8316p+97
+0x1.51779cp+3
+0x1.65d436p-49
+0x1.6c3f4ep+47
+0x1.7b696cp-58
+0x1.1768cap+96
+0x1.0a5052p-97
+0x1.46e2dap+86
+0x1.e545f8p-44
+0x1.1851dap+37
+0x1.877a1cp-30
+0x1.fedaf8p+89
+0x1.93a08p-114
+0x1.c970fp-106
+0x1.e80106p+26
+0x1.6f9bep-29
+0x1.a22e78p+24
+0x1.3cf0eep+108
+0x1.cead34p+76
+0x1.a4f7fp+17
+0x1.823924p-11
+0x1.1cfdf4p-28
+0x1.5e8ee8p+119
+0x1.5357d8p+43
+0x1.99df08p-126
+0x1.f98dccp+76
+0x1.c9d0b6p+37
+0x1.342018p-89
+0x1.c6f08cp+89
+0x1.f7ba82p+116
+0x1.ec961cp-13
+0x1.772252p-18
+0x1.08f52p-107
+0x1.7cbceep-41
+0x1.cdc76p+91
+0x1.c5ce0cp-38
+0x1.9cff24p-77
+0x1.2ad16cp-101
+0x1.1d0ab2p+41
+0x1.84a054p-70
+0x1.c95934p+126
+0x1.33f824p+102
+0x1.74420ap+27
+0x1.1df842p+21
+0x1.7c3cc4p-7
+0x1.8cde44p-44
+0x1.19894ep+5
+0x1.ae06fp-55
+0x1.680a14p-18
+0x1.e9d17p+52
+0x1.cb341ep+74
+0x1.3c332cp-61
+0x1.afd732p-39
+0x1.42540cp+27
+0x1.6465c4p-43
+0x1.6ad396p-23
+0x1.791e4ap+51
+0x1.61e53p-114
+0x1.c2b5eep-74
+0x1.33e062p+79
+0x1.b25868p+73
+0x1.7c8b4cp+28
+0x1.5fd75p-79
+0x1.ccc12cp+30
+0x1.179e28p+16
+0x1.f74506p+83
+0x1.ccb774p-96
+0x1.db5004p-30
+0x1.b60d22p-103
+0x1.87fb24p-7
+0x1.92111ep+33
+0x1.c760aep+28
+0x1.2dc1acp-122
+0x1.99be28p+19
+0x1.b2a008p-88
+0x1.ce8b2p-112
+0x1.b151cp-18
+0x1.3aa5e4p-31
+0x1.42f8fcp+103
+0x1.209adcp+22
+0x1.8b597cp+31
+0x1.a279b6p+99
+0x1.98376cp-33
+0x1.2e91c4p-29
+0x1.5e6e64p+33
+0x1.058124p-31
+0x1.8ff2d6p+15
+0x1.f7ee64p-60
+0x1.27fbfcp-111
+0x1.d54a2p+116
+0x1.4105b8p+93
+0x1.7d7fbap-52
+0x1.518e02p-62
+0x1.4b5758p-45
+0x1.c515eep-93
+0x1.23932ep+19
+0x1.7e1ee4p-98
+0x1.0599ccp+51
+0x1.e26478p-78
+0x1.06e7ecp-28
+0x1.7e1448p-27
+0x1.98fb06p+8
+0x1.b8d9a6p+88
+0x1.090d4ep-55
+0x1.ca936cp+20
+0x1.3a8d3ap-114
+0x1.f354dcp-56
+0x1.11640ep+63
+0x1.f70288p+70
+0x1.4ad00cp+32
+0x1.7f8a8cp-31
+0x1.78d6ccp-34
+0x1.b33008p-105
+0x1.2fd46p-96
+0x1.557cbp-19
+0x1.426d22p-117
+0x1.009ed6p+59
+0x1.1112f8p+115
+0x1.7a21acp-71
+0x1.1a4cd6p+42
+0x1.982becp-21
+0x1.f5dabcp+106
+0x1.884e24p+65
+0x1.9ac342p+9
+0x1.138c3p-39
+0x1.00f9e8p-105
+0x1.ffd91ep-120
+0x1.997a48p-84
+0x1.874cb4p+60
+0x1.98ec16p+51
+0x1.9a371p+20
+0x1.d3818cp+93
+0x1.4a28ep+65
+0x1.1eee44p+44
+0x1.822bp+84
+0x1.9e26a8p+123
+0x1.3c56f4p-16
+0x1.e618fp-17
+0x1.f99f1p-70
+0x1.9d16p-112
+0x1.632eb8p+16
+0x1.d835a6p+41
+0x1.484fd4p-15
+0x1.b42298p-53
+0x1.854f38p-108
+0x1.4c1aa4p-23
+0x1.277a4ap+77
+0x1.f5a3c2p+81
+0x1.46e67p+65
+0x1.c0e96p-102
+0x1.7dfeb8p+93
+0x1.3ed79cp+60
+0x1.508306p+73
+0x1.cbd7b2p+61
+0x1.8307a6p-21
+0x1.c346fcp-23
+0x1.057024p-122
+0x1.4eb468p-90
+0x1.066f76p-1
+0x1.66ebdcp-121
+0x1.c45404p-25
+0x1.1f8fb8p-107
+0x1.57ca58p+36
+0x1.937abcp-34
+0x1.24af16p-30
+0x1.31ec06p-2
+0x1.104f24p+59
+0x1.f8171cp+52
+0x1.15e124p-16
+0x1.a897f8p+16
+0x1.f7581cp+57
+0x1.ece8ep+44
+0x1.742f84p+90
+0x1.c37ae8p+57
+0x1.5bca82p-52
+0x1.d481bp+13
+0x1.12f074p-24
+0x1.fe7e7p-96
+0x1.d1b5ap+106
+0x1.758368p-121
+0x1.aec484p+103
+0x1.81306cp+17
+0x1.5c5cecp+87
+0x1.1f89a4p+5
+0x1.db686cp+36
+0x1.e412f4p+24
+0x1.89ef5cp+65
+0x1.d8f6a6p-87
+0x1.5314d6p-4
+0x1.7fe6d4p-116
+0x1.ce185ap+32
+0x1.cbbd6ep-126
+0x1.986396p+49
+0x1.e33398p-48
+0x1.f1c1f4p+115
+0x1.d7075p-95
+0x1.85e7bp-82
+0x1.53e2ccp-50
+0x1.b9679p-66
+0x1.d0bd04p-87
+0x1.8d73eep+53
+0x1.cbe57cp-57
+0x1.4dbacap-94
+0x1.27fb48p+97
+0x1.1977b8p-125
+0x1.3016bap-92
+0x1.d8c6a6p+88
+0x1.9de6b8p+22
+0x1.7f1ebap+57
+0x1.5e4058p+81
+0x1.bb0b7cp+110
+0x1.98ad46p+23
+0x1.3d6e64p-101
+0x1.3ace6cp+69
+0x1.b2ad5p+16
+0x1.fdf974p-123
+0x1.b452f4p+49
+0x1.1e1822p+65
+0x1.bd61a4p-42
+0x1.96fc0cp-3
+0x1.154f14p+121
+0x1.b5946p-95
+0x1.863008p+58
+0x1.d5682ap+41
+0x1.46a32cp+2
+0x1.7fa148p-74
+0x1.dd3f46p-27
+0x1.4605b2p-96
+0x1.b3ab48p+49
+0x1.98b7bp-60
+0x1.8f97a8p-82
+0x1.af6528p-102
+0x1.97a874p+51
+0x1.cdf372p-86
+0x1.a6a82ep-21
+0x1.d9015cp+103
+0x1.10140ap+19
+0x1.259fb2p-104
+0x1.718298p-75
+0x1.b2955cp-21
+0x1.4dc66p-101
+0x1.16680ep-118
+0x1.f5c2b6p+65
+0x1.6cb9e4p-96
+0x1.68cc5cp-63
+0x1.6a69ccp-56
+0x1.268758p-1
+0x1.9fff9ep-57
+0x1.6f229p-58
+0x1.4fe5dep-4
+0x1.132c8p+78
+0x1.2336a6p+88
+0x1.0d571ep+81
+0x1.da119cp+57
+0x1.87a81cp-82
+0x1.166246p+13
+0x1.0c61cap+103
+0x1.f06688p+90
+0x1.cdc4c4p-79
+0x1.73443cp+4
+0x1.9b1b68p-92
+0x1.1765e2p-94
+0x1.ad115cp-49
+0x1.3094ap-19
+0x1.6a3556p+82
+0x1.cdb526p-80
+0x1.abfb12p+111
+0x1.d07accp-82
+0x1.89c7acp+20
+0x1.de58cp+20
+0x1.c0daf8p-24
+0x1.e46e38p-127
+0x1.2e25a4p+40
+0x1.4d0512p+7
+0x1.30cb0ep-29
+0x1.5acfap+116
+0x1.10b526p+99
+0x1.92a2f8p-118
+0x1.d232e8p-115
+0x1.9cb39ep+83
+0x1.00932cp+61
+0x1.b8c878p-15
+0x1.ea4a42p+48
+0x1.eaee6p+71
+0x1.f14842p+62
+0x1.1a5b82p-19
+0x1.ad7ap-91
+0x1.9ec11ep+24
+0x1.fe8dccp-113
+0x1.31f07cp+35
+0x1.044952p-23
+0x1.ef381cp-51
+0x1.c742fp+122
+0x1.f3e7f6p-126
+0x1.09f72cp-62
+0x1.9815fap+74
+0x1.8ef758p-111
+0x1.b8019cp-14
+0x1.6d17b8p-80
+0x1.4fe49p-89
+0x1.204356p-91
+0x1.740898p+95
+0x1.614624p-60
+0x1.c35984p-86
+0x1.bd40c8p+103
+0x1.8c1b9ap-24
+0x1.53d4b6p+49
+0x1.3db80cp+124
+0x1.504facp+30
+0x1.89207cp+51
+0x1.0c09d8p-38
+0x1.7a9eecp-40
+0x1.98f19cp-97
+0x1.cde426p-66
+0x1.c1992cp-81
+0x1.f71a8cp+110
+0x1.24a564p+101
+0x1.0faedp+29
+0x1.69b9f8p-80
+0x1.021294p-110
+0x1.9e58b4p+80
+0x1.825bd4p-37
+0x1.26db6ep-111
+0x1.f377e8p-59
+0x1.589518p+36
+0x1.f51bep+120
+0x1.c71048p+125
+0x1.e5ead2p+27
+0x1.3bff94p-119
+0x1.65f91cp+69
+0x1.eaf6cp+109
+0x1.cafb1cp-84
+0x1.38170cp-16
+0x1.75855ap+5
+0x1.688904p+122
+0x1.6f5462p-115
+0x1.60974cp-20
+0x1.dfd768p+54
+0x1.598a26p-4
+0x1.ab96d4p-69
+0x1.40d872p-62
+0x1.5bee38p-12
+0x1.b0c6f6p+85
+0x1.98041cp-74
+0x1.4275ep-55
+0x1.b6a0e4p+124
+0x1.ee4472p+79
+0x1.dcad5ep+120
+0x1.ede43ep-92
+0x1.01d3fp-127
+0x1.cb73f8p-85
+0x1.d9653p+1
+0x1.fb7fbep-1
+0x1.07830ep-83
+0x1.4aac7ep+2
+0x1.dfa09ep+41
+0x1.df5dc6p+5
+0x1.1a87c8p+71
+0x1.560c8ap-47
+0x1.1e508ap-70
+0x1.66538cp+118
+0x1.502268p-125
+0x1.9bea34p-82
+0x1.61c4acp+54
+0x1.bf1d4p-103
+0x1.3390f6p-14
+0x1.d806c6p+36
+0x1.07738ep-77
+0x1.da58eap-124
+0x1.863838p+83
+0x1.2a550ap-75
+0x1.79654ep+104
+0x1.874ddcp-119
+0x1.b8fd6p-125
+0x1.6f4f02p+43
+0x1.1fd48ap+58
+0x1.f83e6ap+73
+0x1.8c87fap-77
+0x1.ec4838p-7
+0x1.122f66p+100
+0x1.29047ap+100
+0x1.79ae82p+47
+0x1.b11164p+107
+0x1.d11e6cp-92
+0x1.99a08cp+122
+0x1.cc87e4p+108
+0x1.1df93ap+84
+0x1.ffa4c8p+26
+0x1.889ffcp+62
+0x1.102e0ep-65
+0x1.5a8feep+30
+0x1.c35a4p-38
+0x1.d82d9cp+26
+0x1.d40506p+21
+0x1.9907b4p+72
+0x1.4bc558p+9
+0x1.7b50c6p+114
+0x1.508d96p-1
+0x1.1485cep-35
+0x1.226084p+109
+0x1.a5e10ep-38
+0x1.efdbfp-48
+0x1.f5a8e6p-92
+0x1.b6110cp-102
+0x1.7565ecp-10
+0x1.fbf5p+17
+0x1.f12abp-86
+0x1.e56478p-89
+0x1.e94aap-93
+0x1.f1c6d4p-75
+0x1.69ed0ep-54
+0x1.f337c4p+81
+0x1.5a565p+87
+0x1.ff5e74p+18
+0x1.e63068p-12
+0x1.830d7cp+105
+0x1.28a0c4p-45
+0x1.53236p-73
+0x1.9aaf0ap-38
+0x1.95b8b8p+18
+0x1.78b7a6p-31
+0x1.0d14aep+71
+0x1.4e3e3cp+87
+0x1.4c1aeap-5
+0x1.05d63cp-76
+0x1.809422p-3
+0x1.4e06f6p+42
+0x1.8e62p+67
+0x1.308398p-112
+0x1.76b8dep-29
+0x1.a1948p-99
+0x1.061da4p+3
+0x1.6333bp+85
+0x1.cce084p+39
+0x1.93a29ap+24
+0x1.ec39e8p+77
+0x1.74f824p-49
+0x1.03d684p+119
+0x1.51b42cp-116
+0x1.825782p-65
+0x1.02080ep-34
+0x1.49a78ap+22
+0x1.bf775p-78
+0x1.e14de2p+63
+0x1.f0ed2p-32
+0x1.3e66fp+87
+0x1.67f3a4p+44
+0x1.221c8ep+0
+0x1.89fe2cp+13
+0x1.31081ap-117
+0x1.0b9c12p-77
+0x1.80e67p+24
+0x1.b0798ap+122
+0x1.b2fafep-4
+0x1.0a5278p+43
+0x1.61c05cp+27
+0x1.6db74cp-99
+0x1.3f0a0ap+43
+0x1.84026ep+59
+0x1.6ca854p+30
+0x1.491302p-2
+0x1.851e0cp-9
+0x1.f55decp+104
+0x1.e936e8p-108
+0x1.2ecd9p+57
+0x1.750412p-34
+0x1.d9789cp-3
+0x1.c2c19p-78
+0x1.dc53dcp-122
+0x1.75107p+9
+0x1.dae6cp-29
+0x1.e2703p-77
+0x1.f0a792p+9
+0x1.60261p-29
+0x1.fad1b6p+93
+0x1.d35d9p+35
+0x1.51e05p-34
+0x1.8c1d74p+97
+0x1.7444d4p-45
+0x1.c55458p-92
+0x1.bb5c4ep+40
+0x1.e2749p-46
+0x1.965864p+5
+0x1.1edcf2p-69
+0x1.9641a6p+47
+0x1.4c72ecp-115
+0x1.40a138p-103
+0x1.d9a2cp-52
+0x1.c1c2b8p+86
+0x1.90c1dp+35
+0x1.3e9a3p+123
+0x1.355362p+116
+0x1.acfd24p-96
+0x1.5b85f8p+55
+0x1.bf45fp+8
+0x1.a12c4ep-29
+0x1.f9b272p-78
+0x1.bcffe4p-60
+0x1.d2aa46p+40
+0x1.a0a524p+57
+0x1.c07822p-113
+0x1.e79e9p-37
+0x1.0b0c1p-59
+0x1.97b7d6p+37
+0x1.7fe50cp+22
+0x1.c117c4p+126
+0x1.f98134p+17
+0x1.423bf2p-19
+0x1.a1b2f4p+106
+0x1.94c3ep+70
+0x1.c8697p+2
+0x1.7e2746p-60
+0x1.797a46p-54
+0x1.7b60f2p-102
+0x1.cadc0cp-76
+0x1.d67bep-34
+0x1.454c1p+4
+0x1.d25adcp-53
+0x1.6ab0ccp-4
+0x1.dfeefcp+66
+0x1.aebe38p-54
+0x1.216b2ap-125
+0x1.85c3acp+112
+0x1.fbb2cep+23
+0x1.cb1b8cp-3
+0x1.c66ed4p+21
+0x1.f23988p+30
+0x1.f584e8p+103
+0x1.6342b8p+48
+0x1.c562e4p+94
+0x1.1ac782p-96
+0x1.b42c44p+69
+0x1.e71db6p-49
+0x1.e83c9p+95
+0x1.1c55bep-63
+0x1.3a8884p+87
+0x1.60d3b4p+105
+0x1.be6558p+110
+0x1.bab6b6p-78
+0x1.16a99p+85
+0x1.0dbf68p+17
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 06/17] benchtests: Add log2p1f benchmark
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (4 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 05/17] benchtests: Add log10f benchmark Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-29 18:57   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 07/17] benchtests: Add log1p benchmark Adhemerval Zanella
                   ` (11 subsequent siblings)
  17 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

It is based on log2f data.
---
 benchtests/Makefile       |    1 +
 benchtests/log2p1f-inputs | 2888 +++++++++++++++++++++++++++++++++++++
 2 files changed, 2889 insertions(+)
 create mode 100644 benchtests/log2p1f-inputs

diff --git a/benchtests/Makefile b/benchtests/Makefile
index f948139ace..92c0cf5e7d 100644
--- a/benchtests/Makefile
+++ b/benchtests/Makefile
@@ -75,6 +75,7 @@ bench-math := \
   log1p \
   log2 \
   log2f \
+  log2p1f \
   logb \
   logbf \
   logf \
diff --git a/benchtests/log2p1f-inputs b/benchtests/log2p1f-inputs
new file mode 100644
index 0000000000..50a9739476
--- /dev/null
+++ b/benchtests/log2p1f-inputs
@@ -0,0 +1,2888 @@
+## args: float
+## ret: float
+## includes: math.h
+## name: workload-spec2017.wrf
+0x1.fe4c3p-1
+0x1.0e33e6p+1
+0x1.00000ap+0
+0x1.900028p+4
+0x1.f8cdeep+0
+0x1.332986p+7
+0x1.493696p+0
+0x1p+0
+0x1.38c67p+7
+0x1.029046p+1
+0x1.1bd31cp+4
+0x1.bb3e3ep+12
+0x1.000098p+0
+0x1.a7971p+7
+0x1p+0
+0x1.0001a8p+0
+0x1.00004ep+0
+0x1p+0
+0x1.0606f2p+0
+0x1.3e54a8p+11
+0x1.3a0662p+3
+0x1.000c72p+0
+0x1p+0
+0x1.0bf8b6p+0
+0x1.000204p+0
+0x1.500ad2p+0
+0x1p+0
+0x1.3e4cfp+8
+0x1.00006cp+0
+0x1.54f7fp+0
+0x1.267858p+0
+0x1.191ccp+0
+0x1.0cdb18p+1
+0x1.29bf1ep+15
+0x1.64bd92p+1
+0x1.255534p+0
+0x1p+0
+0x1.93bb82p+3
+0x1.1348ep+1
+0x1.00456ep+0
+0x1.08afbcp+8
+0x1.32c37ep+0
+0x1.3437cep-1
+0x1.000214p+0
+0x1.03d5ap+0
+0x1.172378p+6
+0x1p+0
+0x1.330f22p-1
+0x1.00b91p+0
+0x1.e831f2p+15
+0x1.092318p+9
+0x1p+0
+0x1.e80902p+7
+0x1.71ec54p+2
+0x1.1935dcp+0
+0x1.651082p+14
+0x1p+0
+0x1.0f41d8p+8
+0x1.17f4p+0
+0x1.7cf946p+9
+0x1.b14396p+0
+0x1.92f94p+1
+0x1.2f3784p-1
+0x1p+0
+0x1.305ad4p-1
+0x1.002a08p+0
+0x1.3e338p+5
+0x1.1863f6p+8
+0x1p+0
+0x1.ed8fd8p+58
+0x1p+0
+0x1p+0
+0x1.215fc8p+9
+0x1.1965bep+16
+0x1.00031cp+0
+0x1.00011p+0
+0x1p+0
+0x1.e384fep-20
+0x1p+0
+0x1.00020cp+0
+0x1.007e24p+0
+0x1.b14346p+0
+0x1.243ff8p+0
+0x1.3f6ac2p+3
+0x1.816ff6p+5
+0x1.0115ap+8
+0x1.162028p+16
+0x1.62692cp+0
+0x1.0227c8p+1
+0x1.4dda3ep+0
+0x1.418696p+0
+0x1.0272f4p+2
+0x1.62c6ecp+5
+0x1.3cd07ap+18
+0x1.0191eap+0
+0x1.21c3a2p+8
+0x1p+0
+0x1.000bf6p+0
+0x1.a4b51cp+7
+0x1.04d1f8p+0
+0x1.8de2b8p+0
+0x1.7b7a4ep+8
+0x1.1928acp+5
+0x1.305a8p-1
+0x1.ba8662p+5
+0x1p+0
+0x1.ab75a2p-12
+0x1.7cc13cp+9
+0x1.505306p+0
+0x1.63085p+0
+0x1.000064p+0
+0x1.b3f16ap+7
+0x1.1348f8p+1
+0x1.71fe88p+1
+0x1.0b7132p+4
+0x1.470316p+1
+0x1.3228b6p-1
+0x1.8dd666p+0
+0x1.38ed88p+12
+0x1.432218p+0
+0x1.00e0cap+0
+0x1.73eb44p+2
+0x1p+0
+0x1p+0
+0x1.bda15ep+7
+0x1.0272fep+2
+0x1.00171ep+0
+0x1p+0
+0x1.3faa86p+3
+0x1.33c2a2p-1
+0x1.3e48e2p+7
+0x1.017ef2p+0
+0x1.30115ap-1
+0x1.587444p+0
+0x1.3efed8p+8
+0x1.8a5526p+0
+0x1.cb1ecap+15
+0x1.1f5cp+0
+0x1.0001a4p+0
+0x1.1a20dap+7
+0x1.376e6p+0
+0x1.0001aap+0
+0x1.9182f6p-1
+0x1.000292p+0
+0x1.3d46a2p+12
+0x1.e177b6p+7
+0x1.3f5646p+1
+0x1.2ab784p+9
+0x1.dc81b4p+1
+0x1.0ef326p+0
+0x1.996588p-12
+0x1.740848p+3
+0x1.00016p+0
+0x1.ffd51ap+52
+0x1p+0
+0x1.4461ap+4
+0x1.08e7bcp+51
+0x1p+0
+0x1.106e98p+3
+0x1.5490e4p+0
+0x1.46703cp+4
+0x1.6b1e86p-29
+0x1.324caap+0
+0x1.0467ccp+0
+0x1.424574p+0
+0x1p+0
+0x1.001da4p+0
+0x1.364604p+0
+0x1p+0
+0x1.0951e2p+8
+0x1.408994p+0
+0x1.0003ap+0
+0x1.619e92p+12
+0x1.313e72p+2
+0x1.8b47p-6
+0x1.2190fp+2
+0x1.20aaacp+0
+0x1.f0059cp-1
+0x1p+0
+0x1.018e78p+0
+0x1.313e1p+2
+0x1p+0
+0x1.2efce4p-1
+0x1.5ebdap+0
+0x1p+0
+0x1.5e2488p+51
+0x1.bf95f2p+5
+0x1.5a1124p+16
+0x1.73bad6p+1
+0x1.00048ap+0
+0x1.0c9beap+8
+0x1p+0
+0x1.358c08p+7
+0x1.7f834ep-26
+0x1.3e56bcp+15
+0x1.52d8b2p+15
+0x1p+0
+0x1.00109cp+0
+0x1.0a0bb2p+0
+0x1p+0
+0x1.026908p+6
+0x1.370f22p+0
+0x1.5c6c5ap+1
+0x1.7fe4bcp+2
+0x1p+0
+0x1p+0
+0x1.42be68p+49
+0x1.0000d8p+0
+0x1.3abdf8p+12
+0x1.370a44p-12
+0x1.aef9f4p+0
+0x1.00001ep+2
+0x1.017c2p+0
+0x1.00b614p+0
+0x1.32f9f8p-1
+0x1p+0
+0x1.00ebf2p+0
+0x1.0c3116p+0
+0x1.00004p+0
+0x1.03b992p+0
+0x1p+0
+0x1.24eb3cp+0
+0x1.4c73ecp+51
+0x1.fad3ep+1
+0x1p+0
+0x1.32368ap-1
+0x1.000908p+0
+0x1.5ea59ep+12
+0x1.1928ccp+5
+0x1p+0
+0x1.21a93cp+8
+0x1p+0
+0x1.0001e8p+0
+0x1.95b6c2p-12
+0x1.00002p+0
+0x1.2399fap+9
+0x1.449b44p+0
+0x1p+0
+0x1.64a766p+15
+0x1.06ccecp+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.c81f9cp+1
+0x1.5ef196p+0
+0x1.022822p+1
+0x1.99beep+3
+0x1.1f417p+8
+0x1p+0
+0x1.c08726p+5
+0x1.397d9ep+0
+0x1.88e748p+18
+0x1.3b319p+9
+0x1.2fd3b6p-1
+0x1.0001aep+0
+0x1.4a0562p+5
+0x1.4e5f1ap+0
+0x1p+0
+0x1.017fbp+0
+0x1.acaf56p+57
+0x1.ef7d66p+8
+0x1.736c3cp+1
+0x1.12ddbep+0
+0x1.b85ebcp+6
+0x1.0e259p+1
+0x1.5cc2c4p+2
+0x1.99e614p+3
+0x1.f30aa6p+2
+0x1.3911c6p+15
+0x1.119b92p+1
+0x1.352a3p-1
+0x1.0001b2p+0
+0x1.00b26p+0
+0x1.bd730ep+60
+0x1.54fc5p+0
+0x1.5a4804p+0
+0x1.ff7eaep-1
+0x1.5cc268p+2
+0x1.1077aap+2
+0x1.1723d6p+0
+0x1p+0
+0x1p+0
+0x1.30c17p-1
+0x1.000648p+0
+0x1.91aa4cp+6
+0x1.17234p+6
+0x1p+0
+0x1.6d5b18p+2
+0x1.00027ap+0
+0x1.dc8224p+1
+0x1.a9eabep-6
+0x1.099edcp+1
+0x1.004118p+1
+0x1.58d5fcp+60
+0x1.000098p+0
+0x1.004e8p+0
+0x1.f32edap-1
+0x1.0394aep+0
+0x1.0689bp+2
+0x1.124e5cp+0
+0x1.71fe86p+1
+0x1.025ce2p+0
+0x1.46107cp+0
+0x1.047c74p+2
+0x1.a57e74p+15
+0x1.18bbcep+0
+0x1p+0
+0x1.65b9a4p+0
+0x1.0000eep+0
+0x1.08a4a4p+0
+0x1.0fe774p+1
+0x1.000128p+0
+0x1.3e95fp+12
+0x1.b14e3ap-56
+0x1.00007cp+0
+0x1.5619c2p+1
+0x1.4ac958p+0
+0x1.00031p+0
+0x1.003064p+0
+0x1.e119eap-1
+0x1.577b36p+0
+0x1p+0
+0x1.26ff2ap+0
+0x1.004ap+0
+0x1.0000a2p+0
+0x1.1fcc7ep+4
+0x1.6f959p+16
+0x1.000064p+0
+0x1.375c6ap+0
+0x1.6a806ep+2
+0x1p+0
+0x1.8e27aep+1
+0x1p+0
+0x1.000b22p+0
+0x1.8f0c12p+0
+0x1.192892p+5
+0x1.2bcaacp+1
+0x1.984264p+2
+0x1.0034cp+0
+0x1p+0
+0x1.abf4dp+0
+0x1.001044p+0
+0x1.0d26f4p+0
+0x1.626906p+0
+0x1.8bf0c2p+5
+0x1.02d288p+0
+0x1.900128p+4
+0x1.bbbbcp+12
+0x1.45fa5p+0
+0x1p+0
+0x1.01bef2p+0
+0x1.524f26p+2
+0x1.083b0ep+0
+0x1.4811e4p+0
+0x1.0163a8p+0
+0x1.9570fap+15
+0x1.3022f2p-1
+0x1.14c73ap+0
+0x1.0009d8p+0
+0x1.056b92p+63
+0x1.0025a4p+0
+0x1.36aad4p+17
+0x1.05c244p+8
+0x1.d00886p+17
+0x1.001188p+0
+0x1.3376ecp-1
+0x1.6719c8p+16
+0x1.02495p+0
+0x1.fd9bacp-1
+0x1.3882c6p+6
+0x1.3cb358p+0
+0x1.0ec93ep+0
+0x1.4fd2bap+1
+0x1.f8b68p+1
+0x1.33b1f2p-1
+0x1.ba7f4cp+1
+0x1p+0
+0x1.44a3d2p-17
+0x1.9a6a8p+2
+0x1.00918ap+6
+0x1.30d50ep-1
+0x1p+0
+0x1.0001bep+0
+0x1.05b93ep+0
+0x1.aa9d98p+0
+0x1.039b74p+0
+0x1.1ac25ep+8
+0x1p+0
+0x1.12b23ap+1
+0x1.4c5c52p+0
+0x1.07de64p+0
+0x1.950f94p+1
+0x1.001caap+47
+0x1.0a9448p+0
+0x1.01026cp+0
+0x1.03d74ap+0
+0x1p+0
+0x1.0032dap+0
+0x1.380922p-1
+0x1.c0e7ccp+15
+0x1.a35e4p+4
+0x1.25b1e6p+0
+0x1.000044p+2
+0x1.05ac24p+7
+0x1.1fa744p+44
+0x1.0007b2p+0
+0x1.2cca62p+2
+0x1.04be3ap+6
+0x1.00065p+0
+0x1.2b9f3ap+1
+0x1.74085p+3
+0x1p+0
+0x1.01fc4cp+0
+0x1.e137bcp+2
+0x1.097ac8p+0
+0x1.ad1458p+4
+0x1.c8587cp+1
+0x1.31d172p-1
+0x1.0b414ap+1
+0x1.664e36p+1
+0x1.30ae16p-1
+0x1p+0
+0x1.3b7e3cp+2
+0x1.9cc348p+64
+0x1p+0
+0x1p+0
+0x1.cdb384p-32
+0x1p+0
+0x1.00b998p+0
+0x1.36b69ep-1
+0x1.939538p+4
+0x1.dc9deep+4
+0x1.36f86ep+2
+0x1.02113cp+0
+0x1.035852p+0
+0x1.9de428p+2
+0x1.369814p+1
+0x1.147f44p+3
+0x1.031bc8p+0
+0x1.03f7cp+0
+0x1.000924p+0
+0x1.145e14p+2
+0x1.0000d4p+0
+0x1p+0
+0x1.54fdfp+2
+0x1.07c0ep+0
+0x1.829aeep+1
+0x1.000f08p+0
+0x1.34dcdp-1
+0x1p+0
+0x1.cd56e4p+1
+0x1.16400ap+8
+0x1p+0
+0x1.00000ap+2
+0x1.00a21p+0
+0x1.8d6286p+6
+0x1.de4f28p+1
+0x1.9f55b6p+48
+0x1.01c802p+0
+0x1.0327cp+0
+0x1.32fb52p-1
+0x1p+0
+0x1.2525dcp+0
+0x1.91da28p-6
+0x1.5a23a8p+0
+0x1.5f024ap+1
+0x1p+0
+0x1.0008f2p+0
+0x1.05563cp+0
+0x1.89381cp+0
+0x1.8bb056p+16
+0x1.7cc93ep+1
+0x1.8bf0acp+5
+0x1.1722bap+6
+0x1p+0
+0x1.00238ep+0
+0x1.ebb8d2p-1
+0x1.001194p+0
+0x1.6cd388p+1
+0x1.08e4bp+8
+0x1.00002p+0
+0x1.01a0bep+0
+0x1.00e7cep+8
+0x1.1193p+0
+0x1.06a9c8p+0
+0x1.11c7fep+0
+0x1.5ef17cp+0
+0x1.4ae72cp+0
+0x1.e0df4cp+41
+0x1.7e5468p+1
+0x1.8dd478p+0
+0x1.3c2784p+51
+0x1p+0
+0x1p+0
+0x1.b9d454p+12
+0x1.011a58p+0
+0x1.3efb48p+4
+0x1.000208p+0
+0x1.57b3eep+7
+0x1.000004p+0
+0x1.1cd6b8p+0
+0x1.c366fap+9
+0x1.466d2cp+0
+0x1p+0
+0x1.300096p-1
+0x1p+0
+0x1.bef388p+0
+0x1.0c20e8p+8
+0x1.397f2p+4
+0x1.037596p+2
+0x1.62a0a4p+52
+0x1.37269ap+0
+0x1.81fe24p+2
+0x1.dd4196p+56
+0x1.b143ep+0
+0x1p+0
+0x1.b8c2fp+1
+0x1.056b3ep+1
+0x1.3b6cbp+0
+0x1.3ffb2p+0
+0x1p+0
+0x1.3c21cp+0
+0x1.00312cp+0
+0x1p+0
+0x1.3822f8p+0
+0x1.02734p+2
+0x1.05a7dap+0
+0x1.6df1b4p+5
+0x1.0006f4p+0
+0x1.31aebep-1
+0x1p+0
+0x1p+0
+0x1.b997fap+18
+0x1.0570d8p+0
+0x1p+0
+0x1.0a9216p+42
+0x1.ef16f2p+1
+0x1p+0
+0x1.31269ep-1
+0x1.a9954ap+2
+0x1.1cc5e8p+0
+0x1.01d334p+0
+0x1.905f98p+4
+0x1.0310d4p+0
+0x1.16a62ap+0
+0x1.8dd6b2p+0
+0x1.395dcep+7
+0x1.ef5f92p+0
+0x1.000868p+0
+0x1p+0
+0x1.844a16p+2
+0x1.452efcp+0
+0x1p+0
+0x1.1c5da2p+6
+0x1.31ac3ap-1
+0x1.cc1bfp+2
+0x1p+0
+0x1.08215ap+0
+0x1.3b4306p+0
+0x1.71fe6p+1
+0x1.192bd8p+0
+0x1.262f78p+0
+0x1.00013cp+0
+0x1.33c486p-1
+0x1.000014p+0
+0x1.b8f4fp+1
+0x1.5f9f5ap-1
+0x1.059872p+0
+0x1p+0
+0x1.58168p+1
+0x1.826d5cp+0
+0x1p+0
+0x1.032a04p+0
+0x1p+0
+0x1.0c0a5cp+0
+0x1.668d9p+0
+0x1.2f9644p-1
+0x1p+0
+0x1.1821b8p+6
+0x1.b22e8ep+7
+0x1.4f7a78p+0
+0x1.52df24p+0
+0x1.48c612p+0
+0x1.93a19ap+4
+0x1.8bf102p+5
+0x1.122d94p+0
+0x1p+0
+0x1.00018p+0
+0x1.30083ap-1
+0x1p+0
+0x1p+0
+0x1.30d20ep-1
+0x1p+0
+0x1.0000dcp+0
+0x1.285bb4p+0
+0x1p+0
+0x1.0003a4p+0
+0x1p+0
+0x1.2ffcfcp-1
+0x1.093d96p+0
+0x1.239bfcp+0
+0x1.f7c33cp-27
+0x1.a9982ep+2
+0x1.1969f4p+4
+0x1.ff5c88p-1
+0x1.04db6ep+2
+0x1p+0
+0x1.f010dap-1
+0x1.13647p+7
+0x1p+0
+0x1.ea6e18p-10
+0x1.2d16eap+0
+0x1.02b668p+0
+0x1.191704p+4
+0x1.18f2b4p+0
+0x1.b186eap+0
+0x1.24c01ap+2
+0x1.6a3adap+16
+0x1p+0
+0x1p+0
+0x1.2f9f28p-1
+0x1.4b5da4p+0
+0x1.004054p+0
+0x1.002616p+8
+0x1.561954p+1
+0x1p+0
+0x1.4c4394p+0
+0x1.1eed34p+1
+0x1.a702eap+5
+0x1.ee054p+7
+0x1.1156a8p+0
+0x1.9a81fcp+2
+0x1.10ce16p-28
+0x1.b18b88p+0
+0x1.d9c4a8p+1
+0x1.0e275cp+0
+0x1.905f58p+4
+0x1p+0
+0x1.02f774p+0
+0x1.7ce226p+1
+0x1.0002bcp+0
+0x1.010f58p+0
+0x1p+0
+0x1.000198p+0
+0x1p+0
+0x1.4aa832p+0
+0x1.0006c2p+0
+0x1.358ca4p+7
+0x1.1edc64p+0
+0x1.003508p+0
+0x1.fdb69p+1
+0x1.0ff4fep+0
+0x1p+0
+0x1.b8c2fp+1
+0x1.284c16p+0
+0x1.00a228p+0
+0x1.03080cp+0
+0x1.91a8f4p+48
+0x1p+0
+0x1.2080fep+1
+0x1.0002f8p+0
+0x1.b14338p+0
+0x1.081288p+0
+0x1.71b9bep+0
+0x1.09c368p+0
+0x1.35ed64p+0
+0x1.8dd68cp+0
+0x1.d2cc42p+0
+0x1.9be0ecp+3
+0x1.7407fcp+3
+0x1.313ecp-1
+0x1.cdc978p+0
+0x1.0ed538p+1
+0x1.159af4p+8
+0x1p+0
+0x1.128694p+0
+0x1.2f1b06p-1
+0x1.19c0d8p+0
+0x1.dcc7c8p+1
+0x1.a33f8ap+7
+0x1.000158p+0
+0x1p+0
+0x1.28bdaep-16
+0x1.74086cp+3
+0x1.ea297cp+1
+0x1.5d87fp+2
+0x1.0e2658p+1
+0x1.621c14p+1
+0x1.9d8a8cp+3
+0x1p+0
+0x1.7807e8p+3
+0x1.74c924p+0
+0x1.a484e4p+53
+0x1.771c44p+0
+0x1.13d1e4p+2
+0x1.2fa402p-1
+0x1p+0
+0x1.024d72p+2
+0x1.064c6ap+8
+0x1.15d2dep+0
+0x1.9c004ep+3
+0x1.bc2fcap+12
+0x1.befdbep+0
+0x1.36461p+0
+0x1.6db7b8p+5
+0x1.0000cp+0
+0x1p+0
+0x1.02f354p+0
+0x1p+0
+0x1.000228p+0
+0x1.013fep+0
+0x1.213782p+0
+0x1p+0
+0x1.000204p+0
+0x1.a69cccp+7
+0x1.0036acp+0
+0x1.0982b8p+0
+0x1.81693cp-22
+0x1.1e5d64p+6
+0x1.0009f2p+0
+0x1.2fe96p-1
+0x1.0368f8p+0
+0x1.2d2cbep+0
+0x1.37bc04p-1
+0x1p+0
+0x1.d45d88p+1
+0x1.000694p+0
+0x1.000272p+0
+0x1p+0
+0x1.d0b2e6p+1
+0x1.2598a4p+3
+0x1p+0
+0x1.8b7d3p+2
+0x1.192902p+5
+0x1.3d5386p+0
+0x1.9c779ap+1
+0x1.08257cp+0
+0x1.0b8a4p+2
+0x1.01afa4p+3
+0x1.e48b7ap-1
+0x1.f30a5cp+2
+0x1.0df814p+0
+0x1.2f28p-1
+0x1.983f46p+3
+0x1.009094p+6
+0x1.326a3ep-1
+0x1.9767e6p+0
+0x1.1027fp+0
+0x1.3274f8p-1
+0x1.197a9cp+1
+0x1.3807p+2
+0x1.90533p+4
+0x1.0332ecp+0
+0x1.3ca37p+0
+0x1p+0
+0x1p+0
+0x1.3ff4dcp+0
+0x1p+0
+0x1.900046p+0
+0x1p+0
+0x1.195576p+5
+0x1.aec2ecp+7
+0x1.65b984p+0
+0x1.74677p+3
+0x1.423322p+0
+0x1.aeef9ep+16
+0x1.0338c4p+0
+0x1.1ae22ap+8
+0x1.cc4adcp+0
+0x1.d20a9ep+0
+0x1.cdbefcp-45
+0x1.03b23cp+0
+0x1.25970cp+3
+0x1.e6b02ep-1
+0x1p+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.000aa8p+0
+0x1.0054a4p+0
+0x1.06600ap+0
+0x1.b8601cp+6
+0x1.fea92cp+5
+0x1.6p+5
+0x1.c76586p+0
+0x1.90007ap+0
+0x1.ef2d1p-84
+0x1.03d5b6p+0
+0x1.0164ecp+0
+0x1.4441d8p+0
+0x1.005c42p+0
+0x1.046838p+0
+0x1.51f04ap+0
+0x1.cf822cp+0
+0x1.033b4ap+0
+0x1p+0
+0x1.091bep+0
+0x1p+0
+0x1.5bb2a4p+0
+0x1.01fe2cp+0
+0x1.2b96p+1
+0x1.242d9p+0
+0x1.42ade4p+0
+0x1p+0
+0x1.689714p+2
+0x1.4ac756p+0
+0x1p+0
+0x1.101ad8p+0
+0x1.6208e8p+41
+0x1.47091p+0
+0x1.3e28p+3
+0x1.04b70ep+0
+0x1p+0
+0x1.086c9p+0
+0x1.70eb62p+54
+0x1.dfb744p+4
+0x1p+0
+0x1.f302bcp-8
+0x1.8d5fd4p+6
+0x1.12d9a8p+0
+0x1.00a39p+0
+0x1p+0
+0x1.00003cp+0
+0x1.00031p+0
+0x1.58743ep+0
+0x1.003ae4p+0
+0x1.7de5cep+2
+0x1.096c7ep+0
+0x1.57e436p+1
+0x1.21fcb4p+2
+0x1.31297ap-1
+0x1p+0
+0x1.ab5fcp+16
+0x1.91e912p+42
+0x1.5cb206p+1
+0x1.000072p+0
+0x1.00f4d2p+0
+0x1.0ee52p+0
+0x1.000014p+0
+0x1.2f3a5ep-1
+0x1.3fc07cp+1
+0x1.64bd36p+1
+0x1.f48f56p-1
+0x1.0115f4p+0
+0x1.1650bcp+2
+0x1.013494p+0
+0x1p+0
+0x1.684e92p+0
+0x1.0063a4p+0
+0x1.3ca364p+0
+0x1.197a48p+1
+0x1.00a6f4p+0
+0x1.31ce92p-1
+0x1.fea91ep+5
+0x1.6dd5cep+5
+0x1.05035ep+8
+0x1.6d6acep+5
+0x1.8c4fa2p+5
+0x1.f4e59cp-12
+0x1.6330e4p+0
+0x1.01a9fep+0
+0x1.4f48e4p+0
+0x1.d589c6p+1
+0x1.5be04ap+15
+0x1.f9e2f2p-1
+0x1.294bdp+1
+0x1.8bf1p+5
+0x1.967eb8p-9
+0x1.018d04p+0
+0x1.00032cp+0
+0x1p+0
+0x1.ba21bcp+14
+0x1.8dd6bp+0
+0x1.7455a8p+3
+0x1p+0
+0x1.8e8a02p+15
+0x1.015f06p+0
+0x1.04a26p+8
+0x1.000c58p+0
+0x1.26a58cp+3
+0x1.2719bap-19
+0x1p+0
+0x1.05194cp+7
+0x1.34d9f4p+0
+0x1p+0
+0x1.029fa2p+0
+0x1.99a9dap+0
+0x1.cee06ep+0
+0x1.3e921ap+0
+0x1.9f8eep+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.13f606p+0
+0x1p+0
+0x1.0a176ep+2
+0x1.aa9c94p+7
+0x1.1211ep+0
+0x1.122594p+0
+0x1.b39642p+47
+0x1p+0
+0x1.000068p+0
+0x1.6600aep-12
+0x1.e0d6ecp+1
+0x1.0019ep+0
+0x1.34b8f4p-1
+0x1.581728p+2
+0x1.00016p+0
+0x1.12b1ep+8
+0x1.a679fp+14
+0x1.90005ap+4
+0x1.837996p-1
+0x1p+0
+0x1.0e2552p+1
+0x1.22160cp+9
+0x1p+0
+0x1.57e4b4p+1
+0x1p+0
+0x1.bf8d0cp+0
+0x1.d7e10ep+16
+0x1.06bcc8p+0
+0x1.133b12p+0
+0x1.1b6542p+6
+0x1p+0
+0x1.feddbcp-1
+0x1p+0
+0x1p+0
+0x1.2fd98ep-1
+0x1.03d5b6p+0
+0x1p+0
+0x1.db8a46p-1
+0x1.42e588p+0
+0x1.0ee1p+1
+0x1.361fep+0
+0x1.2f74a8p+0
+0x1p+0
+0x1.31596cp-1
+0x1.740a2p+3
+0x1p+0
+0x1.8dd672p+0
+0x1.00011cp+0
+0x1p+0
+0x1.000102p+0
+0x1.5cc2b2p+2
+0x1p+0
+0x1.17f4b4p+0
+0x1.619318p+12
+0x1.b14362p+0
+0x1.c1004ep+0
+0x1.318578p-1
+0x1.9728ecp+2
+0x1.25bdbcp+3
+0x1.37ac8ap+63
+0x1p+0
+0x1.41ef56p+2
+0x1.e65866p-1
+0x1p+0
+0x1.307e0ap+0
+0x1.ef570ep+54
+0x1.0290fap+1
+0x1.9dd308p+0
+0x1.21db9p+0
+0x1.00003cp+0
+0x1.eabf94p+0
+0x1.386614p+10
+0x1.f244dap+16
+0x1p+0
+0x1.00e094p+0
+0x1.5605e6p+1
+0x1.b16374p+2
+0x1.9a2d88p+0
+0x1.48748ap+9
+0x1p+0
+0x1.28e674p+0
+0x1.bf4324p+7
+0x1.2598c6p+3
+0x1.215484p+1
+0x1.05fb5p+51
+0x1.0000d8p+0
+0x1.f389dcp+6
+0x1.41a1bp+0
+0x1.001582p+0
+0x1.1928ecp+5
+0x1.00ff3ep+0
+0x1.3883c4p+13
+0x1.98b044p+2
+0x1.8a43eep+0
+0x1.733e8p+14
+0x1.73ebfcp+2
+0x1.0cd1fp+0
+0x1p+0
+0x1.af357p+5
+0x1.b2c586p+5
+0x1.470f58p+0
+0x1p+0
+0x1p+0
+0x1.0ffddep+0
+0x1.02c422p+1
+0x1.56c4a6p+1
+0x1.492014p-47
+0x1.192862p+5
+0x1p+0
+0x1.c7e222p+7
+0x1p+0
+0x1p+0
+0x1.1a0d3p+49
+0x1.946148p+0
+0x1.524f6ap+2
+0x1.31566ep-1
+0x1.000198p+0
+0x1.3d7efcp+3
+0x1.000264p+0
+0x1.4ed7ccp+0
+0x1.b667ecp+0
+0x1.81940ep+1
+0x1p+0
+0x1.088e6cp+0
+0x1.065bbcp+1
+0x1.009ae4p+1
+0x1.008bfp+6
+0x1.e9f5acp+7
+0x1.1e1c44p+8
+0x1.992348p+0
+0x1.3162fp+0
+0x1.fb0e1ap+48
+0x1.8bf0acp+5
+0x1p+0
+0x1.1f57b2p+60
+0x1.011f3p+0
+0x1.3af642p+0
+0x1.ccae9p+46
+0x1.21325cp+0
+0x1.07743p+7
+0x1.1ae49ep+8
+0x1.00006ap+0
+0x1.1928aap+5
+0x1.838206p-1
+0x1p+0
+0x1.00e9e8p+0
+0x1.4684cap+0
+0x1.02568p+0
+0x1.5efc62p+1
+0x1p+0
+0x1.000352p+0
+0x1.0578cap+0
+0x1.0039ecp+0
+0x1.2fc412p-1
+0x1.4a939ap+1
+0x1.ff27ep+5
+0x1.091a62p+0
+0x1.08c012p+0
+0x1.67c8p+4
+0x1.e26b74p-48
+0x1p+0
+0x1.283076p+3
+0x1.2fe494p-1
+0x1.4dcd9ep+5
+0x1p+0
+0x1.cdf4e4p+7
+0x1p+0
+0x1.c77d16p+1
+0x1.fccf76p-1
+0x1p+0
+0x1.120a84p+0
+0x1.054cdep+0
+0x1.002a0cp+0
+0x1.063b76p+0
+0x1.0000d8p+0
+0x1.30cedep-1
+0x1.003884p+0
+0x1p+0
+0x1.e0065cp-1
+0x1.693bd2p+15
+0x1.0fadc2p+0
+0x1.415d06p+0
+0x1.0002ecp+0
+0x1.27ce08p+0
+0x1.3b9762p+0
+0x1.2fb36p+2
+0x1.02c8f8p+0
+0x1.629facp+50
+0x1.281c56p+3
+0x1.4a93c8p+1
+0x1.0e6cacp-1
+0x1.f9ef4ap+0
+0x1.44f78ap+2
+0x1.9a1e18p+0
+0x1p+0
+0x1.3e566p+3
+0x1.000128p+0
+0x1p+0
+0x1.112c38p+0
+0x1.03d2dap+0
+0x1.5fb222p+12
+0x1.1f4b96p+0
+0x1.01422p+1
+0x1.ee5728p+63
+0x1.4bcdd8p+1
+0x1p+0
+0x1.30e0e4p-1
+0x1.6a36b2p+0
+0x1.00016cp+0
+0x1.04b966p+0
+0x1.106e16p+16
+0x1p+0
+0x1.1233d2p+0
+0x1p+0
+0x1.15d1cap+1
+0x1.137c02p+8
+0x1.00001ap+0
+0x1.07ab74p+0
+0x1.800b4ep-1
+0x1.55047p+0
+0x1.90017ap+4
+0x1.5c9898p+1
+0x1.8ce4ccp+6
+0x1p+0
+0x1.6ee34p+0
+0x1.bf600cp+0
+0x1.f13a7ep+8
+0x1.00015cp+0
+0x1.b9c51ep+12
+0x1.740826p+3
+0x1.c29e5p+1
+0x1.f56ba8p-1
+0x1.37fe18p+2
+0x1.190eap+0
+0x1.419f1cp+0
+0x1p+0
+0x1p+0
+0x1.20687ep+8
+0x1.938ecap+4
+0x1.01dd1cp+0
+0x1.bbe888p+7
+0x1.09d802p+0
+0x1.cf3b8p+0
+0x1.ea0d98p-1
+0x1.172472p+6
+0x1p+0
+0x1.61dce4p+1
+0x1.20b4fcp+0
+0x1.00038cp+0
+0x1p+0
+0x1.0822p+0
+0x1.9966ep+2
+0x1.21f47cp+0
+0x1.3a9762p+0
+0x1.8c4e0cp+5
+0x1p+0
+0x1.61878cp+12
+0x1.3ca348p+0
+0x1.289028p+0
+0x1.06e004p+0
+0x1.02b4b4p+0
+0x1.144eeep+1
+0x1.30a14ap-1
+0x1.07652p+0
+0x1p+0
+0x1.2ef288p+0
+0x1.1ba73cp+5
+0x1.48c714p+2
+0x1.25c508p+3
+0x1.b14382p+0
+0x1.b39acep+0
+0x1.0001c2p+0
+0x1.996938p+3
+0x1p+0
+0x1.e49b2ep+7
+0x1.000436p+0
+0x1.34712p+0
+0x1.47089p+0
+0x1.0353b8p-49
+0x1.2a818p+2
+0x1.00058p+0
+0x1.8a5a7ep+51
+0x1p+0
+0x1.8dbf04p+0
+0x1.5004d8p+61
+0x1.9557b2p+1
+0x1.0fa92cp+0
+0x1.16984ep+8
+0x1.72bd7ap+1
+0x1.980f0cp+1
+0x1.ae63fp+14
+0x1p+0
+0x1.085224p+0
+0x1.d8889ap-1
+0x1.1d3ff6p+4
+0x1.02c6ecp+1
+0x1.73eb4ep+2
+0x1.1916fp+4
+0x1.4a04e8p+5
+0x1.134906p+1
+0x1.0002dp+0
+0x1p+0
+0x1.32db7p+0
+0x1.0105b8p+0
+0x1.09f78p+0
+0x1.1d3e78p+4
+0x1.41b184p+0
+0x1.134914p+1
+0x1.410e6ep+1
+0x1.312a4ap-1
+0x1.7308f4p+1
+0x1p+0
+0x1.0afbe8p+0
+0x1p+0
+0x1.00026ap+0
+0x1.2ee012p+0
+0x1.001318p+0
+0x1.af1034p+4
+0x1.687b1cp-24
+0x1.a93ap+2
+0x1.084598p+0
+0x1.37031ap-1
+0x1.c046ep+5
+0x1.79a75ep+2
+0x1.46a9c8p+1
+0x1.000766p+0
+0x1.245d98p+0
+0x1.19287ap+5
+0x1.6a0fbep+0
+0x1p+0
+0x1.011424p+0
+0x1.879f4cp+0
+0x1p+0
+0x1p+0
+0x1.4ca7ecp-51
+0x1.5818c6p+2
+0x1p+0
+0x1.b4c9fap+7
+0x1.b14384p+0
+0x1.082fdp+0
+0x1.085672p+8
+0x1.918f3cp+6
+0x1p+0
+0x1.45623ep+0
+0x1.95515cp+2
+0x1.000068p+0
+0x1.31f33ap-1
+0x1.f9eed8p+0
+0x1.91b218p+6
+0x1.331446p-1
+0x1.000202p+0
+0x1p+0
+0x1.3cdfb8p-1
+0x1p+0
+0x1.08fb58p+7
+0x1.4dde38p+5
+0x1p+0
+0x1.0053a4p+0
+0x1p+0
+0x1.31e138p+7
+0x1p+0
+0x1.01c35cp+0
+0x1.dba85cp+7
+0x1.03682cp+2
+0x1.000108p+0
+0x1.bff348p+55
+0x1.582dbp+1
+0x1.31158p+0
+0x1.760bep+44
+0x1.e43226p+7
+0x1.082008p+0
+0x1.a03e4cp+7
+0x1.00b984p+0
+0x1.20c58ep+1
+0x1.221c1p+0
+0x1.594056p+7
+0x1.aabf58p+2
+0x1p+0
+0x1.b142e4p+0
+0x1.8bf166p+5
+0x1p+0
+0x1.000168p+0
+0x1.06c69cp+0
+0x1.900166p+4
+0x1.621b64p+12
+0x1.b142eep+0
+0x1p+0
+0x1.31c642p-1
+0x1p+0
+0x1.65b9cap+0
+0x1.4adbbep+0
+0x1p+0
+0x1.858ea2p+0
+0x1.076d06p+0
+0x1.000dap+0
+0x1.70cd96p+2
+0x1.347a2p-1
+0x1.73c75cp+2
+0x1p+0
+0x1.180c6ep+8
+0x1p+0
+0x1.1a32dcp+5
+0x1.342abp-1
+0x1.4a08p+5
+0x1.000484p+0
+0x1.e498b4p+7
+0x1.91e072p+0
+0x1p+0
+0x1.9ab2a8p+0
+0x1.0001dp+0
+0x1.6ab22p+0
+0x1.00036p+0
+0x1.00042cp+0
+0x1.0012a2p+0
+0x1.f2b45cp+0
+0x1.31b8fep-1
+0x1.2a3f48p+1
+0x1p+0
+0x1.d8ecc8p+49
+0x1.b143b2p+0
+0x1.4f7516p+0
+0x1.09a35cp+0
+0x1.000ap+0
+0x1.ad259ap+5
+0x1.8d9b38p-18
+0x1.92ef44p+0
+0x1.7407ep+3
+0x1.bcb74cp+7
+0x1.57d22p+0
+0x1.610e16p+0
+0x1.2ff3fap-1
+0x1.00aefcp+0
+0x1.6aaf1cp+0
+0x1.000298p+0
+0x1.10b236p+0
+0x1.2b6a4p+0
+0x1.25c852p+3
+0x1.000354p+0
+0x1p+0
+0x1.4fe4c2p+2
+0x1.8ea358p+6
+0x1.cd77f6p+2
+0x1.0000aap+0
+0x1.8c2a1ep-19
+0x1.000264p+0
+0x1.03001p+0
+0x1.0c772cp+0
+0x1.daea4p+4
+0x1p+0
+0x1.0f2d5ep+0
+0x1p+0
+0x1.1604d6p+0
+0x1.2f7b08p-1
+0x1.0002f4p+0
+0x1p+0
+0x1.91aaf8p+1
+0x1.896624p+0
+0x1.0024c2p+0
+0x1.0fde8cp+1
+0x1.3a7214p+16
+0x1.01ff8p+0
+0x1.02458p+1
+0x1.1d3f4cp+4
+0x1p+0
+0x1.c0d546p+1
+0x1.0ac2d4p+54
+0x1p+0
+0x1p+0
+0x1.75e65p+55
+0x1p+0
+0x1.010256p+0
+0x1.68165p+53
+0x1p+0
+0x1.013c3p+0
+0x1.bc712ep+13
+0x1p+0
+0x1.71d1cp+5
+0x1.49c482p+0
+0x1.00665p+0
+0x1.386324p+1
+0x1.385c4ap-1
+0x1p+0
+0x1.379e5p+0
+0x1.232592p+8
+0x1p+0
+0x1.000338p+0
+0x1p+0
+0x1p+0
+0x1.055404p+0
+0x1.208ef8p+1
+0x1p+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.015d52p+0
+0x1.9ea35cp+1
+0x1.dc7eb4p+18
+0x1p+0
+0x1p+0
+0x1.b3d24ep+7
+0x1.fba328p+8
+0x1.00c7fp+0
+0x1.0d1acep+8
+0x1.779a24p+2
+0x1p+0
+0x1.19499ep+0
+0x1.25ddcep+3
+0x1.78346cp+3
+0x1.428e7ap+49
+0x1.003dp+0
+0x1p+0
+0x1.313dbcp-1
+0x1.6fef7p+1
+0x1p+0
+0x1.2ff116p-1
+0x1.00f598p+0
+0x1.45ab88p+0
+0x1p+0
+0x1.a93a36p+2
+0x1p+0
+0x1.54bb7p+2
+0x1p+0
+0x1.00004cp+0
+0x1.edac12p+0
+0x1.40f4fap+0
+0x1.45c0bcp+0
+0x1.0a2626p+0
+0x1.bfa67ap+51
+0x1.933f18p+0
+0x1p+0
+0x1.3f3fe8p+0
+0x1.006fc8p+0
+0x1.c04aecp+1
+0x1.0afc4p+0
+0x1.9b2f1ep+3
+0x1.11a134p+3
+0x1.0624dep-11
+0x1.eabf94p+0
+0x1.8950d8p+1
+0x1.35eba2p-1
+0x1.11c438p+0
+0x1.02073p+0
+0x1.483096p+0
+0x1.484bf4p+2
+0x1.1b86dcp+0
+0x1.0d3c56p+0
+0x1.0000e4p+0
+0x1.a93b64p+2
+0x1.b8db1cp+1
+0x1.308c0ep-1
+0x1p+0
+0x1.1e84fp+0
+0x1.3fc808p+0
+0x1.19179ap+4
+0x1p+0
+0x1.f1d3a4p+7
+0x1.273d1ep+1
+0x1.000a16p+0
+0x1.42ead6p+0
+0x1.b8c318p+1
+0x1.7226dp+1
+0x1.43af5cp+0
+0x1.450224p+0
+0x1.000234p+0
+0x1.358bc4p-1
+0x1.0000acp+0
+0x1.02ef5cp+0
+0x1.1d16fap+8
+0x1p+0
+0x1.0a9be6p+0
+0x1.2221d2p+8
+0x1.45abbp+0
+0x1p+0
+0x1.b787f6p-12
+0x1.960416p+0
+0x1.0af8b6p+1
+0x1.232048p+64
+0x1.f6b2fp+0
+0x1p+0
+0x1.02fc3ep+0
+0x1.19292ep+5
+0x1.00fdcap+0
+0x1.51ac2p+1
+0x1.020b04p+0
+0x1.3fe772p+1
+0x1p+0
+0x1.3a87dap+0
+0x1.00dbf8p+0
+0x1.dc825cp+1
+0x1.051eap+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.000bp+0
+0x1.004874p+0
+0x1.ed7906p+14
+0x1.ba64fcp+12
+0x1.03e86ap+0
+0x1.5cdd2p+2
+0x1.2fc1c6p-1
+0x1.08a1b8p+0
+0x1p+0
+0x1.4e97bp+62
+0x1.364392p+0
+0x1.000236p+0
+0x1.32f478p-1
+0x1.362732p+4
+0x1.1d3f0ep+4
+0x1.205236p+44
+0x1p+0
+0x1.93afd4p+2
+0x1.2f40ecp-1
+0x1p+0
+0x1.0fe4a4p+1
+0x1.9975e8p+64
+0x1.4a93fap+1
+0x1.259756p+3
+0x1.1e1e64p+8
+0x1.000048p+0
+0x1p+0
+0x1.2f1f74p-1
+0x1.7a124ap+0
+0x1.5e3f8ep+2
+0x1.e58cd8p-1
+0x1.b3857ep+0
+0x1.6f4da4p+0
+0x1p+0
+0x1.44caaep+0
+0x1.6831b2p+0
+0x1.7537bep+1
+0x1p+0
+0x1.003054p+0
+0x1.4934p+2
+0x1.00005p+0
+0x1.000098p+0
+0x1.091ebcp+0
+0x1.465e2cp+9
+0x1.00017p+0
+0x1p+0
+0x1.31ab6cp-1
+0x1p+0
+0x1p+0
+0x1.f2386ep+57
+0x1.147d32p+3
+0x1.e480eep+7
+0x1.03b3b2p+0
+0x1.02035cp+0
+0x1.11d934p+3
+0x1.5776d8p+53
+0x1.2c73p+0
+0x1.63073ap+9
+0x1.2041aep+8
+0x1p+0
+0x1.00594cp+0
+0x1.3ee136p+0
+0x1p+0
+0x1.09548p+1
+0x1.05f1f4p-11
+0x1.0002a4p+0
+0x1.16ac18p+3
+0x1.b8531ep+7
+0x1.0fd73cp+1
+0x1.011f64p+0
+0x1.0ff65ep+0
+0x1.b1ecfp+4
+0x1.8f0888p+0
+0x1.f95e02p-1
+0x1p+0
+0x1.9000cep+0
+0x1.e9b4fep+52
+0x1.009838p+0
+0x1.5ef598p+1
+0x1.a6ad24p+7
+0x1.4913c6p+0
+0x1p+0
+0x1.3d7314p+0
+0x1p+0
+0x1.a591c8p+0
+0x1.017966p-13
+0x1.9825cep+3
+0x1.192898p+5
+0x1.cddc2p+42
+0x1p+0
+0x1p+0
+0x1.0dde0ap+8
+0x1.0e56e8p+1
+0x1.a6fbcep+3
+0x1.b92cc8p+7
+0x1.d57268p+0
+0x1.b8f132p+1
+0x1.4c257ap+0
+0x1.00000ap+0
+0x1.38635p+1
+0x1.1cc07ap+45
+0x1.71ff7ep+1
+0x1.ef8b44p+0
+0x1.6cf93ep+51
+0x1p+0
+0x1p+0
+0x1.11f506p+8
+0x1.77844ap+0
+0x1p+0
+0x1.bdd978p+7
+0x1.00006ap+0
+0x1.0e2602p+1
+0x1.045486p+0
+0x1.0002c8p+0
+0x1.4d67c8p+1
+0x1.e5b314p-1
+0x1.6a374cp+0
+0x1.99db52p+0
+0x1.f9eeap-1
+0x1.bf7f2cp+5
+0x1.da61b4p+4
+0x1.488ff4p+0
+0x1.003p+0
+0x1p+0
+0x1.02ffcp+0
+0x1.d09a76p+1
+0x1.225a2cp+0
+0x1.0637f2p+0
+0x1.b3893p+0
+0x1.00005p+0
+0x1.bcc5ccp+59
+0x1p+0
+0x1.01f38ep+0
+0x1.a720ecp+7
+0x1.05390cp+1
+0x1.bf3ffep+2
+0x1.6b9574p+0
+0x1.388f0cp+11
+0x1.29a6aap+0
+0x1.31e90ep-1
+0x1p+0
+0x1p+0
+0x1.2f1498p-1
+0x1.0000eep+0
+0x1p+0
+0x1.3190e2p-1
+0x1p+0
+0x1.7703c2p+1
+0x1.0ffd1cp-24
+0x1p+0
+0x1p+0
+0x1.f5c25p-24
+0x1.7407c8p+3
+0x1.45abd2p+0
+0x1.1304ecp+0
+0x1p+0
+0x1.0002f4p+0
+0x1.cd1cdap+1
+0x1.6ef2fp+15
+0x1.0002cap+0
+0x1.dc83cp+1
+0x1.0000ccp+0
+0x1.0093cep+0
+0x1.0066bap+0
+0x1.002dp+0
+0x1.0e6c8p+0
+0x1.7be50ap+16
+0x1.00b348p+0
+0x1.089b3p+16
+0x1.98b07cp+2
+0x1.3389b2p+0
+0x1.a41e1ep+7
+0x1.7195dep+5
+0x1.08b45cp+0
+0x1.29c1eap+56
+0x1.740b96p+3
+0x1.71fef4p+1
+0x1.07ba2cp+0
+0x1.5ee4a2p+1
+0x1p+0
+0x1.f9599cp-1
+0x1.b9154ep+14
+0x1.f8911cp+0
+0x1p+0
+0x1.373e1p+4
+0x1p+0
+0x1.00146cp+0
+0x1.4a05acp+5
+0x1.1928aap+5
+0x1.060cecp+0
+0x1.773996p+0
+0x1.af11c2p-11
+0x1p+0
+0x1.3f7d98p+7
+0x1.1361ep+52
+0x1.f9f064p+0
+0x1p+0
+0x1.a9b908p+7
+0x1.c55b46p+0
+0x1p+0
+0x1.682ec4p+46
+0x1.00003p+0
+0x1p+0
+0x1.2fdba4p-1
+0x1.9beca4p+0
+0x1.0004a8p+0
+0x1.2fb262p-1
+0x1.8bf118p+5
+0x1.0001aap+0
+0x1.31a74p-1
+0x1.25db7ep+3
+0x1p+0
+0x1.197a7cp+1
+0x1p+0
+0x1.2d315cp+0
+0x1.0024f8p+0
+0x1.2a7f04p+1
+0x1p+0
+0x1p+0
+0x1.01211cp+0
+0x1.f11d7ep-1
+0x1.d4f718p+2
+0x1.b233dep+0
+0x1.6d6b1cp+5
+0x1.7724fep+15
+0x1p+0
+0x1.a86fbap+7
+0x1p+0
+0x1p+0
+0x1.4aa984p+49
+0x1.000054p+0
+0x1p+0
+0x1.33d3f4p-1
+0x1p+0
+0x1.1b0cd8p+6
+0x1.000958p+0
+0x1p+0
+0x1.49ef4ep+4
+0x1.7cc648p+1
+0x1p+0
+0x1.23470ap+0
+0x1.3223a4p+0
+0x1p+0
+0x1.4d6912p+0
+0x1.51e25p+0
+0x1p+0
+0x1.34962cp+0
+0x1.0fdd0cp+1
+0x1.0001d8p+0
+0x1.38637cp+1
+0x1.9de754p+3
+0x1.8e020cp+5
+0x1.ad9158p+4
+0x1.094afap+0
+0x1.ea949ep+52
+0x1.ec6aa4p+1
+0x1.1a5e6cp+4
+0x1.07ed56p+0
+0x1.711ffp+0
+0x1p+0
+0x1.062702p+8
+0x1.233ffap+18
+0x1.10c252p+7
+0x1.002a14p+0
+0x1.98f468p+0
+0x1.833884p+0
+0x1p+0
+0x1.9179acp+4
+0x1.d944c4p-1
+0x1.00bc84p+0
+0x1p+0
+0x1.46c0aep+0
+0x1.ad157p+4
+0x1.13492cp+1
+0x1.4b0ceep+0
+0x1.000246p+0
+0x1p+0
+0x1p+0
+0x1.176dbep+0
+0x1.52e1b8p+0
+0x1.050ab8p+0
+0x1p+0
+0x1.ef2d1p-84
+0x1.d0999p+1
+0x1.00b594p+0
+0x1.19ae42p+54
+0x1p+0
+0x1p+0
+0x1.bf05cap-56
+0x1.fba48p+0
+0x1.19a5ecp+4
+0x1.000518p+0
+0x1.cd1cc6p+1
+0x1.0008d2p+0
+0x1.00291cp+0
+0x1.01ae5cp+0
+0x1.18229cp+0
+0x1.0000d6p+0
+0x1.00017p+0
+0x1.1083fep-25
+0x1p+0
+0x1.7d379ap+9
+0x1.2f5e0ep-1
+0x1.365e38p+0
+0x1.000912p+0
+0x1.8p+3
+0x1.13e39cp+1
+0x1p+0
+0x1.0ba4aep+0
+0x1.9deafcp+3
+0x1.2fead4p-1
+0x1p+0
+0x1.11a49cp+16
+0x1.968f3ap+62
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.b85f8ep+6
+0x1.141a8ep+8
+0x1.0564ecp+0
+0x1.c6b168p+2
+0x1.05b106p+8
+0x1.000298p+0
+0x1p+0
+0x1.0001fap+0
+0x1.000164p+0
+0x1.31a84p+0
+0x1p+0
+0x1.403f5cp+5
+0x1.ea62dep-1
+0x1p+0
+0x1.131eeep+1
+0x1.3625d8p+4
+0x1.066f0cp+0
+0x1.e7a64p+7
+0x1.047e06p+0
+0x1p+0
+0x1.32aad8p-1
+0x1p+0
+0x1.000118p+0
+0x1.1b0d0cp+6
+0x1.a11c9p+0
+0x1.a2588ep+54
+0x1p+0
+0x1p+0
+0x1.09ffa8p+8
+0x1.bb2a7cp+5
+0x1p+0
+0x1.a1f9p+0
+0x1p+0
+0x1.f3d4b4p-1
+0x1.4dc16ap+5
+0x1.3b2274p+4
+0x1.457d56p+0
+0x1.01cfcp+0
+0x1p+0
+0x1.a93982p+2
+0x1.04054cp+0
+0x1.0080fap+0
+0x1.dc801cp+0
+0x1.0b77bep+1
+0x1.013094p+0
+0x1.0001e8p+0
+0x1.02e2ep+0
+0x1p+0
+0x1.000094p+0
+0x1.fb4382p-1
+0x1.00019p+0
+0x1.0007b8p+0
+0x1.127e1ap+8
+0x1p+0
+0x1p+0
+0x1.0e25cp+1
+0x1.2f4b78p+1
+0x1.015b26p+8
+0x1.0eb20cp+0
+0x1.081558p+7
+0x1.42ff58p+0
+0x1.1c5d1p+6
+0x1.887b42p+14
+0x1.02904p+1
+0x1.7ce25ap+1
+0x1.f96d6p-1
+0x1.5c64f4p+0
+0x1.0005c8p+0
+0x1.78e9d4p-33
+0x1.da628ep+4
+0x1.003634p+0
+0x1.3184d6p-1
+0x1.bd96f4p+6
+0x1.ba5156p+12
+0x1.8df4acp+0
+0x1p+0
+0x1.a3b92p+7
+0x1.3e4f26p+11
+0x1.543868p+4
+0x1.eabfe6p+0
+0x1.0073e6p+0
+0x1.0f2bdep+8
+0x1.3e3c3ep+13
+0x1.3884dp+6
+0x1p+0
+0x1.690fecp+0
+0x1.dfa074p-1
+0x1.000638p+0
+0x1.4a93acp+1
+0x1.8dd68ap+0
+0x1.0048dcp+0
+0x1.002f8ep+0
+0x1.00015p+0
+0x1.45abbcp+0
+0x1.f3f306p-1
+0x1.1b639p+0
+0x1.ef2d1p-84
+0x1.abd54p+0
+0x1.36f8aap+2
+0x1.e317cep-1
+0x1.36f9cap+2
+0x1.530ddp+0
+0x1.2f74bp+0
+0x1.3c4448p+0
+0x1.0718dcp+0
+0x1.0001bp+0
+0x1p+0
+0x1.1d3ebap+4
+0x1.42e55ap+0
+0x1.3ace3ep+50
+0x1.5b5108p+1
+0x1.13527cp+3
+0x1.0002ap+0
+0x1.6f3ebcp+2
+0x1.b0af06p+7
+0x1.016c28p+0
+0x1p+0
+0x1.4542a6p+0
+0x1p+0
+0x1.6120cep+55
+0x1.02a2p+0
+0x1.0714d6p+15
+0x1.21293ep+0
+0x1.023b38p+0
+0x1.000d12p+0
+0x1.4d9f06p+15
+0x1p+0
+0x1.dd3bb4p-1
+0x1p+0
+0x1.00029ep+0
+0x1.eabfa8p+0
+0x1.362a2ep+0
+0x1.000a5ap+48
+0x1.dfbac8p+4
+0x1.259742p+3
+0x1.0000acp+0
+0x1.00cc58p+1
+0x1.49155ep+0
+0x1p+0
+0x1p+0
+0x1.30d9ap-1
+0x1.02fc6p+0
+0x1.3cac76p+0
+0x1.b8c472p+1
+0x1.8bf1bcp+5
+0x1.2cd56p+0
+0x1.1d37a6p+0
+0x1p+0
+0x1.6b03dep+2
+0x1p+0
+0x1.4bc794p+0
+0x1.dc56e6p+1
+0x1.b1432ap+0
+0x1.5a6574p+2
+0x1.a21356p+4
+0x1.6269ep+64
+0x1.0000dp+0
+0x1.10766cp+7
+0x1.0096e6p+0
+0x1.adf486p+0
+0x1.309de8p-1
+0x1.085fb4p+0
+0x1.3afb0ep+0
+0x1.0002a2p+0
+0x1.085208p+0
+0x1.213daap+8
+0x1.000a5ap+0
+0x1.503f0cp+0
+0x1.000428p+0
+0x1.7ee7d4p+16
+0x1.8e5064p+61
+0x1.3f6054p+7
+0x1.3a78a6p+0
+0x1.0a197ap+0
+0x1.016ea8p+0
+0x1.0bbb28p+8
+0x1.000014p+0
+0x1.0010d4p+0
+0x1.5983f8p-26
+0x1.2dddep+0
+0x1.3f4af4p+0
+0x1.15f078p+0
+0x1p+0
+0x1.8ffae8p-20
+0x1.0000a4p+0
+0x1.4f32a8p+0
+0x1.8bf1f2p+5
+0x1.0000fp+0
+0x1.1e9612p+0
+0x1.000512p+0
+0x1.000184p+0
+0x1p+0
+0x1.4a071ap+5
+0x1.316586p-1
+0x1.026922p+0
+0x1.9323dcp+3
+0x1.0530acp+0
+0x1.18125p+0
+0x1.e39054p-1
+0x1.3ad2p+11
+0x1.005ad4p+0
+0x1.000208p+0
+0x1.b85f4cp+6
+0x1.002d02p+0
+0x1p+0
+0x1p+0
+0x1.da3556p+8
+0x1p+0
+0x1.02c298p+0
+0x1.11a35ep+3
+0x1.4a0a02p+1
+0x1.02741p+2
+0x1p+0
+0x1.2749a2p+0
+0x1.45abacp+0
+0x1p+0
+0x1.3920bcp+13
+0x1.000054p+0
+0x1.4ceda8p+0
+0x1p+0
+0x1.390b2p+7
+0x1.66764ep+7
+0x1p+0
+0x1.e11478p+7
+0x1.0f264cp+0
+0x1p+0
+0x1.2f7ec2p-1
+0x1p+0
+0x1.0ac6fcp+8
+0x1.3ca396p+0
+0x1.9ad138p+5
+0x1.e5b8acp+7
+0x1.0000b8p+0
+0x1.f14fd6p-11
+0x1.00009p+0
+0x1.01571ep+0
+0x1.17c726p+0
+0x1.00019p+0
+0x1.362514p+4
+0x1.004efp+0
+0x1.003f5cp+0
+0x1.43c41cp+0
+0x1p+0
+0x1.3e6c78p+12
+0x1.000c5cp+0
+0x1.3e795cp+6
+0x1.b825a6p+7
+0x1.ace64p+1
+0x1.36f8dp+2
+0x1.587484p+0
+0x1.94967ap+14
+0x1.af98e6p+17
+0x1.6488b6p+0
+0x1.1d3e98p+4
+0x1.009978p+0
+0x1.377d08p+0
+0x1.2fdc0ep+0
+0x1.045768p+0
+0x1.f9ef1ap+0
+0x1.003e4ap+0
+0x1.3e825p+9
+0x1.38da1p+0
+0x1p+0
+0x1p+0
+0x1.00d4a2p+0
+0x1.3e6838p+12
+0x1.0c24a8p+0
+0x1.00012cp+0
+0x1p+0
+0x1p+0
+0x1.001188p+0
+0x1.30be32p-1
+0x1.d20bfcp+0
+0x1.000314p+0
+0x1.467b6ap+1
+0x1.b14436p+0
+0x1.be3eccp+7
+0x1.035cc4p+0
+0x1p+0
+0x1.358ca4p+7
+0x1p+0
+0x1.052ef8p+8
+0x1.08ac7ep+0
+0x1p+0
+0x1.ef2d1p-84
+0x1p+0
+0x1.388d04p+56
+0x1.003836p+0
+0x1.65f1ecp+0
+0x1.5b141p+47
+0x1.fadea2p+0
+0x1.d1e872p+59
+0x1p+0
+0x1.acd704p+0
+0x1.d46c0ap-34
+0x1p+0
+0x1.015a84p+0
+0x1p+0
+0x1p+0
+0x1.02161ep+0
+0x1p+0
+0x1.02283cp+0
+0x1.2fb3d8p+2
+0x1.3b1854p+4
+0x1.9a69d8p+48
+0x1.f9ef08p+0
+0x1.7e849cp+3
+0x1.eabffp+0
+0x1.054884p+0
+0x1.9faadcp+7
+0x1.01dbfep+0
+0x1.a9a6aap+1
+0x1p+0
+0x1.ae82b2p+5
+0x1.423f6p-20
+0x1.42e57p+0
+0x1.41466p+2
+0x1p+0
+0x1.49ef3ep+4
+0x1.f264ccp-1
+0x1.0084dap+0
+0x1.07aabap+0
+0x1p+0
+0x1p+0
+0x1.009f06p+0
+0x1.008b44p+0
+0x1.3e2b8cp+5
+0x1.000324p+0
+0x1.0c4158p+0
+0x1.32644cp-1
+0x1.1929dp+5
+0x1.8ac548p+4
+0x1.01b036p+0
+0x1.7e3a98p+5
+0x1.34bc8p-1
+0x1.b14336p+0
+0x1.0cb4e2p+0
+0x1.b931bp+12
+0x1.2358fp+1
+0x1.f23b6cp+51
+0x1p+0
+0x1.16fa4cp+4
+0x1.0baf84p+0
+0x1.a856a8p+5
+0x1.066f6p+0
+0x1p+0
+0x1p+0
+0x1.20b7bp+0
+0x1.3fe392p+0
+0x1.388ae2p+0
+0x1.00035cp+0
+0x1.3adcf2p+12
+0x1.30393p-1
+0x1.e17338p+1
+0x1.aa6b1ap+7
+0x1.0000b6p+0
+0x1p+0
+0x1.345b46p-1
+0x1.74921cp+8
+0x1.b29bd6p+7
+0x1p+0
+0x1.77c706p+2
+0x1.c4d8ecp+65
+0x1.8d98bp+0
+0x1.8b8002p-6
+0x1.3881ecp+15
+0x1.010cd4p+0
+0x1.c8fdaap+7
+0x1.72b958p+2
+0x1.965c1cp+3
+0x1p+0
+0x1p+0
+0x1.2a515cp+0
+0x1.cd1e9p+1
+0x1.006674p+0
+0x1p+0
+0x1.66e4cp+2
+0x1.13aa9ep+8
+0x1p+0
+0x1.13101cp+1
+0x1.0004ecp+0
+0x1p+0
+0x1.c51ad2p+7
+0x1p+0
+0x1.2a0908p+8
+0x1.000182p+0
+0x1.ac40fcp+2
+0x1.30f308p-1
+0x1p+0
+0x1p+0
+0x1.1ceeaep+7
+0x1.0000a4p+0
+0x1.f407acp+7
+0x1.36f98ep+2
+0x1.1c60a8p+10
+0x1.617238p+12
+0x1p+0
+0x1.48fb3ap+0
+0x1p+0
+0x1.000d5p+0
+0x1.33833cp-1
+0x1p+0
+0x1.41be46p+51
+0x1.238e58p+0
+0x1.00266cp+0
+0x1.9fc4bp+58
+0x1.000618p+0
+0x1.88a592p+48
+0x1.0001c8p+0
+0x1p+0
+0x1.51c89cp+0
+0x1.317344p+7
+0x1.308e8ap-1
+0x1p+0
+0x1.0387e6p+0
+0x1.454a32p+0
+0x1.74a828p+7
+0x1.f57daep-8
+0x1.287a44p+0
+0x1.b84b08p+2
+0x1.27fc5ap+0
+0x1p+0
+0x1.0e423p+1
+0x1p+0
+0x1.079ddp+0
+0x1.f49a74p+14
+0x1.0f47bp+0
+0x1.9000bap+4
+0x1.000244p+0
+0x1p+0
+0x1.4a38ep+0
+0x1.36f8bp+2
+0x1.6bf43cp+0
+0x1.a3a9f4p+1
+0x1.001d24p+0
+0x1.106f8ap+0
+0x1.0003ep+0
+0x1.00025p+0
+0x1.89be24p+0
+0x1.3d65b4p+6
+0x1.44b46ep+0
+0x1.5caecap+1
+0x1.00327cp+2
+0x1.54bbep+2
+0x1.2597aap+3
+0x1.059a5ap-11
+0x1.43884ep+2
+0x1p+0
+0x1.c04628p+9
+0x1p+0
+0x1.c1b9bp-49
+0x1.73ed24p+2
+0x1.000598p+0
+0x1.44105p+0
+0x1.b7c192p+5
+0x1.312178p-1
+0x1p+0
+0x1.f9efc2p+0
+0x1.014252p-51
+0x1.017a66p+0
+0x1.1f3de4p+8
+0x1.02b182p+0
+0x1.257372p+0
+0x1.93944ap+48
+0x1.e2305cp+1
+0x1.3e0ee6p-8
+0x1.00011ep+0
+0x1.a31448p+5
+0x1.8c9ca6p+48
+0x1.194216p+0
+0x1p+0
+0x1.5cc2ap+2
+0x1p+0
+0x1.506fe6p+49
+0x1.2588fp+0
+0x1.26ffaep+1
+0x1p+0
+0x1p+0
+0x1.4ff01ap+66
+0x1.00009cp+0
+0x1.000f38p+0
+0x1.00e4d6p+0
+0x1.001d5cp+0
+0x1.02b29cp+50
+0x1.358d1p+7
+0x1.3eff02p+8
+0x1.900058p+4
+0x1.3ae0bcp+13
+0x1.034d3ep+0
+0x1.b9346p+5
+0x1p+0
+0x1.71b9cp+0
+0x1.2f7456p+0
+0x1.47ccf2p+0
+0x1.498974p+0
+0x1.046cb8p+0
+0x1.458c62p+1
+0x1.a93bf4p+2
+0x1.0f113ap+8
+0x1p+0
+0x1.04ae52p+0
+0x1.7c2a68p+0
+0x1.3b24fep+9
+0x1.04ef5p-11
+0x1.11a28ap+3
+0x1p+0
+0x1.056b24p+1
+0x1.0000e4p+0
+0x1.2c01cap+0
+0x1p+0
+0x1p+0
+0x1.c61f72p+15
+0x1p+0
+0x1.02fc2ap+0
+0x1p+0
+0x1.093acep+0
+0x1.5643eap+53
+0x1p+0
+0x1.0087a8p-47
+0x1.2f5868p+0
+0x1.38e848p+10
+0x1.e5c11cp+7
+0x1p+0
+0x1.129e64p+8
+0x1.5c6c98p+1
+0x1.00015ap+0
+0x1.b745e2p+48
+0x1.1bfb08p+0
+0x1.a92b86p+5
+0x1.7c2a54p+0
+0x1p+0
+0x1.3334b6p+0
+0x1.b5c006p+5
+0x1p+0
+0x1.bec8c6p+16
+0x1p+0
+0x1.dc5496p-1
+0x1.0a88ep+0
+0x1.f95e78p+1
+0x1p+0
+0x1.0037b4p+0
+0x1.1eaf62p+8
+0x1p+0
+0x1.43bfcp+5
+0x1.3af986p+15
+0x1.03dbf4p+0
+0x1.b1b5a8p-12
+0x1p+0
+0x1.90007ep+0
+0x1.0003b4p+0
+0x1p+0
+0x1.f8f086p-12
+0x1.dd7178p+4
+0x1.00207p+0
+0x1.118916p+0
+0x1p+0
+0x1.a298c4p+7
+0x1.006a6cp+0
+0x1.1dfa5p+0
+0x1.327c54p-1
+0x1p+0
+0x1.f7e922p-1
+0x1.3e365ap+13
+0x1p+0
+0x1.04318ap+0
+0x1.52381cp+0
+0x1.60a298p-1
+0x1.000076p+0
+0x1.977c42p+14
+0x1.a8cb5cp+7
+0x1.1b0d18p+6
+0x1.29cedp+0
+0x1.15a46ap+1
+0x1p+0
+0x1.639aaep-12
+0x1.004a8cp+0
+0x1.0ab1bcp+1
+0x1.b85ecp+6
+0x1.36279ep+4
+0x1.22ae32p+8
+0x1.615228p+1
+0x1.000898p+0
+0x1.001968p+0
+0x1p+0
+0x1.2f791ap-1
+0x1.00001cp+0
+0x1p+0
+0x1.0627aep+0
+0x1.0e38d4p+5
+0x1.490936p+57
+0x1p+0
+0x1.000358p+0
+0x1.57b4bp+7
+0x1.4b4766p+0
+0x1.26da06p+0
+0x1.cd1ec6p+1
+0x1.38ee44p+15
+0x1.c0ffbcp+15
+0x1.01caacp+0
+0x1.e2a336p-1
+0x1p+0
+0x1.0c69f4p+2
+0x1.50a08cp+55
+0x1.10d0b8p+0
+0x1.1eed7p+1
+0x1.b14428p+0
+0x1.004f94p+0
+0x1.31c2acp-1
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.b47948p+0
+0x1.78d5eap+51
+0x1.01316ep+0
+0x1.4a937cp+0
+0x1.1ba54ap+1
+0x1.6ba304p+0
+0x1.3591c6p-1
+0x1p+0
+0x1.08a91ap+8
+0x1.19ade8p+0
+0x1.01535ap+0
+0x1.317184p-1
+0x1.36f9a4p+2
+0x1.7f08a8p+0
+0x1p+0
+0x1.00013p+0
+0x1.ff478p-1
+0x1.27e0d2p+0
+0x1.0ecbacp+7
+0x1.8dd6acp+0
+0x1.100ecep+0
+0x1.25edd8p+8
+0x1.198a9p+0
+0x1p+0
+0x1.5c6cc2p+1
+0x1.016276p+0
+0x1.329f88p-1
+0x1.9e35ap+0
+0x1.004612p+0
+0x1.fb9b82p-1
+0x1.000d84p+0
+0x1.43e8a8p+0
+0x1.57e548p+1
+0x1.057f18p+0
+0x1.a6dfbep+7
+0x1p+0
+0x1.341ce2p-1
+0x1p+0
+0x1p+0
+0x1.fcbce2p+56
+0x1.004454p+0
+0x1.909ec2p-6
+0x1p+0
+0x1.58649p+9
+0x1.4b96e6p+49
+0x1.3ca38cp+0
+0x1.00033ep+0
+0x1.0099f4p+0
+0x1p+0
+0x1.21869p+8
+0x1p+0
+0x1.65b514p+16
+0x1p+0
+0x1.740878p+3
+0x1.a4cea2p+43
+0x1.b143fep+0
+0x1.25ed36p+4
+0x1.003d7ap+0
+0x1.0d82d4p+1
+0x1.3389ap-1
+0x1p+0
+0x1.11a222p+3
+0x1.983f38p+3
+0x1.000162p+0
+0x1.46b986p+0
+0x1.3e3e9cp+8
+0x1.58747p+0
+0x1.45632cp+0
+0x1.3f738cp+3
+0x1.00d0bp+0
+0x1.5dca1p+0
+0x1p+0
+0x1.43257p+0
+0x1.0b38fap+0
+0x1.1ca4aep+8
+0x1p+0
+0x1p+0
+0x1.319a2p-1
+0x1.2d4fd4p+5
+0x1.02f006p+0
+0x1.e0c05ap+4
+0x1.98f464p+0
+0x1.05db3ap+8
+0x1.a2bd9ep+2
+0x1.a05a58p+0
+0x1.8bf254p+5
+0x1.3eb04cp+4
+0x1.3140a6p-1
+0x1.011d98p+0
+0x1p+0
+0x1.000ac8p+0
+0x1.3b2774p+10
+0x1.44d29p+0
+0x1p+0
+0x1.009f9ep+0
+0x1.0a8702p+2
+0x1.1349bep+1
+0x1.a585b4p+7
+0x1.00f23cp+0
+0x1.338168p+0
+0x1p+0
+0x1.3e7816p+14
+0x1.0e9d14p+0
+0x1.8f53ccp+1
+0x1.28c922p+0
+0x1.6bb30ep+15
+0x1.b58932p+14
+0x1.1c682p+0
+0x1.00846p+0
+0x1.00240cp+0
+0x1.000674p+0
+0x1.2c71ep+3
+0x1.750298p+67
+0x1.364684p+0
+0x1.134676p+16
+0x1.47a244p+0
+0x1p+0
+0x1.dee22ep-1
+0x1.3e8204p+9
+0x1.00007p+0
+0x1.31f1e6p-1
+0x1p+0
+0x1.a187f8p+7
+0x1.0097e4p+0
+0x1.08e1b2p+0
+0x1.0e3e7ap+0
+0x1.0006fap+0
+0x1p+0
+0x1.358ca6p+7
+0x1.83bcacp+3
+0x1.4603f4p+0
+0x1.3093c8p+0
+0x1.5c6cap+1
+0x1.1f5efcp+0
+0x1.6ba3e8p+0
+0x1.cba7b2p+7
+0x1.015e1ep+0
+0x1.b85f58p+6
+0x1.dc835ep+1
+0x1.000598p+0
+0x1.f9551ap-1
+0x1p+0
+0x1p+0
+0x1.0a67fp+0
+0x1.1bdf58p+0
+0x1.f75026p-1
+0x1.5e3b5p+1
+0x1.3f9b72p+0
+0x1.8ff798p-51
+0x1.0115bap+0
+0x1.4e13fcp+0
+0x1.6d6c54p+5
+0x1.0e7538p+0
+0x1.dcf5d8p-12
+0x1.134aa6p+1
+0x1.b7cc8p+12
+0x1.3e46dap+12
+0x1p+0
+0x1.3fb2fep+0
+0x1p+0
+0x1p+0
+0x1.0f8834p+0
+0x1p+0
+0x1.2f8fc8p-1
+0x1.0032aap+0
+0x1.0134d4p+0
+0x1.0006ecp+0
+0x1.36f9b8p+2
+0x1.d32d7p+43
+0x1.65f516p+1
+0x1.a71662p+5
+0x1.02731cp+2
+0x1.00002cp+0
+0x1.090ap+0
+0x1.8ce46ep+6
+0x1.0001bp+0
+0x1.003c82p+0
+0x1.a2cb78p+5
+0x1.1b3cc6p+0
+0x1p+0
+0x1.000698p+0
+0x1p+0
+0x1p+0
+0x1.0a01d2p+50
+0x1.000b52p+0
+0x1.63092ep+0
+0x1.0011fcp+0
+0x1.684b74p+2
+0x1.782834p+49
+0x1.213286p+0
+0x1.2b13b6p+9
+0x1.383ep+0
+0x1.f91f5cp+2
+0x1.bf1f3cp+7
+0x1.3e44f4p+7
+0x1p+0
+0x1.4637a4p+0
+0x1.3e8c48p+12
+0x1.192a3cp+8
+0x1.0008c2p+0
+0x1p+0
+0x1.01a4b6p+8
+0x1.0002d8p+0
+0x1.001054p-6
+0x1p+0
+0x1.275d2cp+0
+0x1.320582p-1
+0x1.02643ep+0
+0x1.aa4074p+5
+0x1.02528cp+0
+0x1.0adc1p+7
+0x1.e25f42p-1
+0x1p+0
+0x1.0076ap+0
+0x1.0008acp+0
+0x1.783ba4p+3
+0x1.01af66p+0
+0x1.192eep+0
+0x1.132ea6p+7
+0x1.a93964p+2
+0x1.9bc85p+14
+0x1.1e3f46p+8
+0x1.1d8db6p+13
+0x1.0007cap+0
+0x1.2fa568p-1
+0x1.3e8fd4p+12
+0x1.2f5bf6p-1
+0x1.a0994cp+14
+0x1.7ed6b2p+0
+0x1.0f2b1ap+0
+0x1.4ab6e6p+1
+0x1.04c838p+8
+0x1.000034p+0
+0x1p+0
+0x1.eadcd6p-1
+0x1.00008p+0
+0x1.12103cp-1
+0x1p+0
+0x1p+0
+0x1.2f93bp-1
+0x1.7b4b16p+5
+0x1.38fe8cp+6
+0x1p+0
+0x1.36f96cp+2
+0x1.716462p+39
+0x1.000048p+0
+0x1.7c680ep+4
+0x1p+0
+0x1.28cbfap+0
+0x1.a416eap+41
+0x1p+0
+0x1.57e51p+1
+0x1.0004f4p+0
+0x1p+0
+0x1.3167b6p-1
+0x1.984032p+3
+0x1.04f21ep+0
+0x1p+0
+0x1.73ed4p+2
+0x1.0f4eb8p+8
+0x1p+0
+0x1.2df9p+5
+0x1.54bbf8p+2
+0x1.0bf9a4p+0
+0x1.a91d34p+63
+0x1.130ed8p+0
+0x1p+0
+0x1.00036ap+0
+0x1.3ae7aep+8
+0x1.16524ap+8
+0x1.9f774ap+0
+0x1.ba601cp+2
+0x1.bb2f0cp+12
+0x1.a93bd4p+2
+0x1.32e318p+0
+0x1.0ab44ap+0
+0x1p+0
+0x1.2f871ep-1
+0x1p+0
+0x1.a78356p+7
+0x1.001e8cp+0
+0x1.4a08dap+5
+0x1.069e1cp+0
+0x1.e3e184p+1
+0x1.f60012p+18
+0x1p+0
+0x1.b8600ep+6
+0x1.300bc6p-1
+0x1.76f83cp+6
+0x1.16f978p+0
+0x1.0003a4p+0
+0x1.0b4f22p+7
+0x1.37409cp+0
+0x1p+0
+0x1.3e95dp+12
+0x1.00098p+0
+0x1.004038p+0
+0x1.301bfep-1
+0x1p+0
+0x1.9c872ep+0
+0x1.378344p+16
+0x1.18c55cp+0
+0x1.274a0ep-20
+0x1.2811b2p+0
+0x1p+0
+0x1.ba668cp+12
+0x1.7f2c8ap+13
+0x1.0f72fcp+8
+0x1.6308a6p+0
+0x1.b0cac6p+13
+0x1.4837p+0
+0x1p+0
+0x1.40bd6cp+0
+0x1p+0
+0x1.39133p+12
+0x1.c62f4cp+46
+0x1.0004bcp+0
+0x1.12257ap+8
+0x1p+0
+0x1.85645cp+9
+0x1.4cb85ep+0
+0x1p+0
+0x1.a234a8p-1
+0x1p+0
+0x1p+0
+0x1.3cf408p-27
+0x1.0e263ep+1
+0x1.00026p+0
+0x1p+0
+0x1p+0
+0x1.332f2cp-1
+0x1.04bb28p+0
+0x1.4a67cap+0
+0x1.0003dcp+0
+0x1p+0
+0x1.3482d4p-1
+0x1.134a04p+1
+0x1p+0
+0x1.9000ecp+4
+0x1p+0
+0x1.2f4e26p-1
+0x1.0395dp+9
+0x1.38dbb4p+11
+0x1p+0
+0x1.049432p+0
+0x1.1a9a96p+8
+0x1.54bcd2p+2
+0x1.14487cp+0
+0x1.020458p+0
+0x1.000b9p+0
+0x1.32254cp-1
+0x1.73ed2ep+2
+0x1p+0
+0x1.3d8be4p+0
+0x1.3e96d4p+15
+0x1.ffa44cp-1
+0x1.11a334p+3
+0x1.08317p+0
+0x1.000238p+0
+0x1.3e498p+9
+0x1.3389eap-1
+0x1.36f9ccp+2
+0x1.0bbe0ap+0
+0x1.0b53f4p+8
+0x1p+0
+0x1.0e42d2p+0
+0x1.d22332p+18
+0x1p+0
+0x1.05197ep+0
+0x1.205a74p+1
+0x1p+0
+0x1.0086dp+0
+0x1p+0
+0x1.296a6cp+0
+0x1.7ced1p+2
+0x1p+0
+0x1p+0
+0x1.0053eep+0
+0x1.09c5dcp+0
+0x1p+0
+0x1.a07194p+9
+0x1.0a151ap+0
+0x1.01e6ccp+0
+0x1.ef2d1p-84
+0x1.8eb89cp+3
+0x1.15dbb6p+0
+0x1.00307ap+0
+0x1.03571ep+0
+0x1.f5292ep-1
+0x1.59f064p+0
+0x1.0e26a8p+1
+0x1.6d6ab4p+5
+0x1.7ad0fcp+6
+0x1.40fc28p+0
+0x1.c6b9p+14
+0x1.071bfcp+0
+0x1.b0cb28p+7
+0x1.1614b2p+1
+0x1.4bdc7ep+0
+0x1.358db8p+7
+0x1.405dp+3
+0x1.0461d4p+0
+0x1p+0
+0x1.a8b5b2p+7
+0x1.130dbap+7
+0x1.259792p+3
+0x1.2fcf92p-1
+0x1.0092d2p+0
+0x1.0fea96p+0
+0x1.000024p+0
+0x1.a0abccp+5
+0x1.3b1076p+0
+0x1.192914p+5
+0x1.85f5dap-9
+0x1.0b2ae8p+0
+0x1.dc84ap+1
+0x1.2121acp+8
+0x1.b144fep+0
+0x1.131a68p+1
+0x1.28131p+0
+0x1.35dc48p+5
+0x1.b81b5p-51
+0x1.0a1caep+0
+0x1.f9ef34p+0
+0x1.95da52p+0
+0x1p+0
+0x1.3032a2p-1
+0x1.1cc56ep+0
+0x1.c77bfcp+0
+0x1.05370ep+0
+0x1.d6d0c6p+2
+0x1.2fbfap-1
+0x1p+0
+0x1.0000b8p+2
+0x1.b8c316p+1
+0x1.00010cp+0
+0x1.028104p+0
+0x1p+0
+0x1.13f12cp+0
+0x1p+0
+0x1p+0
+0x1.fb7e4ep+53
+0x1p+0
+0x1.780d04p+9
+0x1.1973c4p+6
+0x1.b09184p+0
+0x1.b4ed32p+51
+0x1p+0
+0x1.00b82p+0
+0x1.198ba4p+0
+0x1.57b63cp+7
+0x1.0016d4p+0
+0x1p+0
+0x1.01a3e4p+0
+0x1.e8d11ep+44
+0x1.b7e5d4p+13
+0x1.00667cp+0
+0x1.06ed08p+0
+0x1.05f47ap+0
+0x1.4aa86ap+0
+0x1.04aeap+0
+0x1p+0
+0x1p+0
+0x1.3b13a8p+11
+0x1.596846p+47
+0x1.0d8c64p+0
+0x1.0012aap+0
+0x1p+0
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 07/17] benchtests: Add log1p benchmark
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (5 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 06/17] benchtests: Add log2p1f benchmark Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-29 19:02   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 08/17] benchtests: Add log10p1f benchmark Adhemerval Zanella
                   ` (10 subsequent siblings)
  17 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

Random inputs x*2^e where x is random in [1/2,1] and e in [-29,127].
---
 benchtests/Makefile      |    1 +
 benchtests/log1pf-inputs | 1005 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 1006 insertions(+)
 create mode 100644 benchtests/log1pf-inputs

diff --git a/benchtests/Makefile b/benchtests/Makefile
index 92c0cf5e7d..052d496989 100644
--- a/benchtests/Makefile
+++ b/benchtests/Makefile
@@ -73,6 +73,7 @@ bench-math := \
   log10 \
   log10f \
   log1p \
+  log1pf \
   log2 \
   log2f \
   log2p1f \
diff --git a/benchtests/log1pf-inputs b/benchtests/log1pf-inputs
new file mode 100644
index 0000000000..dcf79e82cd
--- /dev/null
+++ b/benchtests/log1pf-inputs
@@ -0,0 +1,1005 @@
+## args: float
+## ret: float
+## includes: math.h
+# Random inputs x*2^e where x is random in [1/2,1] and e in [-29,127]
+## name: workload-random
+0x1.c78e3p+14
+0x1.48495cp+92
+0x1.4b1328p+101
+0x1.9a5a14p+58
+0x1.41168p-3
+0x1.302f02p+27
+0x1.d10646p+119
+0x1.a94a78p+23
+0x1.4dbaecp-4
+0x1.d91022p+79
+0x1.15a1cp-2
+0x1.2dfc7ap-14
+0x1.3687dep-20
+0x1.40df16p+120
+0x1.59de46p-21
+0x1.c94704p+22
+0x1.bbcb8p-3
+0x1.a50b8ap+63
+0x1.3195c2p+28
+0x1.8b82ecp+9
+0x1.0fd406p-6
+0x1.18ea9cp+99
+0x1.fa7eb4p+61
+0x1.542ac6p+90
+0x1.db1fe8p-23
+0x1.5add68p+47
+0x1.31596ap+110
+0x1.fac144p+72
+0x1.ec4f38p+12
+0x1.ec0826p-24
+0x1.6eba14p+45
+0x1.89ff32p+98
+0x1.e97588p-9
+0x1.c9a5fap+77
+0x1.9ab35ep+42
+0x1.c588c8p+62
+0x1.605674p+95
+0x1.52d5d6p+22
+0x1.9856a8p+29
+0x1.b8a602p+64
+0x1.42695cp-19
+0x1.7d557cp+43
+0x1.94417p+21
+0x1.c0728cp+68
+0x1.90cddp+82
+0x1.b7434p+68
+0x1.2b73bcp+84
+0x1.191af2p+4
+0x1.72b818p+60
+0x1.9e46ep+8
+0x1.f2ae94p+70
+0x1.0baa78p+110
+0x1.581e48p-4
+0x1.43f84ap+30
+0x1.794728p-2
+0x1.cbcd88p-9
+0x1.dfad2p+106
+0x1.be2368p-26
+0x1.575892p+43
+0x1.9f0008p+84
+0x1.173adcp-15
+0x1.33982p+14
+0x1.f2b8f4p+17
+0x1.ea0a08p+4
+0x1.3960d8p-27
+0x1.62e26cp+126
+0x1.7b60a4p-27
+0x1.6f03cap+29
+0x1.99ac0cp+116
+0x1.ff26d4p+18
+0x1.f9d1aep+2
+0x1.0f1e66p+61
+0x1.9bdfdep+52
+0x1.02f87cp-26
+0x1.d37e0ap+121
+0x1.e3495p+108
+0x1.421a48p+94
+0x1.4061a8p+94
+0x1.3c8fb8p+126
+0x1.def69ep-20
+0x1.348b92p+82
+0x1.30ad6ep+93
+0x1.2ce07cp+12
+0x1.c408dp-12
+0x1.cd7284p-15
+0x1.2b7638p+27
+0x1.746976p+82
+0x1.8ddae4p-12
+0x1.81efe8p+76
+0x1.3d4b4ep-14
+0x1.7f06acp+57
+0x1.fcbf08p+29
+0x1.5fba1ep+80
+0x1.18101ep+93
+0x1.1532eep+89
+0x1.837216p+82
+0x1.6acd42p+93
+0x1.f57efp+29
+0x1.699bf4p+46
+0x1.ad6918p+96
+0x1.b795b8p+91
+0x1.a7c832p+14
+0x1.8f63b4p+103
+0x1.63da54p+60
+0x1.7ea5a8p+76
+0x1.1a80c8p+124
+0x1.8b317ap+27
+0x1.cced4p+114
+0x1.ce4cbcp-21
+0x1.561304p+123
+0x1.0addcep+33
+0x1.94edf8p+60
+0x1.cba4fcp+85
+0x1.aa558cp+101
+0x1.690c84p+80
+0x1.57aa64p+40
+0x1.4cb082p+102
+0x1.a2c26p+53
+0x1.8fa5fcp+103
+0x1.933fe8p+14
+0x1.a22faep+112
+0x1.ff8c2p+14
+0x1.2e15c2p+62
+0x1.2baacap+103
+0x1.43602p+26
+0x1.927d7p+34
+0x1.f3a606p-15
+0x1.49ac3ep+94
+0x1.95b7e4p+26
+0x1.b1612cp+30
+0x1.4b4b6ap+11
+0x1.02229cp-2
+0x1.339d92p+76
+0x1.e3e66p-5
+0x1.0206bep-25
+0x1.d8f222p-30
+0x1.34ab66p+107
+0x1.720baep+26
+0x1.f83ab4p+101
+0x1.1a3096p+35
+0x1.4ed274p+104
+0x1.2fd074p-12
+0x1.223b6cp+35
+0x1.17b0c2p+22
+0x1.292496p-10
+0x1.68be8ep+81
+0x1.9d9f94p+23
+0x1.7e0f22p-19
+0x1.fc5a44p+54
+0x1.2ca3ccp+81
+0x1.4a77dap-29
+0x1.cc29c4p+93
+0x1.295e5ep+118
+0x1.359e08p-14
+0x1.11b84cp+25
+0x1.083ceep+102
+0x1.1fbe94p-15
+0x1.b0f068p+43
+0x1.ede1ap+43
+0x1.670c9ep+37
+0x1.9b3568p+97
+0x1.047f1cp+2
+0x1.62ce96p+112
+0x1.42a968p+48
+0x1.fbbd34p+10
+0x1.5ad592p+45
+0x1.55505ep-21
+0x1.703858p+50
+0x1.8ed60cp+52
+0x1.e0bf78p+5
+0x1.5db4f8p-18
+0x1.42575p+40
+0x1.a3a58p+91
+0x1.a89f2ap+34
+0x1.3bfc7cp+7
+0x1.eb7722p+103
+0x1.1ff1b8p+3
+0x1.7549aap+3
+0x1.9dec4p-30
+0x1.cec6bp+23
+0x1.59baaap+115
+0x1.f2bda4p+48
+0x1.1708bep+8
+0x1.315ee8p+17
+0x1.1f438ap+55
+0x1.151096p+119
+0x1.cd1ae4p+68
+0x1.7bede6p+9
+0x1.1aed6ap+102
+0x1.ffe9dcp+20
+0x1.e8911p+55
+0x1.1e844cp+48
+0x1.b2fd3ap-21
+0x1.2f5366p-23
+0x1.1346dap+58
+0x1.de57d4p+23
+0x1.4a36c6p+20
+0x1.40806ep+77
+0x1.ef9586p+10
+0x1.60f92ep+53
+0x1.ee3824p+73
+0x1.8edde4p+54
+0x1.909c74p-21
+0x1.2fc7bcp+108
+0x1.92e0f8p+117
+0x1.5bf1fcp+36
+0x1.79d04p+23
+0x1.6d2c2ap+37
+0x1.800ab8p+8
+0x1.d3ba46p+35
+0x1.919584p+116
+0x1.43b9d6p+27
+0x1.8ce338p+63
+0x1.73897ep+14
+0x1.835668p+66
+0x1.cc770cp+65
+0x1.b9c258p+52
+0x1.018998p+117
+0x1.78032p-18
+0x1.3622dep-4
+0x1.35b20ap+6
+0x1.cca16p+42
+0x1.27f6a4p+78
+0x1.b79478p+41
+0x1.569bfp-16
+0x1.460578p-20
+0x1.963b2p-28
+0x1.12fceep+65
+0x1.6161c8p+25
+0x1.a5a884p+104
+0x1.374e64p+124
+0x1.6ca26ap-14
+0x1.92a25cp+108
+0x1.ff3df8p+7
+0x1.d1b016p+48
+0x1.1babc6p+74
+0x1.99fc8cp+60
+0x1.f8c8fcp+20
+0x1.0fb918p+9
+0x1.8bceap+74
+0x1.e8204p+66
+0x1.b857b6p+52
+0x1.76973p+87
+0x1.aa7d1ap+124
+0x1.7b6cdp-8
+0x1.f775ap+16
+0x1.30b07ap+59
+0x1.5bad4p+94
+0x1.952a02p+122
+0x1.749176p+123
+0x1.e59b1ep-4
+0x1.703cbcp+70
+0x1.5298d2p+77
+0x1.f09cfp+97
+0x1.13832ep-25
+0x1.952d74p+104
+0x1.2be9fp-23
+0x1.1f0e24p+103
+0x1.652f96p-16
+0x1.66cebcp+57
+0x1.4725f4p-23
+0x1.b570fcp-23
+0x1.44b468p+68
+0x1.2f344p-21
+0x1.3f4edap+20
+0x1.92c7fcp+53
+0x1.523ec2p+62
+0x1.83d1eep+16
+0x1.77eeaep+101
+0x1.ba8b3p-25
+0x1.c1dd2cp+67
+0x1.7de188p+29
+0x1.7cc2dep+105
+0x1.a2c70ap+83
+0x1.979716p+9
+0x1.b2ccd4p+71
+0x1.6335a4p+22
+0x1.913b3p+90
+0x1.2d549cp-22
+0x1.ef209cp+12
+0x1.378f4cp+68
+0x1.9d1174p+110
+0x1.6b2932p+27
+0x1.b24748p+32
+0x1.a849f4p+57
+0x1.c354f4p+125
+0x1.28299p+88
+0x1.82a79ap+93
+0x1.cc5a3p+2
+0x1.f52c34p-6
+0x1.8deb48p+20
+0x1.3e8efep-12
+0x1.8c6954p+23
+0x1.77ee34p+82
+0x1.80c7dp+86
+0x1.04a6d8p+32
+0x1.019068p+77
+0x1.a8356cp+16
+0x1.8971dep+59
+0x1.dddddcp-20
+0x1.c92964p+85
+0x1.0f431ep+126
+0x1.584092p+121
+0x1.4d45f8p-3
+0x1.9ac9d8p+5
+0x1.971d64p-24
+0x1.911ba4p+76
+0x1.2a89acp+80
+0x1.33f062p+113
+0x1.691c9ap+100
+0x1.827bfcp+64
+0x1.1f7b46p+101
+0x1.a5d6eep+88
+0x1.4de20cp+1
+0x1.784a7p+28
+0x1.6573bp+57
+0x1.1be33p+107
+0x1.13c7p+37
+0x1.081416p+27
+0x1.c41d7cp+36
+0x1.cc4cbcp+88
+0x1.a9c4e8p+86
+0x1.f57668p-1
+0x1.b42b9cp+64
+0x1.bb8cfp-10
+0x1.72c6c8p+24
+0x1.a02fbep+67
+0x1.5e7e62p+84
+0x1.9002b4p+69
+0x1.74eb64p-24
+0x1.80d85p+123
+0x1.50fe44p+31
+0x1.012cc8p-9
+0x1.eb2182p+110
+0x1.945b8cp-27
+0x1.e73c6cp-1
+0x1.8b1d6ap+4
+0x1.e37d54p+4
+0x1.78d304p+32
+0x1.a45042p+58
+0x1.99d3d4p-9
+0x1.6a379cp+34
+0x1.34a222p+48
+0x1.d05824p+15
+0x1.4cef9ap-27
+0x1.dab2fcp-13
+0x1.21465ep+59
+0x1.c2239cp+77
+0x1.f094dap+85
+0x1.a57344p+0
+0x1.cd14d6p-19
+0x1.7e3bccp+53
+0x1.d4264p-14
+0x1.ae14p+69
+0x1.36af58p+0
+0x1.7c43bp+9
+0x1.10551p+9
+0x1.514b0ap-17
+0x1.e74e42p+89
+0x1.6107aap+8
+0x1.51c72cp+114
+0x1.6fd3fp+89
+0x1.dd9fb8p-10
+0x1.1dece6p+75
+0x1.05af5ap+6
+0x1.eafe46p+104
+0x1.b498dp+65
+0x1.2ed2b4p-24
+0x1.ae9ff4p+52
+0x1.e0b21cp+95
+0x1.3f0124p+31
+0x1.d56474p+81
+0x1.20f0ccp+68
+0x1.594a9cp+0
+0x1.35f866p+13
+0x1.a3ffd2p+117
+0x1.0edd6ep+114
+0x1.e2e148p+2
+0x1.d241ccp+105
+0x1.0b021ep+82
+0x1.6e3d3p+40
+0x1.906e6cp+10
+0x1.50861cp+61
+0x1.5ea378p+8
+0x1.cea9e8p+119
+0x1.5c3ef4p-5
+0x1.e71eb8p+59
+0x1.3b8e0cp+114
+0x1.119f66p+121
+0x1.8261cap+108
+0x1.0f6d6ep+103
+0x1.d35b7cp-14
+0x1.b3df3ep-27
+0x1.620ecp+81
+0x1.84385p+56
+0x1.26090ep-13
+0x1.951978p+84
+0x1.33d696p+17
+0x1.774ap+65
+0x1.e24d1p+0
+0x1.2bcd16p+71
+0x1.df2954p-20
+0x1.ebf7b6p+99
+0x1.a7be3p+82
+0x1.508f92p-29
+0x1.4c43acp+116
+0x1.bd2648p-13
+0x1.c0e1b6p-9
+0x1.4c529p+88
+0x1.62b418p-13
+0x1.8d524cp-17
+0x1.0755fp+65
+0x1.af4dd8p-11
+0x1.a1d094p+51
+0x1.50b074p+38
+0x1.9bc71cp-3
+0x1.88b7fcp+111
+0x1.dc8924p+77
+0x1.d6e174p+35
+0x1.ca0538p-13
+0x1.5ba842p+50
+0x1.fdbbdcp+4
+0x1.ddb1a6p+84
+0x1.18c1f2p+31
+0x1.f3afe2p+68
+0x1.acc2e4p-2
+0x1.d92dfp+23
+0x1.f61cf4p+111
+0x1.6719ecp+101
+0x1.80e2ccp+74
+0x1.f8a5e8p+21
+0x1.f6b4ap+95
+0x1.216d62p+61
+0x1.dea2c4p+58
+0x1.a8f8dp+33
+0x1.5bcc0ap+78
+0x1.5dc2a8p+62
+0x1.dff08p-7
+0x1.4a9768p-14
+0x1.070104p+99
+0x1.67d5fp-21
+0x1.435c4p+27
+0x1.7aadbcp-9
+0x1.eb517ap+0
+0x1.1e63f8p+2
+0x1.154b94p-18
+0x1.a456p-24
+0x1.8307ap+34
+0x1.158706p+21
+0x1.7c14acp+0
+0x1.0d4f2ap+92
+0x1.43411ap+33
+0x1.e269dcp+60
+0x1.420fa8p-20
+0x1.6627d4p+88
+0x1.e27a8p+102
+0x1.a019ccp+125
+0x1.79684p+74
+0x1.51d7eep+3
+0x1.d6179p+71
+0x1.a73554p+67
+0x1.9b29f2p+106
+0x1.a363a8p+109
+0x1.c97f9ep+103
+0x1.3c408p+77
+0x1.ba923p+99
+0x1.0eebfep+72
+0x1.f3a6f4p+22
+0x1.519874p+117
+0x1.badc1cp+93
+0x1.ced474p+106
+0x1.f0c904p-13
+0x1.1ceedep+52
+0x1.656258p-14
+0x1.006cap+104
+0x1.a6960ap+90
+0x1.3c2162p+80
+0x1.0a744ap+24
+0x1.e50c24p+48
+0x1.ed24f4p-18
+0x1.00e7bep+37
+0x1.30215ap+105
+0x1.7dd83cp+126
+0x1.dcf948p+39
+0x1.6a3be8p+50
+0x1.942234p+19
+0x1.2c2ea2p+74
+0x1.93853p-22
+0x1.eeb9ap+105
+0x1.58dcc4p-27
+0x1.b0cc4cp+2
+0x1.fb1334p+73
+0x1.f2f5cap+111
+0x1.c409dp+29
+0x1.0930a6p+24
+0x1.5c2174p+63
+0x1.ab1fc8p+79
+0x1.ffdba4p+75
+0x1.7cdb48p-11
+0x1.ffddp-27
+0x1.ba4628p+21
+0x1.f22dbep+63
+0x1.0b047ep+21
+0x1.4ce8a4p+7
+0x1.0e6b0cp+61
+0x1.57e578p+64
+0x1.c5d5a8p+17
+0x1.e0afep+5
+0x1.bc466ap+79
+0x1.74a8a4p+114
+0x1.6d508ep+89
+0x1.49e98p+48
+0x1.21b884p+103
+0x1.0ab83ap+90
+0x1.07570ep+110
+0x1.cfffp+37
+0x1.ca655cp+90
+0x1.a55c7cp+25
+0x1.f7b02cp+18
+0x1.57d4b2p+17
+0x1.4bffbp+48
+0x1.08ffbap+95
+0x1.f98ce8p+59
+0x1.a265aep+88
+0x1.45d7acp+20
+0x1.2ad7dap+88
+0x1.62a68cp+70
+0x1.e025ep+101
+0x1.90de6p+121
+0x1.f346acp+70
+0x1.27422ap+34
+0x1.a9408cp+95
+0x1.868eb4p-29
+0x1.b2970cp+104
+0x1.b54268p-14
+0x1.8d8d04p-8
+0x1.fc3416p+87
+0x1.74f35p-19
+0x1.c9a32cp+121
+0x1.f7585p+91
+0x1.3ced2p+119
+0x1.d666a6p+115
+0x1.de1114p+1
+0x1.f893ep+80
+0x1.299b54p+61
+0x1.bc9b18p+35
+0x1.beac46p-11
+0x1.09f0bp+63
+0x1.481d54p+47
+0x1.49203p+107
+0x1.4c321ap+37
+0x1.255248p+7
+0x1.67ff82p+82
+0x1.054522p+125
+0x1.ff16c8p+0
+0x1.7c0998p+25
+0x1.09b04cp-18
+0x1.a80cfcp+115
+0x1.fcfffcp-24
+0x1.46e548p+42
+0x1.dc7eeap-21
+0x1.50719cp+20
+0x1.4f7f94p+9
+0x1.c4d6cp+116
+0x1.4b691cp+108
+0x1.672e42p-22
+0x1.8656p+43
+0x1.5bdcc8p+124
+0x1.72661ep+57
+0x1.865e68p+68
+0x1.1192bcp+83
+0x1.15b732p+76
+0x1.2c5c48p+28
+0x1.52a1ap+117
+0x1.7deaa4p+82
+0x1.03c784p-11
+0x1.d7e19cp-13
+0x1.63d338p+87
+0x1.82ff8ep+23
+0x1.7e95ap+59
+0x1.f60af8p+15
+0x1.ec346ep+32
+0x1.a27c8cp+67
+0x1.907d3cp-22
+0x1.d4da32p+9
+0x1.3822d6p+43
+0x1.06638ep+39
+0x1.eeb39ep+20
+0x1.d8bd88p+50
+0x1.84668ep+34
+0x1.120c92p+121
+0x1.a93be6p+65
+0x1.9563f4p+100
+0x1.3327c6p+43
+0x1.a9715p+17
+0x1.d074ep+73
+0x1.20628ep-7
+0x1.61d828p+81
+0x1.863c42p+106
+0x1.afa75p-20
+0x1.d1d34p+50
+0x1.e5fe78p+71
+0x1.c1c444p+6
+0x1.5a8e32p-3
+0x1.f6abb4p+50
+0x1.2fc66cp+55
+0x1.d1d578p-17
+0x1.cd4182p+53
+0x1.87fcp+78
+0x1.de95fep+15
+0x1.7e52bep+35
+0x1.cc0276p+81
+0x1.f676f4p+124
+0x1.6f025cp-28
+0x1.14f37ap+46
+0x1.5bb684p-4
+0x1.741e6p+42
+0x1.1068f4p+25
+0x1.39efep+79
+0x1.903634p+101
+0x1.9aabacp+46
+0x1.7cffb4p+43
+0x1.7b9352p-27
+0x1.b0a5b8p+19
+0x1.a226b4p+65
+0x1.f6f1acp+41
+0x1.b026dep+92
+0x1.472994p+123
+0x1.e0ca9cp-17
+0x1.5ac904p+11
+0x1.60cacp+67
+0x1.79072p+89
+0x1.46fdccp+87
+0x1.f512c8p+70
+0x1.49d4dp+0
+0x1.37dd84p+77
+0x1.1281aep+126
+0x1.300db6p+100
+0x1.f4128ap+115
+0x1.31e05p+46
+0x1.92e078p+96
+0x1.274c92p-18
+0x1.c15cfcp+87
+0x1.9c9c26p+97
+0x1.f2736cp+43
+0x1.32d744p+99
+0x1.7ff204p+113
+0x1.7551d4p+18
+0x1.4f48d6p+3
+0x1.917b02p-9
+0x1.70b748p-20
+0x1.d995bep+120
+0x1.5b9a8ep+126
+0x1.2a16dep+11
+0x1.8eba58p+36
+0x1.e0e7d2p+60
+0x1.7d7b9ep+8
+0x1.2600cp+124
+0x1.dbd354p-21
+0x1.e48b7cp+49
+0x1.d69a48p-4
+0x1.6aa834p+14
+0x1.e74886p+15
+0x1.2ac858p+92
+0x1.9d1846p+71
+0x1.3f5248p+1
+0x1.07e47cp-5
+0x1.ef1cc8p+15
+0x1.e8c3fcp+65
+0x1.6f7c44p+13
+0x1.d9e316p+95
+0x1.62c2ep+112
+0x1.5a1d42p+3
+0x1.d06c94p+53
+0x1.02e408p+93
+0x1.d6cf8cp+99
+0x1.99518p+81
+0x1.96a648p+47
+0x1.b61406p+105
+0x1.28f042p+81
+0x1.b7b51ep+99
+0x1.197a2ap+70
+0x1.125076p+29
+0x1.8ace44p+114
+0x1.bc2894p-23
+0x1.fab642p+99
+0x1.74f0f8p+43
+0x1.35c95cp+3
+0x1.e63cc8p+68
+0x1.5e67a6p+111
+0x1.8a2106p+47
+0x1.b5cbd4p+24
+0x1.9bef3cp+43
+0x1.79f9b4p+122
+0x1.026196p+21
+0x1.d8f1c4p+112
+0x1.5cc3b8p+2
+0x1.fb5a02p+99
+0x1.d757e8p+95
+0x1.4c6c6ep+30
+0x1.a252fap+120
+0x1.6b28fcp+18
+0x1.393468p+67
+0x1.b71dc8p-28
+0x1.e1bd2p+14
+0x1.7b54fep-25
+0x1.fda27cp+82
+0x1.64b6a2p-19
+0x1.3093bep+1
+0x1.a3682cp-23
+0x1.f6e6bep+72
+0x1.3e6df8p+71
+0x1.08b9b4p+102
+0x1.fecd98p+36
+0x1.a4b34p+119
+0x1.3937b8p+44
+0x1.8feb44p+67
+0x1.474cdp-28
+0x1.31c2eap+119
+0x1.68009cp-30
+0x1.9bf9dep+0
+0x1.577e1cp-16
+0x1.56fbep+79
+0x1.b1518p+27
+0x1.150692p+30
+0x1.7f3282p+95
+0x1.0782f4p-7
+0x1.b759a6p+27
+0x1.0adec6p+72
+0x1.77a9c6p-4
+0x1.bf9d96p-29
+0x1.9bd634p-23
+0x1.e9cep+99
+0x1.f7f754p+57
+0x1.5ddf7p+122
+0x1.59ee6p-1
+0x1.12910ep+118
+0x1.71fd44p+74
+0x1.707568p-4
+0x1.fd93a4p+112
+0x1.855fb4p+18
+0x1.3f1fcap+9
+0x1.c0a59cp+83
+0x1.6f2dacp-11
+0x1.89a71cp+5
+0x1.bee8p+39
+0x1.0be354p+44
+0x1.aff39p+67
+0x1.5d24c4p-15
+0x1.7cc108p+31
+0x1.d32a18p+38
+0x1.0ea1b8p+65
+0x1.a213dp+89
+0x1.30dd9cp-8
+0x1.2a4a3p+36
+0x1.7b3cbcp+97
+0x1.1af5b6p+122
+0x1.42af5cp-26
+0x1.0d4742p+88
+0x1.612c34p+66
+0x1.4dd1ap+125
+0x1.901f28p+115
+0x1.b15c54p-8
+0x1.1e653p+51
+0x1.ea9588p+126
+0x1.84d654p-19
+0x1.c97e52p+51
+0x1.462354p+83
+0x1.796108p+98
+0x1.f322ap+32
+0x1.3ce698p+13
+0x1.acbb5ap+9
+0x1.17a4bap+9
+0x1.98d19ap+112
+0x1.457ddp+13
+0x1.f6944cp+49
+0x1.cd2cbep+2
+0x1.38c15ap-12
+0x1.e41944p+3
+0x1.57b62ap+43
+0x1.725aaep+67
+0x1.65e4eep+63
+0x1.cbd734p+66
+0x1.e772e8p-6
+0x1.37d578p+68
+0x1.50ae48p+108
+0x1.10d0fcp-25
+0x1.f9b7f8p+66
+0x1.3739ecp+85
+0x1.3d9934p-18
+0x1.2d6a9cp+79
+0x1.c1cbacp-9
+0x1.2e2838p+20
+0x1.f98104p+51
+0x1.ec9cacp-10
+0x1.3ff662p+14
+0x1.f6ab04p+22
+0x1.53919ep+46
+0x1.6abf86p+11
+0x1.242a66p+26
+0x1.1fa5p+54
+0x1.5f8ebcp+60
+0x1.1c5062p+108
+0x1.3a512cp+72
+0x1.644c3p+91
+0x1.9fbd4p+10
+0x1.eaf508p+46
+0x1.676988p+10
+0x1.0ef3fcp+80
+0x1.10effp+122
+0x1.0b42a6p+11
+0x1.150394p+66
+0x1.b2643ep+99
+0x1.d5a0e4p+2
+0x1.9c408p+18
+0x1.743e64p+75
+0x1.045344p+121
+0x1.f1bb38p+5
+0x1.6b8874p+94
+0x1.2d15bep+116
+0x1.f5e62p+101
+0x1.0ed362p+23
+0x1.267a4ap-7
+0x1.a049b4p+13
+0x1.e0b384p-5
+0x1.ac764ap+54
+0x1.ddf4c4p+117
+0x1.19adacp+103
+0x1.f250dp+63
+0x1.2e9f22p+98
+0x1.62d7ecp+17
+0x1.1694dap+52
+0x1.698dc6p+104
+0x1.fbba02p+39
+0x1.7f5b78p+17
+0x1.d0c96ap+23
+0x1.44d132p-29
+0x1.b2fb4cp+58
+0x1.8e55c4p+68
+0x1.a08278p+100
+0x1.f5258ep+41
+0x1.628518p-21
+0x1.4e55a4p+102
+0x1.2802cp+95
+0x1.c941f8p-24
+0x1.89858ap+67
+0x1.c7247cp-3
+0x1.3d7d2ep+110
+0x1.350f86p+57
+0x1.537d4p+11
+0x1.922ed4p+9
+0x1.35687ep+28
+0x1.e30698p+91
+0x1.5884b4p+38
+0x1.5544aap-21
+0x1.a9d5bap-22
+0x1.d3b1e2p+11
+0x1.989d34p+44
+0x1.1e1688p+24
+0x1.a09474p+39
+0x1.33fdb8p+22
+0x1.07201ep+96
+0x1.ab8c4cp+53
+0x1.f372ep+124
+0x1.4a12acp-21
+0x1.d062d4p-25
+0x1.9aa33p+18
+0x1.9e5dfp-5
+0x1.a207acp+71
+0x1.743dacp+46
+0x1.6dc7d4p+25
+0x1.7a79d2p+99
+0x1.1c8c86p+17
+0x1.fb41d4p+67
+0x1.6eba0cp+43
+0x1.89051p+75
+0x1.f3f0dp+13
+0x1.1a22d2p+109
+0x1.7882c2p+98
+0x1.39d0e4p+88
+0x1.59376cp+12
+0x1.52307cp+115
+0x1.5ee274p+32
+0x1.975b2p+107
+0x1.fc09ecp+116
+0x1.fa266cp+117
+0x1.14d94ep+91
+0x1.d07092p+57
+0x1.048b56p+23
+0x1.1a9444p+124
+0x1.33ee9cp+42
+0x1.ce1e94p+5
+0x1.298e6ap+12
+0x1.83f364p+107
+0x1.a8041ep+72
+0x1.bdad9ep+98
+0x1.dd3bacp+43
+0x1.0f5f74p+11
+0x1.3609d4p+87
+0x1.36514ap-19
+0x1.48ab3p+106
+0x1.b405e8p+117
+0x1.dd1888p+42
+0x1.003064p+34
+0x1.42ee58p-2
+0x1.d65efcp+120
+0x1.93379p-8
+0x1.0ed062p+60
+0x1.9d6b7p+122
+0x1.eb7c38p-6
+0x1.e3acd4p+33
+0x1.a56b18p-15
+0x1.c47d0cp+115
+0x1.98da58p-7
+0x1.836538p+35
+0x1.602f52p+89
+0x1.19d46cp+93
+0x1.5f842cp+106
+0x1.7ccd92p+65
+0x1.0a8b8ep+19
+0x1.f5e4c2p+46
+0x1.8245e8p+85
+0x1.e70628p+12
+0x1.d6de78p+72
+0x1.8c17f4p+44
+0x1.3d7a4ap-6
+0x1.adbb94p+120
+0x1.c87cc6p+43
+0x1.99cc74p+7
+0x1.f8ec06p+18
+0x1.faca5cp+124
+0x1.23b434p-23
+0x1.d93cf6p+0
+0x1.ea87bcp+42
+0x1.cf38f8p+71
+0x1.536422p+99
+0x1.05a9e2p+100
+0x1.3f7a3ap+39
+0x1.8c70a6p+4
+0x1.e95c9ap+86
+0x1.135a0ep+46
+0x1.e1e24p+95
+0x1.91fe44p+95
+0x1.b407b8p+33
+0x1.dd491p+112
+0x1.8a6032p+78
+0x1.da346ap+72
+0x1.97be92p+29
+0x1.865e88p+73
+0x1.b9ab6cp+71
+0x1.af54bep+110
+0x1.e371e4p+15
+0x1.7e1d94p+92
+0x1.f304bp+83
+0x1.990e44p+43
+0x1.889c7cp+103
+0x1.bd9744p-17
+0x1.47d546p-29
+0x1.f930f2p+124
+0x1.b6102p+105
+0x1.ebac74p+52
+0x1.44af08p+8
+0x1.44dfbp+83
+0x1.55e238p+43
+0x1.a39c2p+28
+0x1.91faacp+107
+0x1.36d48cp+85
+0x1.e2d052p+104
+0x1.4825fcp+81
+0x1.97ab88p+47
+0x1.e3597cp-26
+0x1.a8ecf6p+27
+0x1.5cbf28p-24
+0x1.43c954p+23
+0x1.33f908p-9
+0x1.30f61ap+36
+0x1.43fafcp-19
+0x1.c2df2p+91
+0x1.e36e44p+26
+0x1.cf461cp-28
+0x1.994accp+125
+0x1.f6f952p+35
+0x1.37c426p-2
+0x1.26b718p+86
+0x1.aa1014p-27
+0x1.8d3cf8p+66
+0x1.d05446p+17
+0x1.34b966p+43
+0x1.401e0cp+41
+0x1.48070cp+91
+0x1.0db642p+4
+0x1.683af4p+121
+0x1.9a1162p+114
+0x1.30ca88p+9
+0x1.e79f4ep+55
+0x1.48725cp+16
+0x1.798c2p+106
+0x1.5913dcp-7
+0x1.e4f136p+63
+0x1.0a67c8p-9
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 08/17] benchtests: Add log10p1f benchmark
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (6 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 07/17] benchtests: Add log1p benchmark Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-29 19:03   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 09/17] math: Use exp10m1f from CORE-MATH Adhemerval Zanella
                   ` (9 subsequent siblings)
  17 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

It is based on log2f data.
---
 benchtests/Makefile        |    1 +
 benchtests/log10p1f-inputs | 2888 ++++++++++++++++++++++++++++++++++++
 2 files changed, 2889 insertions(+)
 create mode 100644 benchtests/log10p1f-inputs

diff --git a/benchtests/Makefile b/benchtests/Makefile
index 052d496989..d60fe789c8 100644
--- a/benchtests/Makefile
+++ b/benchtests/Makefile
@@ -72,6 +72,7 @@ bench-math := \
   log \
   log10 \
   log10f \
+  log10p1f \
   log1p \
   log1pf \
   log2 \
diff --git a/benchtests/log10p1f-inputs b/benchtests/log10p1f-inputs
new file mode 100644
index 0000000000..50a9739476
--- /dev/null
+++ b/benchtests/log10p1f-inputs
@@ -0,0 +1,2888 @@
+## args: float
+## ret: float
+## includes: math.h
+## name: workload-spec2017.wrf
+0x1.fe4c3p-1
+0x1.0e33e6p+1
+0x1.00000ap+0
+0x1.900028p+4
+0x1.f8cdeep+0
+0x1.332986p+7
+0x1.493696p+0
+0x1p+0
+0x1.38c67p+7
+0x1.029046p+1
+0x1.1bd31cp+4
+0x1.bb3e3ep+12
+0x1.000098p+0
+0x1.a7971p+7
+0x1p+0
+0x1.0001a8p+0
+0x1.00004ep+0
+0x1p+0
+0x1.0606f2p+0
+0x1.3e54a8p+11
+0x1.3a0662p+3
+0x1.000c72p+0
+0x1p+0
+0x1.0bf8b6p+0
+0x1.000204p+0
+0x1.500ad2p+0
+0x1p+0
+0x1.3e4cfp+8
+0x1.00006cp+0
+0x1.54f7fp+0
+0x1.267858p+0
+0x1.191ccp+0
+0x1.0cdb18p+1
+0x1.29bf1ep+15
+0x1.64bd92p+1
+0x1.255534p+0
+0x1p+0
+0x1.93bb82p+3
+0x1.1348ep+1
+0x1.00456ep+0
+0x1.08afbcp+8
+0x1.32c37ep+0
+0x1.3437cep-1
+0x1.000214p+0
+0x1.03d5ap+0
+0x1.172378p+6
+0x1p+0
+0x1.330f22p-1
+0x1.00b91p+0
+0x1.e831f2p+15
+0x1.092318p+9
+0x1p+0
+0x1.e80902p+7
+0x1.71ec54p+2
+0x1.1935dcp+0
+0x1.651082p+14
+0x1p+0
+0x1.0f41d8p+8
+0x1.17f4p+0
+0x1.7cf946p+9
+0x1.b14396p+0
+0x1.92f94p+1
+0x1.2f3784p-1
+0x1p+0
+0x1.305ad4p-1
+0x1.002a08p+0
+0x1.3e338p+5
+0x1.1863f6p+8
+0x1p+0
+0x1.ed8fd8p+58
+0x1p+0
+0x1p+0
+0x1.215fc8p+9
+0x1.1965bep+16
+0x1.00031cp+0
+0x1.00011p+0
+0x1p+0
+0x1.e384fep-20
+0x1p+0
+0x1.00020cp+0
+0x1.007e24p+0
+0x1.b14346p+0
+0x1.243ff8p+0
+0x1.3f6ac2p+3
+0x1.816ff6p+5
+0x1.0115ap+8
+0x1.162028p+16
+0x1.62692cp+0
+0x1.0227c8p+1
+0x1.4dda3ep+0
+0x1.418696p+0
+0x1.0272f4p+2
+0x1.62c6ecp+5
+0x1.3cd07ap+18
+0x1.0191eap+0
+0x1.21c3a2p+8
+0x1p+0
+0x1.000bf6p+0
+0x1.a4b51cp+7
+0x1.04d1f8p+0
+0x1.8de2b8p+0
+0x1.7b7a4ep+8
+0x1.1928acp+5
+0x1.305a8p-1
+0x1.ba8662p+5
+0x1p+0
+0x1.ab75a2p-12
+0x1.7cc13cp+9
+0x1.505306p+0
+0x1.63085p+0
+0x1.000064p+0
+0x1.b3f16ap+7
+0x1.1348f8p+1
+0x1.71fe88p+1
+0x1.0b7132p+4
+0x1.470316p+1
+0x1.3228b6p-1
+0x1.8dd666p+0
+0x1.38ed88p+12
+0x1.432218p+0
+0x1.00e0cap+0
+0x1.73eb44p+2
+0x1p+0
+0x1p+0
+0x1.bda15ep+7
+0x1.0272fep+2
+0x1.00171ep+0
+0x1p+0
+0x1.3faa86p+3
+0x1.33c2a2p-1
+0x1.3e48e2p+7
+0x1.017ef2p+0
+0x1.30115ap-1
+0x1.587444p+0
+0x1.3efed8p+8
+0x1.8a5526p+0
+0x1.cb1ecap+15
+0x1.1f5cp+0
+0x1.0001a4p+0
+0x1.1a20dap+7
+0x1.376e6p+0
+0x1.0001aap+0
+0x1.9182f6p-1
+0x1.000292p+0
+0x1.3d46a2p+12
+0x1.e177b6p+7
+0x1.3f5646p+1
+0x1.2ab784p+9
+0x1.dc81b4p+1
+0x1.0ef326p+0
+0x1.996588p-12
+0x1.740848p+3
+0x1.00016p+0
+0x1.ffd51ap+52
+0x1p+0
+0x1.4461ap+4
+0x1.08e7bcp+51
+0x1p+0
+0x1.106e98p+3
+0x1.5490e4p+0
+0x1.46703cp+4
+0x1.6b1e86p-29
+0x1.324caap+0
+0x1.0467ccp+0
+0x1.424574p+0
+0x1p+0
+0x1.001da4p+0
+0x1.364604p+0
+0x1p+0
+0x1.0951e2p+8
+0x1.408994p+0
+0x1.0003ap+0
+0x1.619e92p+12
+0x1.313e72p+2
+0x1.8b47p-6
+0x1.2190fp+2
+0x1.20aaacp+0
+0x1.f0059cp-1
+0x1p+0
+0x1.018e78p+0
+0x1.313e1p+2
+0x1p+0
+0x1.2efce4p-1
+0x1.5ebdap+0
+0x1p+0
+0x1.5e2488p+51
+0x1.bf95f2p+5
+0x1.5a1124p+16
+0x1.73bad6p+1
+0x1.00048ap+0
+0x1.0c9beap+8
+0x1p+0
+0x1.358c08p+7
+0x1.7f834ep-26
+0x1.3e56bcp+15
+0x1.52d8b2p+15
+0x1p+0
+0x1.00109cp+0
+0x1.0a0bb2p+0
+0x1p+0
+0x1.026908p+6
+0x1.370f22p+0
+0x1.5c6c5ap+1
+0x1.7fe4bcp+2
+0x1p+0
+0x1p+0
+0x1.42be68p+49
+0x1.0000d8p+0
+0x1.3abdf8p+12
+0x1.370a44p-12
+0x1.aef9f4p+0
+0x1.00001ep+2
+0x1.017c2p+0
+0x1.00b614p+0
+0x1.32f9f8p-1
+0x1p+0
+0x1.00ebf2p+0
+0x1.0c3116p+0
+0x1.00004p+0
+0x1.03b992p+0
+0x1p+0
+0x1.24eb3cp+0
+0x1.4c73ecp+51
+0x1.fad3ep+1
+0x1p+0
+0x1.32368ap-1
+0x1.000908p+0
+0x1.5ea59ep+12
+0x1.1928ccp+5
+0x1p+0
+0x1.21a93cp+8
+0x1p+0
+0x1.0001e8p+0
+0x1.95b6c2p-12
+0x1.00002p+0
+0x1.2399fap+9
+0x1.449b44p+0
+0x1p+0
+0x1.64a766p+15
+0x1.06ccecp+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.c81f9cp+1
+0x1.5ef196p+0
+0x1.022822p+1
+0x1.99beep+3
+0x1.1f417p+8
+0x1p+0
+0x1.c08726p+5
+0x1.397d9ep+0
+0x1.88e748p+18
+0x1.3b319p+9
+0x1.2fd3b6p-1
+0x1.0001aep+0
+0x1.4a0562p+5
+0x1.4e5f1ap+0
+0x1p+0
+0x1.017fbp+0
+0x1.acaf56p+57
+0x1.ef7d66p+8
+0x1.736c3cp+1
+0x1.12ddbep+0
+0x1.b85ebcp+6
+0x1.0e259p+1
+0x1.5cc2c4p+2
+0x1.99e614p+3
+0x1.f30aa6p+2
+0x1.3911c6p+15
+0x1.119b92p+1
+0x1.352a3p-1
+0x1.0001b2p+0
+0x1.00b26p+0
+0x1.bd730ep+60
+0x1.54fc5p+0
+0x1.5a4804p+0
+0x1.ff7eaep-1
+0x1.5cc268p+2
+0x1.1077aap+2
+0x1.1723d6p+0
+0x1p+0
+0x1p+0
+0x1.30c17p-1
+0x1.000648p+0
+0x1.91aa4cp+6
+0x1.17234p+6
+0x1p+0
+0x1.6d5b18p+2
+0x1.00027ap+0
+0x1.dc8224p+1
+0x1.a9eabep-6
+0x1.099edcp+1
+0x1.004118p+1
+0x1.58d5fcp+60
+0x1.000098p+0
+0x1.004e8p+0
+0x1.f32edap-1
+0x1.0394aep+0
+0x1.0689bp+2
+0x1.124e5cp+0
+0x1.71fe86p+1
+0x1.025ce2p+0
+0x1.46107cp+0
+0x1.047c74p+2
+0x1.a57e74p+15
+0x1.18bbcep+0
+0x1p+0
+0x1.65b9a4p+0
+0x1.0000eep+0
+0x1.08a4a4p+0
+0x1.0fe774p+1
+0x1.000128p+0
+0x1.3e95fp+12
+0x1.b14e3ap-56
+0x1.00007cp+0
+0x1.5619c2p+1
+0x1.4ac958p+0
+0x1.00031p+0
+0x1.003064p+0
+0x1.e119eap-1
+0x1.577b36p+0
+0x1p+0
+0x1.26ff2ap+0
+0x1.004ap+0
+0x1.0000a2p+0
+0x1.1fcc7ep+4
+0x1.6f959p+16
+0x1.000064p+0
+0x1.375c6ap+0
+0x1.6a806ep+2
+0x1p+0
+0x1.8e27aep+1
+0x1p+0
+0x1.000b22p+0
+0x1.8f0c12p+0
+0x1.192892p+5
+0x1.2bcaacp+1
+0x1.984264p+2
+0x1.0034cp+0
+0x1p+0
+0x1.abf4dp+0
+0x1.001044p+0
+0x1.0d26f4p+0
+0x1.626906p+0
+0x1.8bf0c2p+5
+0x1.02d288p+0
+0x1.900128p+4
+0x1.bbbbcp+12
+0x1.45fa5p+0
+0x1p+0
+0x1.01bef2p+0
+0x1.524f26p+2
+0x1.083b0ep+0
+0x1.4811e4p+0
+0x1.0163a8p+0
+0x1.9570fap+15
+0x1.3022f2p-1
+0x1.14c73ap+0
+0x1.0009d8p+0
+0x1.056b92p+63
+0x1.0025a4p+0
+0x1.36aad4p+17
+0x1.05c244p+8
+0x1.d00886p+17
+0x1.001188p+0
+0x1.3376ecp-1
+0x1.6719c8p+16
+0x1.02495p+0
+0x1.fd9bacp-1
+0x1.3882c6p+6
+0x1.3cb358p+0
+0x1.0ec93ep+0
+0x1.4fd2bap+1
+0x1.f8b68p+1
+0x1.33b1f2p-1
+0x1.ba7f4cp+1
+0x1p+0
+0x1.44a3d2p-17
+0x1.9a6a8p+2
+0x1.00918ap+6
+0x1.30d50ep-1
+0x1p+0
+0x1.0001bep+0
+0x1.05b93ep+0
+0x1.aa9d98p+0
+0x1.039b74p+0
+0x1.1ac25ep+8
+0x1p+0
+0x1.12b23ap+1
+0x1.4c5c52p+0
+0x1.07de64p+0
+0x1.950f94p+1
+0x1.001caap+47
+0x1.0a9448p+0
+0x1.01026cp+0
+0x1.03d74ap+0
+0x1p+0
+0x1.0032dap+0
+0x1.380922p-1
+0x1.c0e7ccp+15
+0x1.a35e4p+4
+0x1.25b1e6p+0
+0x1.000044p+2
+0x1.05ac24p+7
+0x1.1fa744p+44
+0x1.0007b2p+0
+0x1.2cca62p+2
+0x1.04be3ap+6
+0x1.00065p+0
+0x1.2b9f3ap+1
+0x1.74085p+3
+0x1p+0
+0x1.01fc4cp+0
+0x1.e137bcp+2
+0x1.097ac8p+0
+0x1.ad1458p+4
+0x1.c8587cp+1
+0x1.31d172p-1
+0x1.0b414ap+1
+0x1.664e36p+1
+0x1.30ae16p-1
+0x1p+0
+0x1.3b7e3cp+2
+0x1.9cc348p+64
+0x1p+0
+0x1p+0
+0x1.cdb384p-32
+0x1p+0
+0x1.00b998p+0
+0x1.36b69ep-1
+0x1.939538p+4
+0x1.dc9deep+4
+0x1.36f86ep+2
+0x1.02113cp+0
+0x1.035852p+0
+0x1.9de428p+2
+0x1.369814p+1
+0x1.147f44p+3
+0x1.031bc8p+0
+0x1.03f7cp+0
+0x1.000924p+0
+0x1.145e14p+2
+0x1.0000d4p+0
+0x1p+0
+0x1.54fdfp+2
+0x1.07c0ep+0
+0x1.829aeep+1
+0x1.000f08p+0
+0x1.34dcdp-1
+0x1p+0
+0x1.cd56e4p+1
+0x1.16400ap+8
+0x1p+0
+0x1.00000ap+2
+0x1.00a21p+0
+0x1.8d6286p+6
+0x1.de4f28p+1
+0x1.9f55b6p+48
+0x1.01c802p+0
+0x1.0327cp+0
+0x1.32fb52p-1
+0x1p+0
+0x1.2525dcp+0
+0x1.91da28p-6
+0x1.5a23a8p+0
+0x1.5f024ap+1
+0x1p+0
+0x1.0008f2p+0
+0x1.05563cp+0
+0x1.89381cp+0
+0x1.8bb056p+16
+0x1.7cc93ep+1
+0x1.8bf0acp+5
+0x1.1722bap+6
+0x1p+0
+0x1.00238ep+0
+0x1.ebb8d2p-1
+0x1.001194p+0
+0x1.6cd388p+1
+0x1.08e4bp+8
+0x1.00002p+0
+0x1.01a0bep+0
+0x1.00e7cep+8
+0x1.1193p+0
+0x1.06a9c8p+0
+0x1.11c7fep+0
+0x1.5ef17cp+0
+0x1.4ae72cp+0
+0x1.e0df4cp+41
+0x1.7e5468p+1
+0x1.8dd478p+0
+0x1.3c2784p+51
+0x1p+0
+0x1p+0
+0x1.b9d454p+12
+0x1.011a58p+0
+0x1.3efb48p+4
+0x1.000208p+0
+0x1.57b3eep+7
+0x1.000004p+0
+0x1.1cd6b8p+0
+0x1.c366fap+9
+0x1.466d2cp+0
+0x1p+0
+0x1.300096p-1
+0x1p+0
+0x1.bef388p+0
+0x1.0c20e8p+8
+0x1.397f2p+4
+0x1.037596p+2
+0x1.62a0a4p+52
+0x1.37269ap+0
+0x1.81fe24p+2
+0x1.dd4196p+56
+0x1.b143ep+0
+0x1p+0
+0x1.b8c2fp+1
+0x1.056b3ep+1
+0x1.3b6cbp+0
+0x1.3ffb2p+0
+0x1p+0
+0x1.3c21cp+0
+0x1.00312cp+0
+0x1p+0
+0x1.3822f8p+0
+0x1.02734p+2
+0x1.05a7dap+0
+0x1.6df1b4p+5
+0x1.0006f4p+0
+0x1.31aebep-1
+0x1p+0
+0x1p+0
+0x1.b997fap+18
+0x1.0570d8p+0
+0x1p+0
+0x1.0a9216p+42
+0x1.ef16f2p+1
+0x1p+0
+0x1.31269ep-1
+0x1.a9954ap+2
+0x1.1cc5e8p+0
+0x1.01d334p+0
+0x1.905f98p+4
+0x1.0310d4p+0
+0x1.16a62ap+0
+0x1.8dd6b2p+0
+0x1.395dcep+7
+0x1.ef5f92p+0
+0x1.000868p+0
+0x1p+0
+0x1.844a16p+2
+0x1.452efcp+0
+0x1p+0
+0x1.1c5da2p+6
+0x1.31ac3ap-1
+0x1.cc1bfp+2
+0x1p+0
+0x1.08215ap+0
+0x1.3b4306p+0
+0x1.71fe6p+1
+0x1.192bd8p+0
+0x1.262f78p+0
+0x1.00013cp+0
+0x1.33c486p-1
+0x1.000014p+0
+0x1.b8f4fp+1
+0x1.5f9f5ap-1
+0x1.059872p+0
+0x1p+0
+0x1.58168p+1
+0x1.826d5cp+0
+0x1p+0
+0x1.032a04p+0
+0x1p+0
+0x1.0c0a5cp+0
+0x1.668d9p+0
+0x1.2f9644p-1
+0x1p+0
+0x1.1821b8p+6
+0x1.b22e8ep+7
+0x1.4f7a78p+0
+0x1.52df24p+0
+0x1.48c612p+0
+0x1.93a19ap+4
+0x1.8bf102p+5
+0x1.122d94p+0
+0x1p+0
+0x1.00018p+0
+0x1.30083ap-1
+0x1p+0
+0x1p+0
+0x1.30d20ep-1
+0x1p+0
+0x1.0000dcp+0
+0x1.285bb4p+0
+0x1p+0
+0x1.0003a4p+0
+0x1p+0
+0x1.2ffcfcp-1
+0x1.093d96p+0
+0x1.239bfcp+0
+0x1.f7c33cp-27
+0x1.a9982ep+2
+0x1.1969f4p+4
+0x1.ff5c88p-1
+0x1.04db6ep+2
+0x1p+0
+0x1.f010dap-1
+0x1.13647p+7
+0x1p+0
+0x1.ea6e18p-10
+0x1.2d16eap+0
+0x1.02b668p+0
+0x1.191704p+4
+0x1.18f2b4p+0
+0x1.b186eap+0
+0x1.24c01ap+2
+0x1.6a3adap+16
+0x1p+0
+0x1p+0
+0x1.2f9f28p-1
+0x1.4b5da4p+0
+0x1.004054p+0
+0x1.002616p+8
+0x1.561954p+1
+0x1p+0
+0x1.4c4394p+0
+0x1.1eed34p+1
+0x1.a702eap+5
+0x1.ee054p+7
+0x1.1156a8p+0
+0x1.9a81fcp+2
+0x1.10ce16p-28
+0x1.b18b88p+0
+0x1.d9c4a8p+1
+0x1.0e275cp+0
+0x1.905f58p+4
+0x1p+0
+0x1.02f774p+0
+0x1.7ce226p+1
+0x1.0002bcp+0
+0x1.010f58p+0
+0x1p+0
+0x1.000198p+0
+0x1p+0
+0x1.4aa832p+0
+0x1.0006c2p+0
+0x1.358ca4p+7
+0x1.1edc64p+0
+0x1.003508p+0
+0x1.fdb69p+1
+0x1.0ff4fep+0
+0x1p+0
+0x1.b8c2fp+1
+0x1.284c16p+0
+0x1.00a228p+0
+0x1.03080cp+0
+0x1.91a8f4p+48
+0x1p+0
+0x1.2080fep+1
+0x1.0002f8p+0
+0x1.b14338p+0
+0x1.081288p+0
+0x1.71b9bep+0
+0x1.09c368p+0
+0x1.35ed64p+0
+0x1.8dd68cp+0
+0x1.d2cc42p+0
+0x1.9be0ecp+3
+0x1.7407fcp+3
+0x1.313ecp-1
+0x1.cdc978p+0
+0x1.0ed538p+1
+0x1.159af4p+8
+0x1p+0
+0x1.128694p+0
+0x1.2f1b06p-1
+0x1.19c0d8p+0
+0x1.dcc7c8p+1
+0x1.a33f8ap+7
+0x1.000158p+0
+0x1p+0
+0x1.28bdaep-16
+0x1.74086cp+3
+0x1.ea297cp+1
+0x1.5d87fp+2
+0x1.0e2658p+1
+0x1.621c14p+1
+0x1.9d8a8cp+3
+0x1p+0
+0x1.7807e8p+3
+0x1.74c924p+0
+0x1.a484e4p+53
+0x1.771c44p+0
+0x1.13d1e4p+2
+0x1.2fa402p-1
+0x1p+0
+0x1.024d72p+2
+0x1.064c6ap+8
+0x1.15d2dep+0
+0x1.9c004ep+3
+0x1.bc2fcap+12
+0x1.befdbep+0
+0x1.36461p+0
+0x1.6db7b8p+5
+0x1.0000cp+0
+0x1p+0
+0x1.02f354p+0
+0x1p+0
+0x1.000228p+0
+0x1.013fep+0
+0x1.213782p+0
+0x1p+0
+0x1.000204p+0
+0x1.a69cccp+7
+0x1.0036acp+0
+0x1.0982b8p+0
+0x1.81693cp-22
+0x1.1e5d64p+6
+0x1.0009f2p+0
+0x1.2fe96p-1
+0x1.0368f8p+0
+0x1.2d2cbep+0
+0x1.37bc04p-1
+0x1p+0
+0x1.d45d88p+1
+0x1.000694p+0
+0x1.000272p+0
+0x1p+0
+0x1.d0b2e6p+1
+0x1.2598a4p+3
+0x1p+0
+0x1.8b7d3p+2
+0x1.192902p+5
+0x1.3d5386p+0
+0x1.9c779ap+1
+0x1.08257cp+0
+0x1.0b8a4p+2
+0x1.01afa4p+3
+0x1.e48b7ap-1
+0x1.f30a5cp+2
+0x1.0df814p+0
+0x1.2f28p-1
+0x1.983f46p+3
+0x1.009094p+6
+0x1.326a3ep-1
+0x1.9767e6p+0
+0x1.1027fp+0
+0x1.3274f8p-1
+0x1.197a9cp+1
+0x1.3807p+2
+0x1.90533p+4
+0x1.0332ecp+0
+0x1.3ca37p+0
+0x1p+0
+0x1p+0
+0x1.3ff4dcp+0
+0x1p+0
+0x1.900046p+0
+0x1p+0
+0x1.195576p+5
+0x1.aec2ecp+7
+0x1.65b984p+0
+0x1.74677p+3
+0x1.423322p+0
+0x1.aeef9ep+16
+0x1.0338c4p+0
+0x1.1ae22ap+8
+0x1.cc4adcp+0
+0x1.d20a9ep+0
+0x1.cdbefcp-45
+0x1.03b23cp+0
+0x1.25970cp+3
+0x1.e6b02ep-1
+0x1p+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.000aa8p+0
+0x1.0054a4p+0
+0x1.06600ap+0
+0x1.b8601cp+6
+0x1.fea92cp+5
+0x1.6p+5
+0x1.c76586p+0
+0x1.90007ap+0
+0x1.ef2d1p-84
+0x1.03d5b6p+0
+0x1.0164ecp+0
+0x1.4441d8p+0
+0x1.005c42p+0
+0x1.046838p+0
+0x1.51f04ap+0
+0x1.cf822cp+0
+0x1.033b4ap+0
+0x1p+0
+0x1.091bep+0
+0x1p+0
+0x1.5bb2a4p+0
+0x1.01fe2cp+0
+0x1.2b96p+1
+0x1.242d9p+0
+0x1.42ade4p+0
+0x1p+0
+0x1.689714p+2
+0x1.4ac756p+0
+0x1p+0
+0x1.101ad8p+0
+0x1.6208e8p+41
+0x1.47091p+0
+0x1.3e28p+3
+0x1.04b70ep+0
+0x1p+0
+0x1.086c9p+0
+0x1.70eb62p+54
+0x1.dfb744p+4
+0x1p+0
+0x1.f302bcp-8
+0x1.8d5fd4p+6
+0x1.12d9a8p+0
+0x1.00a39p+0
+0x1p+0
+0x1.00003cp+0
+0x1.00031p+0
+0x1.58743ep+0
+0x1.003ae4p+0
+0x1.7de5cep+2
+0x1.096c7ep+0
+0x1.57e436p+1
+0x1.21fcb4p+2
+0x1.31297ap-1
+0x1p+0
+0x1.ab5fcp+16
+0x1.91e912p+42
+0x1.5cb206p+1
+0x1.000072p+0
+0x1.00f4d2p+0
+0x1.0ee52p+0
+0x1.000014p+0
+0x1.2f3a5ep-1
+0x1.3fc07cp+1
+0x1.64bd36p+1
+0x1.f48f56p-1
+0x1.0115f4p+0
+0x1.1650bcp+2
+0x1.013494p+0
+0x1p+0
+0x1.684e92p+0
+0x1.0063a4p+0
+0x1.3ca364p+0
+0x1.197a48p+1
+0x1.00a6f4p+0
+0x1.31ce92p-1
+0x1.fea91ep+5
+0x1.6dd5cep+5
+0x1.05035ep+8
+0x1.6d6acep+5
+0x1.8c4fa2p+5
+0x1.f4e59cp-12
+0x1.6330e4p+0
+0x1.01a9fep+0
+0x1.4f48e4p+0
+0x1.d589c6p+1
+0x1.5be04ap+15
+0x1.f9e2f2p-1
+0x1.294bdp+1
+0x1.8bf1p+5
+0x1.967eb8p-9
+0x1.018d04p+0
+0x1.00032cp+0
+0x1p+0
+0x1.ba21bcp+14
+0x1.8dd6bp+0
+0x1.7455a8p+3
+0x1p+0
+0x1.8e8a02p+15
+0x1.015f06p+0
+0x1.04a26p+8
+0x1.000c58p+0
+0x1.26a58cp+3
+0x1.2719bap-19
+0x1p+0
+0x1.05194cp+7
+0x1.34d9f4p+0
+0x1p+0
+0x1.029fa2p+0
+0x1.99a9dap+0
+0x1.cee06ep+0
+0x1.3e921ap+0
+0x1.9f8eep+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.13f606p+0
+0x1p+0
+0x1.0a176ep+2
+0x1.aa9c94p+7
+0x1.1211ep+0
+0x1.122594p+0
+0x1.b39642p+47
+0x1p+0
+0x1.000068p+0
+0x1.6600aep-12
+0x1.e0d6ecp+1
+0x1.0019ep+0
+0x1.34b8f4p-1
+0x1.581728p+2
+0x1.00016p+0
+0x1.12b1ep+8
+0x1.a679fp+14
+0x1.90005ap+4
+0x1.837996p-1
+0x1p+0
+0x1.0e2552p+1
+0x1.22160cp+9
+0x1p+0
+0x1.57e4b4p+1
+0x1p+0
+0x1.bf8d0cp+0
+0x1.d7e10ep+16
+0x1.06bcc8p+0
+0x1.133b12p+0
+0x1.1b6542p+6
+0x1p+0
+0x1.feddbcp-1
+0x1p+0
+0x1p+0
+0x1.2fd98ep-1
+0x1.03d5b6p+0
+0x1p+0
+0x1.db8a46p-1
+0x1.42e588p+0
+0x1.0ee1p+1
+0x1.361fep+0
+0x1.2f74a8p+0
+0x1p+0
+0x1.31596cp-1
+0x1.740a2p+3
+0x1p+0
+0x1.8dd672p+0
+0x1.00011cp+0
+0x1p+0
+0x1.000102p+0
+0x1.5cc2b2p+2
+0x1p+0
+0x1.17f4b4p+0
+0x1.619318p+12
+0x1.b14362p+0
+0x1.c1004ep+0
+0x1.318578p-1
+0x1.9728ecp+2
+0x1.25bdbcp+3
+0x1.37ac8ap+63
+0x1p+0
+0x1.41ef56p+2
+0x1.e65866p-1
+0x1p+0
+0x1.307e0ap+0
+0x1.ef570ep+54
+0x1.0290fap+1
+0x1.9dd308p+0
+0x1.21db9p+0
+0x1.00003cp+0
+0x1.eabf94p+0
+0x1.386614p+10
+0x1.f244dap+16
+0x1p+0
+0x1.00e094p+0
+0x1.5605e6p+1
+0x1.b16374p+2
+0x1.9a2d88p+0
+0x1.48748ap+9
+0x1p+0
+0x1.28e674p+0
+0x1.bf4324p+7
+0x1.2598c6p+3
+0x1.215484p+1
+0x1.05fb5p+51
+0x1.0000d8p+0
+0x1.f389dcp+6
+0x1.41a1bp+0
+0x1.001582p+0
+0x1.1928ecp+5
+0x1.00ff3ep+0
+0x1.3883c4p+13
+0x1.98b044p+2
+0x1.8a43eep+0
+0x1.733e8p+14
+0x1.73ebfcp+2
+0x1.0cd1fp+0
+0x1p+0
+0x1.af357p+5
+0x1.b2c586p+5
+0x1.470f58p+0
+0x1p+0
+0x1p+0
+0x1.0ffddep+0
+0x1.02c422p+1
+0x1.56c4a6p+1
+0x1.492014p-47
+0x1.192862p+5
+0x1p+0
+0x1.c7e222p+7
+0x1p+0
+0x1p+0
+0x1.1a0d3p+49
+0x1.946148p+0
+0x1.524f6ap+2
+0x1.31566ep-1
+0x1.000198p+0
+0x1.3d7efcp+3
+0x1.000264p+0
+0x1.4ed7ccp+0
+0x1.b667ecp+0
+0x1.81940ep+1
+0x1p+0
+0x1.088e6cp+0
+0x1.065bbcp+1
+0x1.009ae4p+1
+0x1.008bfp+6
+0x1.e9f5acp+7
+0x1.1e1c44p+8
+0x1.992348p+0
+0x1.3162fp+0
+0x1.fb0e1ap+48
+0x1.8bf0acp+5
+0x1p+0
+0x1.1f57b2p+60
+0x1.011f3p+0
+0x1.3af642p+0
+0x1.ccae9p+46
+0x1.21325cp+0
+0x1.07743p+7
+0x1.1ae49ep+8
+0x1.00006ap+0
+0x1.1928aap+5
+0x1.838206p-1
+0x1p+0
+0x1.00e9e8p+0
+0x1.4684cap+0
+0x1.02568p+0
+0x1.5efc62p+1
+0x1p+0
+0x1.000352p+0
+0x1.0578cap+0
+0x1.0039ecp+0
+0x1.2fc412p-1
+0x1.4a939ap+1
+0x1.ff27ep+5
+0x1.091a62p+0
+0x1.08c012p+0
+0x1.67c8p+4
+0x1.e26b74p-48
+0x1p+0
+0x1.283076p+3
+0x1.2fe494p-1
+0x1.4dcd9ep+5
+0x1p+0
+0x1.cdf4e4p+7
+0x1p+0
+0x1.c77d16p+1
+0x1.fccf76p-1
+0x1p+0
+0x1.120a84p+0
+0x1.054cdep+0
+0x1.002a0cp+0
+0x1.063b76p+0
+0x1.0000d8p+0
+0x1.30cedep-1
+0x1.003884p+0
+0x1p+0
+0x1.e0065cp-1
+0x1.693bd2p+15
+0x1.0fadc2p+0
+0x1.415d06p+0
+0x1.0002ecp+0
+0x1.27ce08p+0
+0x1.3b9762p+0
+0x1.2fb36p+2
+0x1.02c8f8p+0
+0x1.629facp+50
+0x1.281c56p+3
+0x1.4a93c8p+1
+0x1.0e6cacp-1
+0x1.f9ef4ap+0
+0x1.44f78ap+2
+0x1.9a1e18p+0
+0x1p+0
+0x1.3e566p+3
+0x1.000128p+0
+0x1p+0
+0x1.112c38p+0
+0x1.03d2dap+0
+0x1.5fb222p+12
+0x1.1f4b96p+0
+0x1.01422p+1
+0x1.ee5728p+63
+0x1.4bcdd8p+1
+0x1p+0
+0x1.30e0e4p-1
+0x1.6a36b2p+0
+0x1.00016cp+0
+0x1.04b966p+0
+0x1.106e16p+16
+0x1p+0
+0x1.1233d2p+0
+0x1p+0
+0x1.15d1cap+1
+0x1.137c02p+8
+0x1.00001ap+0
+0x1.07ab74p+0
+0x1.800b4ep-1
+0x1.55047p+0
+0x1.90017ap+4
+0x1.5c9898p+1
+0x1.8ce4ccp+6
+0x1p+0
+0x1.6ee34p+0
+0x1.bf600cp+0
+0x1.f13a7ep+8
+0x1.00015cp+0
+0x1.b9c51ep+12
+0x1.740826p+3
+0x1.c29e5p+1
+0x1.f56ba8p-1
+0x1.37fe18p+2
+0x1.190eap+0
+0x1.419f1cp+0
+0x1p+0
+0x1p+0
+0x1.20687ep+8
+0x1.938ecap+4
+0x1.01dd1cp+0
+0x1.bbe888p+7
+0x1.09d802p+0
+0x1.cf3b8p+0
+0x1.ea0d98p-1
+0x1.172472p+6
+0x1p+0
+0x1.61dce4p+1
+0x1.20b4fcp+0
+0x1.00038cp+0
+0x1p+0
+0x1.0822p+0
+0x1.9966ep+2
+0x1.21f47cp+0
+0x1.3a9762p+0
+0x1.8c4e0cp+5
+0x1p+0
+0x1.61878cp+12
+0x1.3ca348p+0
+0x1.289028p+0
+0x1.06e004p+0
+0x1.02b4b4p+0
+0x1.144eeep+1
+0x1.30a14ap-1
+0x1.07652p+0
+0x1p+0
+0x1.2ef288p+0
+0x1.1ba73cp+5
+0x1.48c714p+2
+0x1.25c508p+3
+0x1.b14382p+0
+0x1.b39acep+0
+0x1.0001c2p+0
+0x1.996938p+3
+0x1p+0
+0x1.e49b2ep+7
+0x1.000436p+0
+0x1.34712p+0
+0x1.47089p+0
+0x1.0353b8p-49
+0x1.2a818p+2
+0x1.00058p+0
+0x1.8a5a7ep+51
+0x1p+0
+0x1.8dbf04p+0
+0x1.5004d8p+61
+0x1.9557b2p+1
+0x1.0fa92cp+0
+0x1.16984ep+8
+0x1.72bd7ap+1
+0x1.980f0cp+1
+0x1.ae63fp+14
+0x1p+0
+0x1.085224p+0
+0x1.d8889ap-1
+0x1.1d3ff6p+4
+0x1.02c6ecp+1
+0x1.73eb4ep+2
+0x1.1916fp+4
+0x1.4a04e8p+5
+0x1.134906p+1
+0x1.0002dp+0
+0x1p+0
+0x1.32db7p+0
+0x1.0105b8p+0
+0x1.09f78p+0
+0x1.1d3e78p+4
+0x1.41b184p+0
+0x1.134914p+1
+0x1.410e6ep+1
+0x1.312a4ap-1
+0x1.7308f4p+1
+0x1p+0
+0x1.0afbe8p+0
+0x1p+0
+0x1.00026ap+0
+0x1.2ee012p+0
+0x1.001318p+0
+0x1.af1034p+4
+0x1.687b1cp-24
+0x1.a93ap+2
+0x1.084598p+0
+0x1.37031ap-1
+0x1.c046ep+5
+0x1.79a75ep+2
+0x1.46a9c8p+1
+0x1.000766p+0
+0x1.245d98p+0
+0x1.19287ap+5
+0x1.6a0fbep+0
+0x1p+0
+0x1.011424p+0
+0x1.879f4cp+0
+0x1p+0
+0x1p+0
+0x1.4ca7ecp-51
+0x1.5818c6p+2
+0x1p+0
+0x1.b4c9fap+7
+0x1.b14384p+0
+0x1.082fdp+0
+0x1.085672p+8
+0x1.918f3cp+6
+0x1p+0
+0x1.45623ep+0
+0x1.95515cp+2
+0x1.000068p+0
+0x1.31f33ap-1
+0x1.f9eed8p+0
+0x1.91b218p+6
+0x1.331446p-1
+0x1.000202p+0
+0x1p+0
+0x1.3cdfb8p-1
+0x1p+0
+0x1.08fb58p+7
+0x1.4dde38p+5
+0x1p+0
+0x1.0053a4p+0
+0x1p+0
+0x1.31e138p+7
+0x1p+0
+0x1.01c35cp+0
+0x1.dba85cp+7
+0x1.03682cp+2
+0x1.000108p+0
+0x1.bff348p+55
+0x1.582dbp+1
+0x1.31158p+0
+0x1.760bep+44
+0x1.e43226p+7
+0x1.082008p+0
+0x1.a03e4cp+7
+0x1.00b984p+0
+0x1.20c58ep+1
+0x1.221c1p+0
+0x1.594056p+7
+0x1.aabf58p+2
+0x1p+0
+0x1.b142e4p+0
+0x1.8bf166p+5
+0x1p+0
+0x1.000168p+0
+0x1.06c69cp+0
+0x1.900166p+4
+0x1.621b64p+12
+0x1.b142eep+0
+0x1p+0
+0x1.31c642p-1
+0x1p+0
+0x1.65b9cap+0
+0x1.4adbbep+0
+0x1p+0
+0x1.858ea2p+0
+0x1.076d06p+0
+0x1.000dap+0
+0x1.70cd96p+2
+0x1.347a2p-1
+0x1.73c75cp+2
+0x1p+0
+0x1.180c6ep+8
+0x1p+0
+0x1.1a32dcp+5
+0x1.342abp-1
+0x1.4a08p+5
+0x1.000484p+0
+0x1.e498b4p+7
+0x1.91e072p+0
+0x1p+0
+0x1.9ab2a8p+0
+0x1.0001dp+0
+0x1.6ab22p+0
+0x1.00036p+0
+0x1.00042cp+0
+0x1.0012a2p+0
+0x1.f2b45cp+0
+0x1.31b8fep-1
+0x1.2a3f48p+1
+0x1p+0
+0x1.d8ecc8p+49
+0x1.b143b2p+0
+0x1.4f7516p+0
+0x1.09a35cp+0
+0x1.000ap+0
+0x1.ad259ap+5
+0x1.8d9b38p-18
+0x1.92ef44p+0
+0x1.7407ep+3
+0x1.bcb74cp+7
+0x1.57d22p+0
+0x1.610e16p+0
+0x1.2ff3fap-1
+0x1.00aefcp+0
+0x1.6aaf1cp+0
+0x1.000298p+0
+0x1.10b236p+0
+0x1.2b6a4p+0
+0x1.25c852p+3
+0x1.000354p+0
+0x1p+0
+0x1.4fe4c2p+2
+0x1.8ea358p+6
+0x1.cd77f6p+2
+0x1.0000aap+0
+0x1.8c2a1ep-19
+0x1.000264p+0
+0x1.03001p+0
+0x1.0c772cp+0
+0x1.daea4p+4
+0x1p+0
+0x1.0f2d5ep+0
+0x1p+0
+0x1.1604d6p+0
+0x1.2f7b08p-1
+0x1.0002f4p+0
+0x1p+0
+0x1.91aaf8p+1
+0x1.896624p+0
+0x1.0024c2p+0
+0x1.0fde8cp+1
+0x1.3a7214p+16
+0x1.01ff8p+0
+0x1.02458p+1
+0x1.1d3f4cp+4
+0x1p+0
+0x1.c0d546p+1
+0x1.0ac2d4p+54
+0x1p+0
+0x1p+0
+0x1.75e65p+55
+0x1p+0
+0x1.010256p+0
+0x1.68165p+53
+0x1p+0
+0x1.013c3p+0
+0x1.bc712ep+13
+0x1p+0
+0x1.71d1cp+5
+0x1.49c482p+0
+0x1.00665p+0
+0x1.386324p+1
+0x1.385c4ap-1
+0x1p+0
+0x1.379e5p+0
+0x1.232592p+8
+0x1p+0
+0x1.000338p+0
+0x1p+0
+0x1p+0
+0x1.055404p+0
+0x1.208ef8p+1
+0x1p+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.015d52p+0
+0x1.9ea35cp+1
+0x1.dc7eb4p+18
+0x1p+0
+0x1p+0
+0x1.b3d24ep+7
+0x1.fba328p+8
+0x1.00c7fp+0
+0x1.0d1acep+8
+0x1.779a24p+2
+0x1p+0
+0x1.19499ep+0
+0x1.25ddcep+3
+0x1.78346cp+3
+0x1.428e7ap+49
+0x1.003dp+0
+0x1p+0
+0x1.313dbcp-1
+0x1.6fef7p+1
+0x1p+0
+0x1.2ff116p-1
+0x1.00f598p+0
+0x1.45ab88p+0
+0x1p+0
+0x1.a93a36p+2
+0x1p+0
+0x1.54bb7p+2
+0x1p+0
+0x1.00004cp+0
+0x1.edac12p+0
+0x1.40f4fap+0
+0x1.45c0bcp+0
+0x1.0a2626p+0
+0x1.bfa67ap+51
+0x1.933f18p+0
+0x1p+0
+0x1.3f3fe8p+0
+0x1.006fc8p+0
+0x1.c04aecp+1
+0x1.0afc4p+0
+0x1.9b2f1ep+3
+0x1.11a134p+3
+0x1.0624dep-11
+0x1.eabf94p+0
+0x1.8950d8p+1
+0x1.35eba2p-1
+0x1.11c438p+0
+0x1.02073p+0
+0x1.483096p+0
+0x1.484bf4p+2
+0x1.1b86dcp+0
+0x1.0d3c56p+0
+0x1.0000e4p+0
+0x1.a93b64p+2
+0x1.b8db1cp+1
+0x1.308c0ep-1
+0x1p+0
+0x1.1e84fp+0
+0x1.3fc808p+0
+0x1.19179ap+4
+0x1p+0
+0x1.f1d3a4p+7
+0x1.273d1ep+1
+0x1.000a16p+0
+0x1.42ead6p+0
+0x1.b8c318p+1
+0x1.7226dp+1
+0x1.43af5cp+0
+0x1.450224p+0
+0x1.000234p+0
+0x1.358bc4p-1
+0x1.0000acp+0
+0x1.02ef5cp+0
+0x1.1d16fap+8
+0x1p+0
+0x1.0a9be6p+0
+0x1.2221d2p+8
+0x1.45abbp+0
+0x1p+0
+0x1.b787f6p-12
+0x1.960416p+0
+0x1.0af8b6p+1
+0x1.232048p+64
+0x1.f6b2fp+0
+0x1p+0
+0x1.02fc3ep+0
+0x1.19292ep+5
+0x1.00fdcap+0
+0x1.51ac2p+1
+0x1.020b04p+0
+0x1.3fe772p+1
+0x1p+0
+0x1.3a87dap+0
+0x1.00dbf8p+0
+0x1.dc825cp+1
+0x1.051eap+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.000bp+0
+0x1.004874p+0
+0x1.ed7906p+14
+0x1.ba64fcp+12
+0x1.03e86ap+0
+0x1.5cdd2p+2
+0x1.2fc1c6p-1
+0x1.08a1b8p+0
+0x1p+0
+0x1.4e97bp+62
+0x1.364392p+0
+0x1.000236p+0
+0x1.32f478p-1
+0x1.362732p+4
+0x1.1d3f0ep+4
+0x1.205236p+44
+0x1p+0
+0x1.93afd4p+2
+0x1.2f40ecp-1
+0x1p+0
+0x1.0fe4a4p+1
+0x1.9975e8p+64
+0x1.4a93fap+1
+0x1.259756p+3
+0x1.1e1e64p+8
+0x1.000048p+0
+0x1p+0
+0x1.2f1f74p-1
+0x1.7a124ap+0
+0x1.5e3f8ep+2
+0x1.e58cd8p-1
+0x1.b3857ep+0
+0x1.6f4da4p+0
+0x1p+0
+0x1.44caaep+0
+0x1.6831b2p+0
+0x1.7537bep+1
+0x1p+0
+0x1.003054p+0
+0x1.4934p+2
+0x1.00005p+0
+0x1.000098p+0
+0x1.091ebcp+0
+0x1.465e2cp+9
+0x1.00017p+0
+0x1p+0
+0x1.31ab6cp-1
+0x1p+0
+0x1p+0
+0x1.f2386ep+57
+0x1.147d32p+3
+0x1.e480eep+7
+0x1.03b3b2p+0
+0x1.02035cp+0
+0x1.11d934p+3
+0x1.5776d8p+53
+0x1.2c73p+0
+0x1.63073ap+9
+0x1.2041aep+8
+0x1p+0
+0x1.00594cp+0
+0x1.3ee136p+0
+0x1p+0
+0x1.09548p+1
+0x1.05f1f4p-11
+0x1.0002a4p+0
+0x1.16ac18p+3
+0x1.b8531ep+7
+0x1.0fd73cp+1
+0x1.011f64p+0
+0x1.0ff65ep+0
+0x1.b1ecfp+4
+0x1.8f0888p+0
+0x1.f95e02p-1
+0x1p+0
+0x1.9000cep+0
+0x1.e9b4fep+52
+0x1.009838p+0
+0x1.5ef598p+1
+0x1.a6ad24p+7
+0x1.4913c6p+0
+0x1p+0
+0x1.3d7314p+0
+0x1p+0
+0x1.a591c8p+0
+0x1.017966p-13
+0x1.9825cep+3
+0x1.192898p+5
+0x1.cddc2p+42
+0x1p+0
+0x1p+0
+0x1.0dde0ap+8
+0x1.0e56e8p+1
+0x1.a6fbcep+3
+0x1.b92cc8p+7
+0x1.d57268p+0
+0x1.b8f132p+1
+0x1.4c257ap+0
+0x1.00000ap+0
+0x1.38635p+1
+0x1.1cc07ap+45
+0x1.71ff7ep+1
+0x1.ef8b44p+0
+0x1.6cf93ep+51
+0x1p+0
+0x1p+0
+0x1.11f506p+8
+0x1.77844ap+0
+0x1p+0
+0x1.bdd978p+7
+0x1.00006ap+0
+0x1.0e2602p+1
+0x1.045486p+0
+0x1.0002c8p+0
+0x1.4d67c8p+1
+0x1.e5b314p-1
+0x1.6a374cp+0
+0x1.99db52p+0
+0x1.f9eeap-1
+0x1.bf7f2cp+5
+0x1.da61b4p+4
+0x1.488ff4p+0
+0x1.003p+0
+0x1p+0
+0x1.02ffcp+0
+0x1.d09a76p+1
+0x1.225a2cp+0
+0x1.0637f2p+0
+0x1.b3893p+0
+0x1.00005p+0
+0x1.bcc5ccp+59
+0x1p+0
+0x1.01f38ep+0
+0x1.a720ecp+7
+0x1.05390cp+1
+0x1.bf3ffep+2
+0x1.6b9574p+0
+0x1.388f0cp+11
+0x1.29a6aap+0
+0x1.31e90ep-1
+0x1p+0
+0x1p+0
+0x1.2f1498p-1
+0x1.0000eep+0
+0x1p+0
+0x1.3190e2p-1
+0x1p+0
+0x1.7703c2p+1
+0x1.0ffd1cp-24
+0x1p+0
+0x1p+0
+0x1.f5c25p-24
+0x1.7407c8p+3
+0x1.45abd2p+0
+0x1.1304ecp+0
+0x1p+0
+0x1.0002f4p+0
+0x1.cd1cdap+1
+0x1.6ef2fp+15
+0x1.0002cap+0
+0x1.dc83cp+1
+0x1.0000ccp+0
+0x1.0093cep+0
+0x1.0066bap+0
+0x1.002dp+0
+0x1.0e6c8p+0
+0x1.7be50ap+16
+0x1.00b348p+0
+0x1.089b3p+16
+0x1.98b07cp+2
+0x1.3389b2p+0
+0x1.a41e1ep+7
+0x1.7195dep+5
+0x1.08b45cp+0
+0x1.29c1eap+56
+0x1.740b96p+3
+0x1.71fef4p+1
+0x1.07ba2cp+0
+0x1.5ee4a2p+1
+0x1p+0
+0x1.f9599cp-1
+0x1.b9154ep+14
+0x1.f8911cp+0
+0x1p+0
+0x1.373e1p+4
+0x1p+0
+0x1.00146cp+0
+0x1.4a05acp+5
+0x1.1928aap+5
+0x1.060cecp+0
+0x1.773996p+0
+0x1.af11c2p-11
+0x1p+0
+0x1.3f7d98p+7
+0x1.1361ep+52
+0x1.f9f064p+0
+0x1p+0
+0x1.a9b908p+7
+0x1.c55b46p+0
+0x1p+0
+0x1.682ec4p+46
+0x1.00003p+0
+0x1p+0
+0x1.2fdba4p-1
+0x1.9beca4p+0
+0x1.0004a8p+0
+0x1.2fb262p-1
+0x1.8bf118p+5
+0x1.0001aap+0
+0x1.31a74p-1
+0x1.25db7ep+3
+0x1p+0
+0x1.197a7cp+1
+0x1p+0
+0x1.2d315cp+0
+0x1.0024f8p+0
+0x1.2a7f04p+1
+0x1p+0
+0x1p+0
+0x1.01211cp+0
+0x1.f11d7ep-1
+0x1.d4f718p+2
+0x1.b233dep+0
+0x1.6d6b1cp+5
+0x1.7724fep+15
+0x1p+0
+0x1.a86fbap+7
+0x1p+0
+0x1p+0
+0x1.4aa984p+49
+0x1.000054p+0
+0x1p+0
+0x1.33d3f4p-1
+0x1p+0
+0x1.1b0cd8p+6
+0x1.000958p+0
+0x1p+0
+0x1.49ef4ep+4
+0x1.7cc648p+1
+0x1p+0
+0x1.23470ap+0
+0x1.3223a4p+0
+0x1p+0
+0x1.4d6912p+0
+0x1.51e25p+0
+0x1p+0
+0x1.34962cp+0
+0x1.0fdd0cp+1
+0x1.0001d8p+0
+0x1.38637cp+1
+0x1.9de754p+3
+0x1.8e020cp+5
+0x1.ad9158p+4
+0x1.094afap+0
+0x1.ea949ep+52
+0x1.ec6aa4p+1
+0x1.1a5e6cp+4
+0x1.07ed56p+0
+0x1.711ffp+0
+0x1p+0
+0x1.062702p+8
+0x1.233ffap+18
+0x1.10c252p+7
+0x1.002a14p+0
+0x1.98f468p+0
+0x1.833884p+0
+0x1p+0
+0x1.9179acp+4
+0x1.d944c4p-1
+0x1.00bc84p+0
+0x1p+0
+0x1.46c0aep+0
+0x1.ad157p+4
+0x1.13492cp+1
+0x1.4b0ceep+0
+0x1.000246p+0
+0x1p+0
+0x1p+0
+0x1.176dbep+0
+0x1.52e1b8p+0
+0x1.050ab8p+0
+0x1p+0
+0x1.ef2d1p-84
+0x1.d0999p+1
+0x1.00b594p+0
+0x1.19ae42p+54
+0x1p+0
+0x1p+0
+0x1.bf05cap-56
+0x1.fba48p+0
+0x1.19a5ecp+4
+0x1.000518p+0
+0x1.cd1cc6p+1
+0x1.0008d2p+0
+0x1.00291cp+0
+0x1.01ae5cp+0
+0x1.18229cp+0
+0x1.0000d6p+0
+0x1.00017p+0
+0x1.1083fep-25
+0x1p+0
+0x1.7d379ap+9
+0x1.2f5e0ep-1
+0x1.365e38p+0
+0x1.000912p+0
+0x1.8p+3
+0x1.13e39cp+1
+0x1p+0
+0x1.0ba4aep+0
+0x1.9deafcp+3
+0x1.2fead4p-1
+0x1p+0
+0x1.11a49cp+16
+0x1.968f3ap+62
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.b85f8ep+6
+0x1.141a8ep+8
+0x1.0564ecp+0
+0x1.c6b168p+2
+0x1.05b106p+8
+0x1.000298p+0
+0x1p+0
+0x1.0001fap+0
+0x1.000164p+0
+0x1.31a84p+0
+0x1p+0
+0x1.403f5cp+5
+0x1.ea62dep-1
+0x1p+0
+0x1.131eeep+1
+0x1.3625d8p+4
+0x1.066f0cp+0
+0x1.e7a64p+7
+0x1.047e06p+0
+0x1p+0
+0x1.32aad8p-1
+0x1p+0
+0x1.000118p+0
+0x1.1b0d0cp+6
+0x1.a11c9p+0
+0x1.a2588ep+54
+0x1p+0
+0x1p+0
+0x1.09ffa8p+8
+0x1.bb2a7cp+5
+0x1p+0
+0x1.a1f9p+0
+0x1p+0
+0x1.f3d4b4p-1
+0x1.4dc16ap+5
+0x1.3b2274p+4
+0x1.457d56p+0
+0x1.01cfcp+0
+0x1p+0
+0x1.a93982p+2
+0x1.04054cp+0
+0x1.0080fap+0
+0x1.dc801cp+0
+0x1.0b77bep+1
+0x1.013094p+0
+0x1.0001e8p+0
+0x1.02e2ep+0
+0x1p+0
+0x1.000094p+0
+0x1.fb4382p-1
+0x1.00019p+0
+0x1.0007b8p+0
+0x1.127e1ap+8
+0x1p+0
+0x1p+0
+0x1.0e25cp+1
+0x1.2f4b78p+1
+0x1.015b26p+8
+0x1.0eb20cp+0
+0x1.081558p+7
+0x1.42ff58p+0
+0x1.1c5d1p+6
+0x1.887b42p+14
+0x1.02904p+1
+0x1.7ce25ap+1
+0x1.f96d6p-1
+0x1.5c64f4p+0
+0x1.0005c8p+0
+0x1.78e9d4p-33
+0x1.da628ep+4
+0x1.003634p+0
+0x1.3184d6p-1
+0x1.bd96f4p+6
+0x1.ba5156p+12
+0x1.8df4acp+0
+0x1p+0
+0x1.a3b92p+7
+0x1.3e4f26p+11
+0x1.543868p+4
+0x1.eabfe6p+0
+0x1.0073e6p+0
+0x1.0f2bdep+8
+0x1.3e3c3ep+13
+0x1.3884dp+6
+0x1p+0
+0x1.690fecp+0
+0x1.dfa074p-1
+0x1.000638p+0
+0x1.4a93acp+1
+0x1.8dd68ap+0
+0x1.0048dcp+0
+0x1.002f8ep+0
+0x1.00015p+0
+0x1.45abbcp+0
+0x1.f3f306p-1
+0x1.1b639p+0
+0x1.ef2d1p-84
+0x1.abd54p+0
+0x1.36f8aap+2
+0x1.e317cep-1
+0x1.36f9cap+2
+0x1.530ddp+0
+0x1.2f74bp+0
+0x1.3c4448p+0
+0x1.0718dcp+0
+0x1.0001bp+0
+0x1p+0
+0x1.1d3ebap+4
+0x1.42e55ap+0
+0x1.3ace3ep+50
+0x1.5b5108p+1
+0x1.13527cp+3
+0x1.0002ap+0
+0x1.6f3ebcp+2
+0x1.b0af06p+7
+0x1.016c28p+0
+0x1p+0
+0x1.4542a6p+0
+0x1p+0
+0x1.6120cep+55
+0x1.02a2p+0
+0x1.0714d6p+15
+0x1.21293ep+0
+0x1.023b38p+0
+0x1.000d12p+0
+0x1.4d9f06p+15
+0x1p+0
+0x1.dd3bb4p-1
+0x1p+0
+0x1.00029ep+0
+0x1.eabfa8p+0
+0x1.362a2ep+0
+0x1.000a5ap+48
+0x1.dfbac8p+4
+0x1.259742p+3
+0x1.0000acp+0
+0x1.00cc58p+1
+0x1.49155ep+0
+0x1p+0
+0x1p+0
+0x1.30d9ap-1
+0x1.02fc6p+0
+0x1.3cac76p+0
+0x1.b8c472p+1
+0x1.8bf1bcp+5
+0x1.2cd56p+0
+0x1.1d37a6p+0
+0x1p+0
+0x1.6b03dep+2
+0x1p+0
+0x1.4bc794p+0
+0x1.dc56e6p+1
+0x1.b1432ap+0
+0x1.5a6574p+2
+0x1.a21356p+4
+0x1.6269ep+64
+0x1.0000dp+0
+0x1.10766cp+7
+0x1.0096e6p+0
+0x1.adf486p+0
+0x1.309de8p-1
+0x1.085fb4p+0
+0x1.3afb0ep+0
+0x1.0002a2p+0
+0x1.085208p+0
+0x1.213daap+8
+0x1.000a5ap+0
+0x1.503f0cp+0
+0x1.000428p+0
+0x1.7ee7d4p+16
+0x1.8e5064p+61
+0x1.3f6054p+7
+0x1.3a78a6p+0
+0x1.0a197ap+0
+0x1.016ea8p+0
+0x1.0bbb28p+8
+0x1.000014p+0
+0x1.0010d4p+0
+0x1.5983f8p-26
+0x1.2dddep+0
+0x1.3f4af4p+0
+0x1.15f078p+0
+0x1p+0
+0x1.8ffae8p-20
+0x1.0000a4p+0
+0x1.4f32a8p+0
+0x1.8bf1f2p+5
+0x1.0000fp+0
+0x1.1e9612p+0
+0x1.000512p+0
+0x1.000184p+0
+0x1p+0
+0x1.4a071ap+5
+0x1.316586p-1
+0x1.026922p+0
+0x1.9323dcp+3
+0x1.0530acp+0
+0x1.18125p+0
+0x1.e39054p-1
+0x1.3ad2p+11
+0x1.005ad4p+0
+0x1.000208p+0
+0x1.b85f4cp+6
+0x1.002d02p+0
+0x1p+0
+0x1p+0
+0x1.da3556p+8
+0x1p+0
+0x1.02c298p+0
+0x1.11a35ep+3
+0x1.4a0a02p+1
+0x1.02741p+2
+0x1p+0
+0x1.2749a2p+0
+0x1.45abacp+0
+0x1p+0
+0x1.3920bcp+13
+0x1.000054p+0
+0x1.4ceda8p+0
+0x1p+0
+0x1.390b2p+7
+0x1.66764ep+7
+0x1p+0
+0x1.e11478p+7
+0x1.0f264cp+0
+0x1p+0
+0x1.2f7ec2p-1
+0x1p+0
+0x1.0ac6fcp+8
+0x1.3ca396p+0
+0x1.9ad138p+5
+0x1.e5b8acp+7
+0x1.0000b8p+0
+0x1.f14fd6p-11
+0x1.00009p+0
+0x1.01571ep+0
+0x1.17c726p+0
+0x1.00019p+0
+0x1.362514p+4
+0x1.004efp+0
+0x1.003f5cp+0
+0x1.43c41cp+0
+0x1p+0
+0x1.3e6c78p+12
+0x1.000c5cp+0
+0x1.3e795cp+6
+0x1.b825a6p+7
+0x1.ace64p+1
+0x1.36f8dp+2
+0x1.587484p+0
+0x1.94967ap+14
+0x1.af98e6p+17
+0x1.6488b6p+0
+0x1.1d3e98p+4
+0x1.009978p+0
+0x1.377d08p+0
+0x1.2fdc0ep+0
+0x1.045768p+0
+0x1.f9ef1ap+0
+0x1.003e4ap+0
+0x1.3e825p+9
+0x1.38da1p+0
+0x1p+0
+0x1p+0
+0x1.00d4a2p+0
+0x1.3e6838p+12
+0x1.0c24a8p+0
+0x1.00012cp+0
+0x1p+0
+0x1p+0
+0x1.001188p+0
+0x1.30be32p-1
+0x1.d20bfcp+0
+0x1.000314p+0
+0x1.467b6ap+1
+0x1.b14436p+0
+0x1.be3eccp+7
+0x1.035cc4p+0
+0x1p+0
+0x1.358ca4p+7
+0x1p+0
+0x1.052ef8p+8
+0x1.08ac7ep+0
+0x1p+0
+0x1.ef2d1p-84
+0x1p+0
+0x1.388d04p+56
+0x1.003836p+0
+0x1.65f1ecp+0
+0x1.5b141p+47
+0x1.fadea2p+0
+0x1.d1e872p+59
+0x1p+0
+0x1.acd704p+0
+0x1.d46c0ap-34
+0x1p+0
+0x1.015a84p+0
+0x1p+0
+0x1p+0
+0x1.02161ep+0
+0x1p+0
+0x1.02283cp+0
+0x1.2fb3d8p+2
+0x1.3b1854p+4
+0x1.9a69d8p+48
+0x1.f9ef08p+0
+0x1.7e849cp+3
+0x1.eabffp+0
+0x1.054884p+0
+0x1.9faadcp+7
+0x1.01dbfep+0
+0x1.a9a6aap+1
+0x1p+0
+0x1.ae82b2p+5
+0x1.423f6p-20
+0x1.42e57p+0
+0x1.41466p+2
+0x1p+0
+0x1.49ef3ep+4
+0x1.f264ccp-1
+0x1.0084dap+0
+0x1.07aabap+0
+0x1p+0
+0x1p+0
+0x1.009f06p+0
+0x1.008b44p+0
+0x1.3e2b8cp+5
+0x1.000324p+0
+0x1.0c4158p+0
+0x1.32644cp-1
+0x1.1929dp+5
+0x1.8ac548p+4
+0x1.01b036p+0
+0x1.7e3a98p+5
+0x1.34bc8p-1
+0x1.b14336p+0
+0x1.0cb4e2p+0
+0x1.b931bp+12
+0x1.2358fp+1
+0x1.f23b6cp+51
+0x1p+0
+0x1.16fa4cp+4
+0x1.0baf84p+0
+0x1.a856a8p+5
+0x1.066f6p+0
+0x1p+0
+0x1p+0
+0x1.20b7bp+0
+0x1.3fe392p+0
+0x1.388ae2p+0
+0x1.00035cp+0
+0x1.3adcf2p+12
+0x1.30393p-1
+0x1.e17338p+1
+0x1.aa6b1ap+7
+0x1.0000b6p+0
+0x1p+0
+0x1.345b46p-1
+0x1.74921cp+8
+0x1.b29bd6p+7
+0x1p+0
+0x1.77c706p+2
+0x1.c4d8ecp+65
+0x1.8d98bp+0
+0x1.8b8002p-6
+0x1.3881ecp+15
+0x1.010cd4p+0
+0x1.c8fdaap+7
+0x1.72b958p+2
+0x1.965c1cp+3
+0x1p+0
+0x1p+0
+0x1.2a515cp+0
+0x1.cd1e9p+1
+0x1.006674p+0
+0x1p+0
+0x1.66e4cp+2
+0x1.13aa9ep+8
+0x1p+0
+0x1.13101cp+1
+0x1.0004ecp+0
+0x1p+0
+0x1.c51ad2p+7
+0x1p+0
+0x1.2a0908p+8
+0x1.000182p+0
+0x1.ac40fcp+2
+0x1.30f308p-1
+0x1p+0
+0x1p+0
+0x1.1ceeaep+7
+0x1.0000a4p+0
+0x1.f407acp+7
+0x1.36f98ep+2
+0x1.1c60a8p+10
+0x1.617238p+12
+0x1p+0
+0x1.48fb3ap+0
+0x1p+0
+0x1.000d5p+0
+0x1.33833cp-1
+0x1p+0
+0x1.41be46p+51
+0x1.238e58p+0
+0x1.00266cp+0
+0x1.9fc4bp+58
+0x1.000618p+0
+0x1.88a592p+48
+0x1.0001c8p+0
+0x1p+0
+0x1.51c89cp+0
+0x1.317344p+7
+0x1.308e8ap-1
+0x1p+0
+0x1.0387e6p+0
+0x1.454a32p+0
+0x1.74a828p+7
+0x1.f57daep-8
+0x1.287a44p+0
+0x1.b84b08p+2
+0x1.27fc5ap+0
+0x1p+0
+0x1.0e423p+1
+0x1p+0
+0x1.079ddp+0
+0x1.f49a74p+14
+0x1.0f47bp+0
+0x1.9000bap+4
+0x1.000244p+0
+0x1p+0
+0x1.4a38ep+0
+0x1.36f8bp+2
+0x1.6bf43cp+0
+0x1.a3a9f4p+1
+0x1.001d24p+0
+0x1.106f8ap+0
+0x1.0003ep+0
+0x1.00025p+0
+0x1.89be24p+0
+0x1.3d65b4p+6
+0x1.44b46ep+0
+0x1.5caecap+1
+0x1.00327cp+2
+0x1.54bbep+2
+0x1.2597aap+3
+0x1.059a5ap-11
+0x1.43884ep+2
+0x1p+0
+0x1.c04628p+9
+0x1p+0
+0x1.c1b9bp-49
+0x1.73ed24p+2
+0x1.000598p+0
+0x1.44105p+0
+0x1.b7c192p+5
+0x1.312178p-1
+0x1p+0
+0x1.f9efc2p+0
+0x1.014252p-51
+0x1.017a66p+0
+0x1.1f3de4p+8
+0x1.02b182p+0
+0x1.257372p+0
+0x1.93944ap+48
+0x1.e2305cp+1
+0x1.3e0ee6p-8
+0x1.00011ep+0
+0x1.a31448p+5
+0x1.8c9ca6p+48
+0x1.194216p+0
+0x1p+0
+0x1.5cc2ap+2
+0x1p+0
+0x1.506fe6p+49
+0x1.2588fp+0
+0x1.26ffaep+1
+0x1p+0
+0x1p+0
+0x1.4ff01ap+66
+0x1.00009cp+0
+0x1.000f38p+0
+0x1.00e4d6p+0
+0x1.001d5cp+0
+0x1.02b29cp+50
+0x1.358d1p+7
+0x1.3eff02p+8
+0x1.900058p+4
+0x1.3ae0bcp+13
+0x1.034d3ep+0
+0x1.b9346p+5
+0x1p+0
+0x1.71b9cp+0
+0x1.2f7456p+0
+0x1.47ccf2p+0
+0x1.498974p+0
+0x1.046cb8p+0
+0x1.458c62p+1
+0x1.a93bf4p+2
+0x1.0f113ap+8
+0x1p+0
+0x1.04ae52p+0
+0x1.7c2a68p+0
+0x1.3b24fep+9
+0x1.04ef5p-11
+0x1.11a28ap+3
+0x1p+0
+0x1.056b24p+1
+0x1.0000e4p+0
+0x1.2c01cap+0
+0x1p+0
+0x1p+0
+0x1.c61f72p+15
+0x1p+0
+0x1.02fc2ap+0
+0x1p+0
+0x1.093acep+0
+0x1.5643eap+53
+0x1p+0
+0x1.0087a8p-47
+0x1.2f5868p+0
+0x1.38e848p+10
+0x1.e5c11cp+7
+0x1p+0
+0x1.129e64p+8
+0x1.5c6c98p+1
+0x1.00015ap+0
+0x1.b745e2p+48
+0x1.1bfb08p+0
+0x1.a92b86p+5
+0x1.7c2a54p+0
+0x1p+0
+0x1.3334b6p+0
+0x1.b5c006p+5
+0x1p+0
+0x1.bec8c6p+16
+0x1p+0
+0x1.dc5496p-1
+0x1.0a88ep+0
+0x1.f95e78p+1
+0x1p+0
+0x1.0037b4p+0
+0x1.1eaf62p+8
+0x1p+0
+0x1.43bfcp+5
+0x1.3af986p+15
+0x1.03dbf4p+0
+0x1.b1b5a8p-12
+0x1p+0
+0x1.90007ep+0
+0x1.0003b4p+0
+0x1p+0
+0x1.f8f086p-12
+0x1.dd7178p+4
+0x1.00207p+0
+0x1.118916p+0
+0x1p+0
+0x1.a298c4p+7
+0x1.006a6cp+0
+0x1.1dfa5p+0
+0x1.327c54p-1
+0x1p+0
+0x1.f7e922p-1
+0x1.3e365ap+13
+0x1p+0
+0x1.04318ap+0
+0x1.52381cp+0
+0x1.60a298p-1
+0x1.000076p+0
+0x1.977c42p+14
+0x1.a8cb5cp+7
+0x1.1b0d18p+6
+0x1.29cedp+0
+0x1.15a46ap+1
+0x1p+0
+0x1.639aaep-12
+0x1.004a8cp+0
+0x1.0ab1bcp+1
+0x1.b85ecp+6
+0x1.36279ep+4
+0x1.22ae32p+8
+0x1.615228p+1
+0x1.000898p+0
+0x1.001968p+0
+0x1p+0
+0x1.2f791ap-1
+0x1.00001cp+0
+0x1p+0
+0x1.0627aep+0
+0x1.0e38d4p+5
+0x1.490936p+57
+0x1p+0
+0x1.000358p+0
+0x1.57b4bp+7
+0x1.4b4766p+0
+0x1.26da06p+0
+0x1.cd1ec6p+1
+0x1.38ee44p+15
+0x1.c0ffbcp+15
+0x1.01caacp+0
+0x1.e2a336p-1
+0x1p+0
+0x1.0c69f4p+2
+0x1.50a08cp+55
+0x1.10d0b8p+0
+0x1.1eed7p+1
+0x1.b14428p+0
+0x1.004f94p+0
+0x1.31c2acp-1
+0x1p+0
+0x1p+0
+0x1p+0
+0x1.b47948p+0
+0x1.78d5eap+51
+0x1.01316ep+0
+0x1.4a937cp+0
+0x1.1ba54ap+1
+0x1.6ba304p+0
+0x1.3591c6p-1
+0x1p+0
+0x1.08a91ap+8
+0x1.19ade8p+0
+0x1.01535ap+0
+0x1.317184p-1
+0x1.36f9a4p+2
+0x1.7f08a8p+0
+0x1p+0
+0x1.00013p+0
+0x1.ff478p-1
+0x1.27e0d2p+0
+0x1.0ecbacp+7
+0x1.8dd6acp+0
+0x1.100ecep+0
+0x1.25edd8p+8
+0x1.198a9p+0
+0x1p+0
+0x1.5c6cc2p+1
+0x1.016276p+0
+0x1.329f88p-1
+0x1.9e35ap+0
+0x1.004612p+0
+0x1.fb9b82p-1
+0x1.000d84p+0
+0x1.43e8a8p+0
+0x1.57e548p+1
+0x1.057f18p+0
+0x1.a6dfbep+7
+0x1p+0
+0x1.341ce2p-1
+0x1p+0
+0x1p+0
+0x1.fcbce2p+56
+0x1.004454p+0
+0x1.909ec2p-6
+0x1p+0
+0x1.58649p+9
+0x1.4b96e6p+49
+0x1.3ca38cp+0
+0x1.00033ep+0
+0x1.0099f4p+0
+0x1p+0
+0x1.21869p+8
+0x1p+0
+0x1.65b514p+16
+0x1p+0
+0x1.740878p+3
+0x1.a4cea2p+43
+0x1.b143fep+0
+0x1.25ed36p+4
+0x1.003d7ap+0
+0x1.0d82d4p+1
+0x1.3389ap-1
+0x1p+0
+0x1.11a222p+3
+0x1.983f38p+3
+0x1.000162p+0
+0x1.46b986p+0
+0x1.3e3e9cp+8
+0x1.58747p+0
+0x1.45632cp+0
+0x1.3f738cp+3
+0x1.00d0bp+0
+0x1.5dca1p+0
+0x1p+0
+0x1.43257p+0
+0x1.0b38fap+0
+0x1.1ca4aep+8
+0x1p+0
+0x1p+0
+0x1.319a2p-1
+0x1.2d4fd4p+5
+0x1.02f006p+0
+0x1.e0c05ap+4
+0x1.98f464p+0
+0x1.05db3ap+8
+0x1.a2bd9ep+2
+0x1.a05a58p+0
+0x1.8bf254p+5
+0x1.3eb04cp+4
+0x1.3140a6p-1
+0x1.011d98p+0
+0x1p+0
+0x1.000ac8p+0
+0x1.3b2774p+10
+0x1.44d29p+0
+0x1p+0
+0x1.009f9ep+0
+0x1.0a8702p+2
+0x1.1349bep+1
+0x1.a585b4p+7
+0x1.00f23cp+0
+0x1.338168p+0
+0x1p+0
+0x1.3e7816p+14
+0x1.0e9d14p+0
+0x1.8f53ccp+1
+0x1.28c922p+0
+0x1.6bb30ep+15
+0x1.b58932p+14
+0x1.1c682p+0
+0x1.00846p+0
+0x1.00240cp+0
+0x1.000674p+0
+0x1.2c71ep+3
+0x1.750298p+67
+0x1.364684p+0
+0x1.134676p+16
+0x1.47a244p+0
+0x1p+0
+0x1.dee22ep-1
+0x1.3e8204p+9
+0x1.00007p+0
+0x1.31f1e6p-1
+0x1p+0
+0x1.a187f8p+7
+0x1.0097e4p+0
+0x1.08e1b2p+0
+0x1.0e3e7ap+0
+0x1.0006fap+0
+0x1p+0
+0x1.358ca6p+7
+0x1.83bcacp+3
+0x1.4603f4p+0
+0x1.3093c8p+0
+0x1.5c6cap+1
+0x1.1f5efcp+0
+0x1.6ba3e8p+0
+0x1.cba7b2p+7
+0x1.015e1ep+0
+0x1.b85f58p+6
+0x1.dc835ep+1
+0x1.000598p+0
+0x1.f9551ap-1
+0x1p+0
+0x1p+0
+0x1.0a67fp+0
+0x1.1bdf58p+0
+0x1.f75026p-1
+0x1.5e3b5p+1
+0x1.3f9b72p+0
+0x1.8ff798p-51
+0x1.0115bap+0
+0x1.4e13fcp+0
+0x1.6d6c54p+5
+0x1.0e7538p+0
+0x1.dcf5d8p-12
+0x1.134aa6p+1
+0x1.b7cc8p+12
+0x1.3e46dap+12
+0x1p+0
+0x1.3fb2fep+0
+0x1p+0
+0x1p+0
+0x1.0f8834p+0
+0x1p+0
+0x1.2f8fc8p-1
+0x1.0032aap+0
+0x1.0134d4p+0
+0x1.0006ecp+0
+0x1.36f9b8p+2
+0x1.d32d7p+43
+0x1.65f516p+1
+0x1.a71662p+5
+0x1.02731cp+2
+0x1.00002cp+0
+0x1.090ap+0
+0x1.8ce46ep+6
+0x1.0001bp+0
+0x1.003c82p+0
+0x1.a2cb78p+5
+0x1.1b3cc6p+0
+0x1p+0
+0x1.000698p+0
+0x1p+0
+0x1p+0
+0x1.0a01d2p+50
+0x1.000b52p+0
+0x1.63092ep+0
+0x1.0011fcp+0
+0x1.684b74p+2
+0x1.782834p+49
+0x1.213286p+0
+0x1.2b13b6p+9
+0x1.383ep+0
+0x1.f91f5cp+2
+0x1.bf1f3cp+7
+0x1.3e44f4p+7
+0x1p+0
+0x1.4637a4p+0
+0x1.3e8c48p+12
+0x1.192a3cp+8
+0x1.0008c2p+0
+0x1p+0
+0x1.01a4b6p+8
+0x1.0002d8p+0
+0x1.001054p-6
+0x1p+0
+0x1.275d2cp+0
+0x1.320582p-1
+0x1.02643ep+0
+0x1.aa4074p+5
+0x1.02528cp+0
+0x1.0adc1p+7
+0x1.e25f42p-1
+0x1p+0
+0x1.0076ap+0
+0x1.0008acp+0
+0x1.783ba4p+3
+0x1.01af66p+0
+0x1.192eep+0
+0x1.132ea6p+7
+0x1.a93964p+2
+0x1.9bc85p+14
+0x1.1e3f46p+8
+0x1.1d8db6p+13
+0x1.0007cap+0
+0x1.2fa568p-1
+0x1.3e8fd4p+12
+0x1.2f5bf6p-1
+0x1.a0994cp+14
+0x1.7ed6b2p+0
+0x1.0f2b1ap+0
+0x1.4ab6e6p+1
+0x1.04c838p+8
+0x1.000034p+0
+0x1p+0
+0x1.eadcd6p-1
+0x1.00008p+0
+0x1.12103cp-1
+0x1p+0
+0x1p+0
+0x1.2f93bp-1
+0x1.7b4b16p+5
+0x1.38fe8cp+6
+0x1p+0
+0x1.36f96cp+2
+0x1.716462p+39
+0x1.000048p+0
+0x1.7c680ep+4
+0x1p+0
+0x1.28cbfap+0
+0x1.a416eap+41
+0x1p+0
+0x1.57e51p+1
+0x1.0004f4p+0
+0x1p+0
+0x1.3167b6p-1
+0x1.984032p+3
+0x1.04f21ep+0
+0x1p+0
+0x1.73ed4p+2
+0x1.0f4eb8p+8
+0x1p+0
+0x1.2df9p+5
+0x1.54bbf8p+2
+0x1.0bf9a4p+0
+0x1.a91d34p+63
+0x1.130ed8p+0
+0x1p+0
+0x1.00036ap+0
+0x1.3ae7aep+8
+0x1.16524ap+8
+0x1.9f774ap+0
+0x1.ba601cp+2
+0x1.bb2f0cp+12
+0x1.a93bd4p+2
+0x1.32e318p+0
+0x1.0ab44ap+0
+0x1p+0
+0x1.2f871ep-1
+0x1p+0
+0x1.a78356p+7
+0x1.001e8cp+0
+0x1.4a08dap+5
+0x1.069e1cp+0
+0x1.e3e184p+1
+0x1.f60012p+18
+0x1p+0
+0x1.b8600ep+6
+0x1.300bc6p-1
+0x1.76f83cp+6
+0x1.16f978p+0
+0x1.0003a4p+0
+0x1.0b4f22p+7
+0x1.37409cp+0
+0x1p+0
+0x1.3e95dp+12
+0x1.00098p+0
+0x1.004038p+0
+0x1.301bfep-1
+0x1p+0
+0x1.9c872ep+0
+0x1.378344p+16
+0x1.18c55cp+0
+0x1.274a0ep-20
+0x1.2811b2p+0
+0x1p+0
+0x1.ba668cp+12
+0x1.7f2c8ap+13
+0x1.0f72fcp+8
+0x1.6308a6p+0
+0x1.b0cac6p+13
+0x1.4837p+0
+0x1p+0
+0x1.40bd6cp+0
+0x1p+0
+0x1.39133p+12
+0x1.c62f4cp+46
+0x1.0004bcp+0
+0x1.12257ap+8
+0x1p+0
+0x1.85645cp+9
+0x1.4cb85ep+0
+0x1p+0
+0x1.a234a8p-1
+0x1p+0
+0x1p+0
+0x1.3cf408p-27
+0x1.0e263ep+1
+0x1.00026p+0
+0x1p+0
+0x1p+0
+0x1.332f2cp-1
+0x1.04bb28p+0
+0x1.4a67cap+0
+0x1.0003dcp+0
+0x1p+0
+0x1.3482d4p-1
+0x1.134a04p+1
+0x1p+0
+0x1.9000ecp+4
+0x1p+0
+0x1.2f4e26p-1
+0x1.0395dp+9
+0x1.38dbb4p+11
+0x1p+0
+0x1.049432p+0
+0x1.1a9a96p+8
+0x1.54bcd2p+2
+0x1.14487cp+0
+0x1.020458p+0
+0x1.000b9p+0
+0x1.32254cp-1
+0x1.73ed2ep+2
+0x1p+0
+0x1.3d8be4p+0
+0x1.3e96d4p+15
+0x1.ffa44cp-1
+0x1.11a334p+3
+0x1.08317p+0
+0x1.000238p+0
+0x1.3e498p+9
+0x1.3389eap-1
+0x1.36f9ccp+2
+0x1.0bbe0ap+0
+0x1.0b53f4p+8
+0x1p+0
+0x1.0e42d2p+0
+0x1.d22332p+18
+0x1p+0
+0x1.05197ep+0
+0x1.205a74p+1
+0x1p+0
+0x1.0086dp+0
+0x1p+0
+0x1.296a6cp+0
+0x1.7ced1p+2
+0x1p+0
+0x1p+0
+0x1.0053eep+0
+0x1.09c5dcp+0
+0x1p+0
+0x1.a07194p+9
+0x1.0a151ap+0
+0x1.01e6ccp+0
+0x1.ef2d1p-84
+0x1.8eb89cp+3
+0x1.15dbb6p+0
+0x1.00307ap+0
+0x1.03571ep+0
+0x1.f5292ep-1
+0x1.59f064p+0
+0x1.0e26a8p+1
+0x1.6d6ab4p+5
+0x1.7ad0fcp+6
+0x1.40fc28p+0
+0x1.c6b9p+14
+0x1.071bfcp+0
+0x1.b0cb28p+7
+0x1.1614b2p+1
+0x1.4bdc7ep+0
+0x1.358db8p+7
+0x1.405dp+3
+0x1.0461d4p+0
+0x1p+0
+0x1.a8b5b2p+7
+0x1.130dbap+7
+0x1.259792p+3
+0x1.2fcf92p-1
+0x1.0092d2p+0
+0x1.0fea96p+0
+0x1.000024p+0
+0x1.a0abccp+5
+0x1.3b1076p+0
+0x1.192914p+5
+0x1.85f5dap-9
+0x1.0b2ae8p+0
+0x1.dc84ap+1
+0x1.2121acp+8
+0x1.b144fep+0
+0x1.131a68p+1
+0x1.28131p+0
+0x1.35dc48p+5
+0x1.b81b5p-51
+0x1.0a1caep+0
+0x1.f9ef34p+0
+0x1.95da52p+0
+0x1p+0
+0x1.3032a2p-1
+0x1.1cc56ep+0
+0x1.c77bfcp+0
+0x1.05370ep+0
+0x1.d6d0c6p+2
+0x1.2fbfap-1
+0x1p+0
+0x1.0000b8p+2
+0x1.b8c316p+1
+0x1.00010cp+0
+0x1.028104p+0
+0x1p+0
+0x1.13f12cp+0
+0x1p+0
+0x1p+0
+0x1.fb7e4ep+53
+0x1p+0
+0x1.780d04p+9
+0x1.1973c4p+6
+0x1.b09184p+0
+0x1.b4ed32p+51
+0x1p+0
+0x1.00b82p+0
+0x1.198ba4p+0
+0x1.57b63cp+7
+0x1.0016d4p+0
+0x1p+0
+0x1.01a3e4p+0
+0x1.e8d11ep+44
+0x1.b7e5d4p+13
+0x1.00667cp+0
+0x1.06ed08p+0
+0x1.05f47ap+0
+0x1.4aa86ap+0
+0x1.04aeap+0
+0x1p+0
+0x1p+0
+0x1.3b13a8p+11
+0x1.596846p+47
+0x1.0d8c64p+0
+0x1.0012aap+0
+0x1p+0
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 09/17] math: Use exp10m1f from CORE-MATH
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (7 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 08/17] benchtests: Add log10p1f benchmark Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-29 21:09   ` DJ Delorie
  2024-11-06 10:29   ` Florian Weimer
  2024-10-25 18:21 ` [PATCH 10/17] math: Use exp2m1f " Adhemerval Zanella
                   ` (8 subsequent siblings)
  17 siblings, 2 replies; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

The CORE-MATH implementation is correctly rounded (for any rounding mode)
and shows better performance compared to the generic exp10m1f.

The code was adapted to glibc style and to use the definition of
math_config.h (to handle errno, overflow, and underflow).  I mostly
fixed some small issues in corner cases (sNaN handling, -INFINITY,
a specific overflow check).

Benchtest on x64_64 (Ryzen 9 5900X, gcc 14.2.1), aarch64 (Neoverse-N1,
gcc 13.3.1), and powerpc (POWER10, gcc 13.2.1):

Latency                      master        patched   improvement
x86_64                      45.4690        49.5845        -9.05%
x86_64v2                    46.1604        36.2665        21.43%
x86_64v3                    37.8442        31.0359        17.99%
i686                        121.367        93.0079        23.37%
aarch64                     21.1126        15.0165        28.87%
power10                     12.7426        8.4929         33.35%

reciprocal-throughput        master        patched   improvement
x86_64                      19.6005        17.4005        11.22%
x86_64v2                    19.6008        11.1977        42.87%
x86_64v3                    17.5427        10.2898        41.34%
i686                        59.4215        60.9675        -2.60%
aarch64                     13.9814        7.9173         43.37%
power10                      6.7814        6.4258          5.24%

The generic implementation calls __ieee754_exp10f which has an
optimized version, although it is not correctly rounded, which is
the main culprit of the the latency difference for x86_64 and
throughp for i686.

Signed-off-by: Alexei Sibidanov <sibid@uvic.ca>
Signed-off-by: Paul Zimmermann <Paul.Zimmermann@inria.fr>
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
 SHARED-FILES                                  |   4 +
 sysdeps/aarch64/libm-test-ulps                |   4 -
 sysdeps/arc/fpu/libm-test-ulps                |   1 -
 sysdeps/arc/nofpu/libm-test-ulps              |   1 -
 sysdeps/arm/libm-test-ulps                    |   4 -
 sysdeps/hppa/fpu/libm-test-ulps               |   4 -
 sysdeps/i386/fpu/libm-test-ulps               |   4 -
 .../i386/i686/fpu/multiarch/libm-test-ulps    |   4 -
 sysdeps/ieee754/flt-32/s_exp10m1f.c           | 225 ++++++++++++++++++
 sysdeps/loongarch/lp64/libm-test-ulps         |   4 -
 sysdeps/m68k/m680x0/fpu/libm-test-ulps        |   4 -
 sysdeps/mips/mips32/libm-test-ulps            |   4 -
 sysdeps/mips/mips64/libm-test-ulps            |   4 -
 sysdeps/powerpc/fpu/libm-test-ulps            |   4 -
 sysdeps/powerpc/nofpu/libm-test-ulps          |   4 -
 sysdeps/riscv/nofpu/libm-test-ulps            |   1 -
 sysdeps/riscv/rvd/libm-test-ulps              |   4 -
 sysdeps/s390/fpu/libm-test-ulps               |   4 -
 sysdeps/sparc/fpu/libm-test-ulps              |   4 -
 sysdeps/x86_64/fpu/libm-test-ulps             |   4 -
 20 files changed, 229 insertions(+), 63 deletions(-)
 create mode 100644 sysdeps/ieee754/flt-32/s_exp10m1f.c

diff --git a/SHARED-FILES b/SHARED-FILES
index 2aefac8a95..a1dd3878f9 100644
--- a/SHARED-FILES
+++ b/SHARED-FILES
@@ -231,3 +231,7 @@ sysdeps/ieee754/flt-32/e_gammaf_r.c
   - replace 0x1p127f * 0x1p127f by math_narrow_eval (x * 0x1p127f)
   - replace 0x1p-127f * sgn[k&1] by math_narrow_eval (0x1p-127f * sgn[k&1])
   - add libm_alias_finite (__ieee754_gammaf_r, __gammaf_r) at the end
+sysdeps/ieee754/flt-32/s_exp10m1f.c
+  (file src/binary32/exp10m1/exp10m1f.c in CORE_MATH)
+  - The code was adapted to use glibc code style and internal
+    functions to handle errno, overflow, and underflow.
diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
index 8c333fcd29..00832393f6 100644
--- a/sysdeps/aarch64/libm-test-ulps
+++ b/sysdeps/aarch64/libm-test-ulps
@@ -1083,22 +1083,18 @@ ldouble: 3
 
 Function: "exp10m1":
 double: 4
-float: 2
 ldouble: 3
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 ldouble: 6
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 3
 ldouble: 6
 
 Function: "exp10m1_upward":
 double: 5
-float: 3
 ldouble: 6
 
 Function: "exp2":
diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps
index d1665b9b72..ad4ae4c632 100644
--- a/sysdeps/arc/fpu/libm-test-ulps
+++ b/sysdeps/arc/fpu/libm-test-ulps
@@ -789,7 +789,6 @@ float: 1
 
 Function: "exp10m1":
 double: 4
-float: 2
 
 Function: "exp10m1_downward":
 double: 3
diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
index e768024eb5..4cecea6919 100644
--- a/sysdeps/arc/nofpu/libm-test-ulps
+++ b/sysdeps/arc/nofpu/libm-test-ulps
@@ -194,7 +194,6 @@ float: 1
 
 Function: "exp10m1":
 double: 3
-float: 2
 
 Function: "exp2":
 double: 1
diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
index 21fe98a7bd..bcbe82ca34 100644
--- a/sysdeps/arm/libm-test-ulps
+++ b/sysdeps/arm/libm-test-ulps
@@ -779,19 +779,15 @@ float: 1
 
 Function: "exp10m1":
 double: 3
-float: 2
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 3
 
 Function: "exp10m1_upward":
 double: 4
-float: 4
 
 Function: "exp2":
 double: 1
diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
index 57c1155e8b..3dc1f2f8c3 100644
--- a/sysdeps/hppa/fpu/libm-test-ulps
+++ b/sysdeps/hppa/fpu/libm-test-ulps
@@ -798,19 +798,15 @@ float: 1
 
 Function: "exp10m1":
 double: 4
-float: 2
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 3
 
 Function: "exp10m1_upward":
 double: 5
-float: 4
 
 Function: "exp2":
 double: 1
diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
index d13b05a220..96d02334e4 100644
--- a/sysdeps/i386/fpu/libm-test-ulps
+++ b/sysdeps/i386/fpu/libm-test-ulps
@@ -1155,25 +1155,21 @@ ldouble: 2
 
 Function: "exp10m1":
 double: 3
-float: 1
 float128: 3
 ldouble: 4
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 float128: 6
 ldouble: 6
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 2
 float128: 6
 ldouble: 5
 
 Function: "exp10m1_upward":
 double: 5
-float: 3
 float128: 6
 ldouble: 6
 
diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
index 0a813aa8dd..c18e2bc8de 100644
--- a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
+++ b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
@@ -1158,25 +1158,21 @@ ldouble: 2
 
 Function: "exp10m1":
 double: 3
-float: 1
 float128: 3
 ldouble: 4
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 float128: 6
 ldouble: 6
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 2
 float128: 6
 ldouble: 5
 
 Function: "exp10m1_upward":
 double: 5
-float: 3
 float128: 6
 ldouble: 6
 
diff --git a/sysdeps/ieee754/flt-32/s_exp10m1f.c b/sysdeps/ieee754/flt-32/s_exp10m1f.c
new file mode 100644
index 0000000000..610f269b01
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/s_exp10m1f.c
@@ -0,0 +1,225 @@
+/* Implementation of the exp10m1 function for binary32.
+
+Copyright (c) 2022-2024 Alexei Sibidanov. Paul Zimmermann.
+
+The original version of this file was copied from the CORE-MATH
+project (file src/binary32/exp10m1/exp10m1f.c, revision d680516).
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+ */
+
+#include <math.h>
+#include "math_config.h"
+#include <libm-alias-float.h>
+
+float
+__exp10m1f (float x)
+{
+  const double iln10h = 0x1.a934f09p+1 * 16;
+  const double iln10l = 0x1.e68dc57f2496p-29 * 16;
+  double z = x;
+  uint32_t ux = asuint (x);
+  uint32_t ax = ux & (~0u >> 1);
+  if (__glibc_unlikely (ux > 0xc0f0d2f1u))
+    { /* x < -7.52575 */
+      if (ax > (0xffu << 23))
+	return x + x; /* nan */
+      return (ux == 0xff800000) ? -0x1p+0 : -0x1p+0 + 0x1p-26f;
+    }
+  else if (__glibc_unlikely (ax > 0x421a209au))
+    { /* x > 38.5318 */
+      if (ax >= asuint (INFINITY))
+	return x + x; /* +Inf or NaN */
+      return __math_oflowf (0);
+    }
+  else if (__glibc_unlikely (ax < 0x3d89c604u))
+    { /* |x| < 0.1549/log(10) */
+      double z2 = z * z, r;
+      if (__glibc_unlikely (ax < 0x3d1622fbu))
+	{ /* |x| < 8.44e-2/log(10)  */
+	  if (__glibc_unlikely (ax < 0x3c8b76a3u))
+	    { /* |x| < 3.92e-2/log(10)  */
+	      if (__glibc_unlikely (ax < 0x3bcced04u))
+		{ /* |x| < 1.44e-2/log(10) */
+		  if (__glibc_unlikely (ax < 0x3acf33ebu))
+		    { /* |x| < 3.64e-3/log(10 */
+		      if (__glibc_unlikely (ax < 0x395a966bu))
+			{ /* |x| < 4.8e-4/log(10 */
+			  if (__glibc_unlikely (ax < 0x36fe4a4bu))
+			    { /* |x| < 1.745e-5/log(10) */
+			      if (__glibc_unlikely (ax < 0x32407f39u))
+				{ /* |x| < 2.58e-8/log(10) */
+				  if (__glibc_unlikely (ax < 0x245e5bd9u))
+				    { /* |x| < 4.82164e-17 */
+				      r = 0x1.26bb1bbb55516p+1;
+				    }
+				  else
+				    {
+				      if (__glibc_unlikely (ux == 0x2c994b7bu))
+					return 0x1.60f974p-37f - 0x1p-90f;
+				      r = 0x1.26bb1bbb55516p+1
+					  + z * 0x1.53524c73cea69p+1;
+				    }
+				}
+			      else
+				{
+				  if (__glibc_unlikely (ux == 0xb6fa215bu))
+				    return -0x1.1ff87ep-16 + 0x1p-68;
+				  r = 0x1.26bb1bbb55516p+1
+				      + z * (0x1.53524c73ea62fp+1
+					     + z * 0x1.0470591de2c75p+1);
+				}
+			    }
+			  else
+			    {
+			      static const double cp[] =
+				{
+				  0x1.26bb1bbb55515p+1, 0x1.53524c73cea69p+1,
+				  0x1.0470595038cc2p+1, 0x1.2bd7609fe1561p+0
+			        };
+			      r = (cp[0] + z * cp[1])
+				  + z2 * (cp[2] + z * cp[3]);
+			    }
+			}
+		      else
+			{
+			  static const double cp[] =
+			    {
+			      0x1.26bb1bbb55516p+1, 0x1.53524c73ce6dbp+1,
+			      0x1.0470591de3024p+1, 0x1.2bd76b79060e6p+0,
+			      0x1.1429ffd3a963dp-1
+			    };
+			  r = (cp[0] + z * cp[1])
+			      + z2 * (cp[2] + z * (cp[3] + z * cp[4]));
+			}
+		    }
+		  else
+		    {
+		      static const double cp[] =
+			{
+			  0x1.26bb1bbb55516p+1, 0x1.53524c73cea67p+1,
+			  0x1.0470591dc2953p+1, 0x1.2bd760a004d64p+0,
+			  0x1.142a85da6f072p-1, 0x1.a7ed70725b00ep-3
+			};
+		      r = (cp[0] + z * cp[1]) + z2
+			    * ((cp[2] + z * cp[3])
+			       + z2 * (cp[4] + z * cp[5]));
+		    }
+		}
+	      else
+		{
+		  static const double cp[] =
+		    {
+		      0x1.26bb1bbb55516p+1, 0x1.53524c73ceadep+1,
+		      0x1.0470591de2bb4p+1, 0x1.2bd76099a9d33p+0,
+		      0x1.1429ffd829b0bp-1, 0x1.a7f2a6a0f7dc8p-3,
+		      0x1.16e4dfbce0f56p-4
+		    };
+		  r = (cp[0] + z * cp[1])
+		      + z2 * ((cp[2] + z * cp[3])
+			      + z2 * (cp[4] + z * (cp[5] + z * cp[6])));
+		}
+	    }
+	  else
+	    {
+	      static const double cp[] =
+		{
+		  0x1.26bb1bbb55515p+1, 0x1.53524c73cea6ap+1,
+		  0x1.0470591de476p+1,  0x1.2bd7609fd4ee2p+0,
+		  0x1.1429ff70a9b48p-1, 0x1.a7ed71259ba5bp-3,
+		  0x1.16f3004fb3ac1p-4, 0x1.4116b0388aa9fp-6
+		};
+	      r = ((cp[0] + z * cp[1]) + z2 * (cp[2] + z * cp[3]))
+		  + (z2 * z2) * ((cp[4] + z * cp[5]) + z2 * (cp[6]
+							     + z * cp[7]));
+	    }
+	}
+      else
+	{
+	  static const double cp[] =
+	    {
+	      0x1.26bb1bbb55515p+1, 0x1.53524c73cea42p+1, 0x1.0470591de2d1dp+1,
+	      0x1.2bd760a010a53p+0, 0x1.1429ffd16170cp-1, 0x1.a7ed6b2a0d97fp-3,
+	      0x1.16e4e37fa51e4p-4, 0x1.4147fe4c1676fp-6, 0x1.4897c4b3e329ap-8
+	    };
+	  r = ((cp[0] + z * cp[1]) + z2 * (cp[2] + z * cp[3]))
+	      + (z2 * z2) * ((cp[4] + z * cp[5])
+			     + z2 * (cp[6] + z * (cp[7] + z * cp[8])));
+	}
+      r *= z;
+      return r;
+    }
+  else
+    {
+      /* -7.52575 < x < -0.1549/log(10) or 0.1549/log(10) < x < 38.5318  */
+      static const double tb[] =
+	{
+	  0x1p+0, 0x1.0b5586cf9890fp+0, 0x1.172b83c7d517bp+0,
+	  0x1.2387a6e756238p+0, 0x1.306fe0a31b715p+0, 0x1.3dea64c123422p+0,
+	  0x1.4bfdad5362a27p+0, 0x1.5ab07dd485429p+0, 0x1.6a09e667f3bcdp+0,
+	  0x1.7a11473eb0187p+0, 0x1.8ace5422aa0dap+0, 0x1.9c49182a3f09p+0,
+	  0x1.ae89f995ad3adp+0, 0x1.c199bdd85529cp+0, 0x1.d5818dcfba487p+0,
+	  0x1.ea4afa2a490dap+0
+	};
+      static const double c[] =
+	{
+	  0x1.62e42fefa398bp-5,  0x1.ebfbdff84555ap-11, 0x1.c6b08d4ad86d3p-17,
+	  0x1.3b2ad1b1716a2p-23, 0x1.5d7472718ce9dp-30, 0x1.4a1d7f457ac56p-37
+	};
+
+      if (__glibc_unlikely ((ux << 11) == 0))
+	{
+	  uint32_t k = (ux >> 21) - 0x1fc;
+	  if (k <= 0xb)
+	    {
+	      if (k == 0)
+		return 10.0f - 1.0f;
+	      if (k == 4)
+		return 100.0f - 1.0f;
+	      if (k == 6)
+		return 1000.0f - 1.0f;
+	      if (k == 8)
+		return 10000.0f - 1.0f;
+	      if (k == 9)
+		return 100000.0f - 1.0f;
+	      if (k == 10)
+		return 1000000.0f - 1.0f;
+	      if (k == 11)
+		return 10000000.0f - 1.0f;
+	    }
+	}
+      double a = iln10h * z;
+      double ia = floor (a);
+      double h = (a - ia) + iln10l * z;
+      int64_t i = ia;
+      int64_t j = i & 0xf;
+      int64_t e = i - j;
+      e >>= 4;
+      double s = tb[j];
+      s *= asdouble ((e + 0x3ffull) << 52);
+      double h2 = h * h;
+      double c0 = c[0] + h * c[1];
+      double c2 = c[2] + h * c[3];
+      double c4 = c[4] + h * c[5];
+      c0 += h2 * (c2 + h2 * c4);
+      double w = s * h;
+      return (s - 1.0) + w * c0;
+    }
+}
+libm_alias_float (__exp10m1, exp10m1)
diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
index 75e21ee2a8..de7e526008 100644
--- a/sysdeps/loongarch/lp64/libm-test-ulps
+++ b/sysdeps/loongarch/lp64/libm-test-ulps
@@ -977,22 +977,18 @@ ldouble: 3
 
 Function: "exp10m1":
 double: 4
-float: 2
 ldouble: 3
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 ldouble: 6
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 3
 ldouble: 6
 
 Function: "exp10m1_upward":
 double: 5
-float: 3
 ldouble: 6
 
 Function: "exp2":
diff --git a/sysdeps/m68k/m680x0/fpu/libm-test-ulps b/sysdeps/m68k/m680x0/fpu/libm-test-ulps
index 73e98eb479..96cd7b3fd5 100644
--- a/sysdeps/m68k/m680x0/fpu/libm-test-ulps
+++ b/sysdeps/m68k/m680x0/fpu/libm-test-ulps
@@ -882,19 +882,15 @@ ldouble: 3
 
 Function: "exp10m1":
 double: 1
-float: 1
 
 Function: "exp10m1_downward":
 double: 1
-float: 1
 
 Function: "exp10m1_towardzero":
 double: 1
-float: 1
 
 Function: "exp10m1_upward":
 double: 3
-float: 1
 
 Function: "exp2":
 double: 1
diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
index cc1600c2ab..829da3ebf1 100644
--- a/sysdeps/mips/mips32/libm-test-ulps
+++ b/sysdeps/mips/mips32/libm-test-ulps
@@ -779,19 +779,15 @@ float: 1
 
 Function: "exp10m1":
 double: 3
-float: 2
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 3
 
 Function: "exp10m1_upward":
 double: 4
-float: 4
 
 Function: "exp2":
 double: 1
diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
index 88dbb20401..5c7b050b11 100644
--- a/sysdeps/mips/mips64/libm-test-ulps
+++ b/sysdeps/mips/mips64/libm-test-ulps
@@ -978,22 +978,18 @@ ldouble: 3
 
 Function: "exp10m1":
 double: 3
-float: 2
 ldouble: 3
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 ldouble: 6
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 3
 ldouble: 6
 
 Function: "exp10m1_upward":
 double: 4
-float: 4
 ldouble: 6
 
 Function: "exp2":
diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
index dcefbcefcf..30ddbaf05f 100644
--- a/sysdeps/powerpc/fpu/libm-test-ulps
+++ b/sysdeps/powerpc/fpu/libm-test-ulps
@@ -1186,25 +1186,21 @@ ldouble: 4
 
 Function: "exp10m1":
 double: 4
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 float128: 6
 ldouble: 9
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 3
 float128: 6
 ldouble: 9
 
 Function: "exp10m1_upward":
 double: 5
-float: 3
 float128: 6
 ldouble: 8
 
diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
index 14be978dc3..e15e1f8fc0 100644
--- a/sysdeps/powerpc/nofpu/libm-test-ulps
+++ b/sysdeps/powerpc/nofpu/libm-test-ulps
@@ -987,22 +987,18 @@ ldouble: 4
 
 Function: "exp10m1":
 double: 3
-float: 2
 ldouble: 3
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 ldouble: 9
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 3
 ldouble: 9
 
 Function: "exp10m1_upward":
 double: 4
-float: 4
 ldouble: 10
 
 Function: "exp2":
diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
index 4adad138b0..2271e1ee6c 100644
--- a/sysdeps/riscv/nofpu/libm-test-ulps
+++ b/sysdeps/riscv/nofpu/libm-test-ulps
@@ -974,7 +974,6 @@ ldouble: 3
 
 Function: "exp10m1":
 double: 2
-float: 1
 ldouble: 1
 
 Function: "exp2":
diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
index 07a8794e48..0bc61bf3c8 100644
--- a/sysdeps/riscv/rvd/libm-test-ulps
+++ b/sysdeps/riscv/rvd/libm-test-ulps
@@ -977,22 +977,18 @@ ldouble: 3
 
 Function: "exp10m1":
 double: 4
-float: 2
 ldouble: 3
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 ldouble: 6
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 3
 ldouble: 6
 
 Function: "exp10m1_upward":
 double: 5
-float: 3
 ldouble: 6
 
 Function: "exp2":
diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
index 6e4084ae37..860479f3ff 100644
--- a/sysdeps/s390/fpu/libm-test-ulps
+++ b/sysdeps/s390/fpu/libm-test-ulps
@@ -978,22 +978,18 @@ ldouble: 3
 
 Function: "exp10m1":
 double: 4
-float: 2
 ldouble: 3
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 ldouble: 6
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 3
 ldouble: 6
 
 Function: "exp10m1_upward":
 double: 5
-float: 3
 ldouble: 6
 
 Function: "exp2":
diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
index ccb6c794e7..4d8064b543 100644
--- a/sysdeps/sparc/fpu/libm-test-ulps
+++ b/sysdeps/sparc/fpu/libm-test-ulps
@@ -978,22 +978,18 @@ ldouble: 3
 
 Function: "exp10m1":
 double: 3
-float: 2
 ldouble: 3
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 ldouble: 6
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 3
 ldouble: 6
 
 Function: "exp10m1_upward":
 double: 4
-float: 4
 ldouble: 6
 
 Function: "exp2":
diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
index 80d0125642..3f438c2090 100644
--- a/sysdeps/x86_64/fpu/libm-test-ulps
+++ b/sysdeps/x86_64/fpu/libm-test-ulps
@@ -1431,25 +1431,21 @@ float: 1
 
 Function: "exp10m1":
 double: 4
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "exp10m1_downward":
 double: 3
-float: 3
 float128: 6
 ldouble: 6
 
 Function: "exp10m1_towardzero":
 double: 2
-float: 3
 float128: 6
 ldouble: 5
 
 Function: "exp10m1_upward":
 double: 5
-float: 4
 float128: 6
 ldouble: 6
 
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 10/17] math: Use exp2m1f from CORE-MATH
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (8 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 09/17] math: Use exp10m1f from CORE-MATH Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-29 21:24   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 11/17] math: Use expm1f " Adhemerval Zanella
                   ` (7 subsequent siblings)
  17 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

The CORE-MATH implementation is correctly rounded (for any rounding mode)
and shows better performance compared to the generic exp2m1f.

The code was adapted to glibc style and to use the definition of
math_config.h (to handle errno, overflow, and underflow).  The
only change is to handle FLT_MAX_EXP for FE_DOWNWARD or FE_TOWARDZERO.

The benchmark inputs are based on exp2f ones.

Benchtest on x64_64 (Ryzen 9 5900X, gcc 14.2.1), aarch64 (Neoverse-N1,
gcc 13.3.1), and powerpc (POWER10, gcc 13.2.1):

Latency                      master        patched   improvement
x86_64                      40.6042        48.7104       -19.96%
x86_64v2                    40.7506        35.9032        11.90%
x86_64v3                    35.2301        31.7956        9.75%
i686                        102.094        94.6657        7.28%
aarch64                     18.2704        15.1387        17.14%
power10                     11.9444         8.2402        31.01%

reciprocal-throughput        master        patched   improvement
x86_64                      20.8683        16.1428        22.64%
x86_64v2                    19.5076        10.4474        46.44%
x86_64v3                    19.2106        10.4014        45.86%
i686                        56.4054        59.3004        -5.13%
aarch64                     12.0781         7.3953        38.77%
power10                      6.5306         5.9388         9.06%

The generic implementation calls __ieee754_exp2f and x86_64 provides
an optimized ifunc version (built with -mfma -mavx2, not correctly
rounded).  This explains the performance difference for x86_64.

Same for i686, where the ABI provides an optimized __ieee754_exp2f
version built with '-msse2 -mfpmath=sse'.  When built wth same
flags, the new algorithm shows a better performance:

                            master        patched    improvement
latency                    102.094        91.2823         10.59%
reciprocal-throughput      56.4054        52.7984          6.39%

Signed-off-by: Alexei Sibidanov <sibid@uvic.ca>
Signed-off-by: Paul Zimmermann <Paul.Zimmermann@inria.fr>
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
 SHARED-FILES                                  |   4 +
 sysdeps/aarch64/libm-test-ulps                |   4 -
 sysdeps/arc/fpu/libm-test-ulps                |   4 -
 sysdeps/arc/nofpu/libm-test-ulps              |   1 -
 sysdeps/arm/libm-test-ulps                    |   4 -
 sysdeps/hppa/fpu/libm-test-ulps               |   4 -
 sysdeps/i386/fpu/libm-test-ulps               |   4 -
 .../i386/i686/fpu/multiarch/libm-test-ulps    |   4 -
 sysdeps/ieee754/flt-32/s_exp2m1f.c            | 192 ++++++++++++++++++
 sysdeps/loongarch/lp64/libm-test-ulps         |   4 -
 sysdeps/m68k/m680x0/fpu/libm-test-ulps        |   4 -
 sysdeps/mips/mips32/libm-test-ulps            |   4 -
 sysdeps/mips/mips64/libm-test-ulps            |   4 -
 sysdeps/powerpc/fpu/libm-test-ulps            |   4 -
 sysdeps/powerpc/nofpu/libm-test-ulps          |   4 -
 sysdeps/riscv/nofpu/libm-test-ulps            |   1 -
 sysdeps/riscv/rvd/libm-test-ulps              |   4 -
 sysdeps/s390/fpu/libm-test-ulps               |   4 -
 sysdeps/sparc/fpu/libm-test-ulps              |   4 -
 sysdeps/x86_64/fpu/libm-test-ulps             |   4 -
 20 files changed, 196 insertions(+), 66 deletions(-)
 create mode 100644 sysdeps/ieee754/flt-32/s_exp2m1f.c

diff --git a/SHARED-FILES b/SHARED-FILES
index a1dd3878f9..5e771cd1c4 100644
--- a/SHARED-FILES
+++ b/SHARED-FILES
@@ -235,3 +235,7 @@ sysdeps/ieee754/flt-32/s_exp10m1f.c
   (file src/binary32/exp10m1/exp10m1f.c in CORE_MATH)
   - The code was adapted to use glibc code style and internal
     functions to handle errno, overflow, and underflow.
+sysdeps/ieee754/flt-32/s_exp2m1f.c
+  (file src/binary32/exp2m1/exp2m1f.c in CORE_MATH)
+  - The code was adapted to use glibc code style and internal
+    functions to handle errno, overflow, and underflow.
diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
index 00832393f6..29ccd1dfe9 100644
--- a/sysdeps/aarch64/libm-test-ulps
+++ b/sysdeps/aarch64/libm-test-ulps
@@ -1127,22 +1127,18 @@ ldouble: 2
 
 Function: "exp2m1":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 ldouble: 3
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 ldouble: 4
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 ldouble: 5
 
 Function: "exp_advsimd":
diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps
index ad4ae4c632..fd6d4181f8 100644
--- a/sysdeps/arc/fpu/libm-test-ulps
+++ b/sysdeps/arc/fpu/libm-test-ulps
@@ -818,19 +818,15 @@ float: 1
 
 Function: "exp2m1":
 double: 2
-float: 2
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 
 Function: "exp_downward":
 double: 1
diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
index 4cecea6919..574ae8b8be 100644
--- a/sysdeps/arc/nofpu/libm-test-ulps
+++ b/sysdeps/arc/nofpu/libm-test-ulps
@@ -200,7 +200,6 @@ double: 1
 
 Function: "exp2m1":
 double: 2
-float: 2
 
 Function: "expm1":
 double: 1
diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
index bcbe82ca34..28718c7d2c 100644
--- a/sysdeps/arm/libm-test-ulps
+++ b/sysdeps/arm/libm-test-ulps
@@ -807,19 +807,15 @@ float: 1
 
 Function: "exp2m1":
 double: 2
-float: 2
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 
 Function: "exp_downward":
 double: 1
diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
index 3dc1f2f8c3..338ca77ade 100644
--- a/sysdeps/hppa/fpu/libm-test-ulps
+++ b/sysdeps/hppa/fpu/libm-test-ulps
@@ -826,19 +826,15 @@ float: 1
 
 Function: "exp2m1":
 double: 2
-float: 2
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 
 Function: "exp_downward":
 double: 1
diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
index 96d02334e4..98a5a538ff 100644
--- a/sysdeps/i386/fpu/libm-test-ulps
+++ b/sysdeps/i386/fpu/libm-test-ulps
@@ -1194,25 +1194,21 @@ ldouble: 1
 
 Function: "exp2m1":
 double: 2
-float: 1
 float128: 2
 ldouble: 3
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 float128: 3
 ldouble: 6
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 float128: 4
 ldouble: 5
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 float128: 5
 ldouble: 6
 
diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
index c18e2bc8de..9afb63bc0f 100644
--- a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
+++ b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
@@ -1197,25 +1197,21 @@ ldouble: 1
 
 Function: "exp2m1":
 double: 2
-float: 1
 float128: 2
 ldouble: 3
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 float128: 3
 ldouble: 6
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 float128: 4
 ldouble: 6
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 float128: 5
 ldouble: 6
 
diff --git a/sysdeps/ieee754/flt-32/s_exp2m1f.c b/sysdeps/ieee754/flt-32/s_exp2m1f.c
new file mode 100644
index 0000000000..f899152d2a
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/s_exp2m1f.c
@@ -0,0 +1,192 @@
+/* Correctly-rounded base-2 exponent function biased by 1 for binary32 value.
+
+Copyright (c) 2022-2024 Alexei Sibidanov.
+
+The original version of this file was copied from the CORE-MATH
+project (file src/binary32/exp2m1/exp2m1f.c, revision bc385c2).
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#include <fenv.h>
+#include <math.h>
+#include "math_config.h"
+#include <libm-alias-float.h>
+#include <math-narrow-eval.h>
+#include <float.h>
+
+float
+__exp2m1f (float x)
+{
+  double z = x;
+  uint32_t ux = asuint (x);
+  uint32_t ax = ux & (~0u >> 1);
+  if (__glibc_unlikely (ux >= 0xc1c80000u))
+    { /* x <= -25 */
+      if (ax > (0xffu << 23))
+	return x + x; /* nan */
+      return (ux == 0xff800000) ? -0x1p+0 : -0x1p+0 + 0x1p-26f;
+    }
+  else if (__glibc_unlikely (ax >= 0x43000000u))
+    { /* x >= 128 */
+      if (ax >= asuint (INFINITY))
+	return x + x; /* +Inf or NaN */
+      /* exp2m1 (MAX_EXP) should not overflow when rounding towards zero
+         or towards -Inf.  We round FLT_MAX + 2^103 which is in the middle
+         between FLT_MAX and 2^128 (the next number with unbounded range).  */
+      float ret = math_narrow_eval (FLT_MAX + 0x1p103f);
+      if (x == FLT_MAX_EXP && ret == FLT_MAX)
+        return ret;
+      return __math_oflowf (0);
+    }
+  else if (__glibc_unlikely (ax < 0x3df95f1fu))
+    { /* |x| < 8.44e-2/log(2) */
+      double z2 = z * z, r;
+      if (__glibc_unlikely (ax < 0x3d67a4ccu))
+	{ /* |x| < 3.92e-2/log(2) */
+	  if (__glibc_unlikely (ax < 0x3caa2feeu))
+	    { /* |x| < 1.44e-2/log(2) */
+	      if (__glibc_unlikely (ax < 0x3bac1405u))
+		{ /* |x| < 3.64e-3/log(2) */
+		  if (__glibc_unlikely (ax < 0x3a358876u))
+		    { /* |x| < 4.8e-4/log(2) */
+		      if (__glibc_unlikely (ax < 0x37d32ef6u))
+			{ /* |x| < 1.745e-5/log(2) */
+			  if (__glibc_unlikely (ax < 0x331fdd82u))
+			    { /* |x| < 2.58e-8/log(2) */
+			      if (__glibc_unlikely (ax < 0x2538aa3bu))
+				/* |x| < 1.60171e-16 */
+				r = 0x1.62e42fefa39efp-1;
+			      else
+				r = 0x1.62e42fefa39fp-1
+				  + z * 0x1.ebfbdff82c58fp-3;
+			    }
+			  else
+			    {
+			      if (__glibc_unlikely (ux == 0xb3d85005u))
+				return -0x1.2bdf76p-24 - 0x1.8p-77;
+			      if (__glibc_unlikely (ux == 0x3338428du))
+				return 0x1.fee08ap-26 + 0x1p-80;
+			      static const double c[] =
+				{
+				  0x1.62e42fefa39efp-1, 0x1.ebfbdff8548fdp-3,
+				  0x1.c6b08d704a06dp-5
+				};
+			      r = c[0] + z * (c[1] + z * c[2]);
+			    }
+			}
+		      else
+			{
+			  if (__glibc_unlikely (ux == 0x388bca4fu))
+			    return 0x1.839702p-15 - 0x1.8p-68;
+			  static const double c[] =
+			    {
+			      0x1.62e42fefa39efp-1, 0x1.ebfbdff82c58fp-3,
+			      0x1.c6b08dc82b347p-5, 0x1.3b2ab6fbad172p-7
+			    };
+			  r = (c[0] + z * c[1]) + z2 * (c[2] + z * c[3]);
+			}
+		    }
+		  else
+		    {
+		      static const double c[] =
+			{
+			  0x1.62e42fefa39efp-1, 0x1.ebfbdff82c068p-3,
+			  0x1.c6b08d704a6dcp-5, 0x1.3b2ac262c3eedp-7,
+			  0x1.5d87fe7af779ap-10
+			};
+		      r = (c[0] + z * c[1])
+			  + z2 * (c[2] + z * (c[3] + z * c[4]));
+		    }
+		}
+	      else
+		{
+		  static const double c[] =
+		    {
+		      0x1.62e42fefa39fp-1,   0x1.ebfbdff82c58dp-3,
+		      0x1.c6b08d7011d13p-5,  0x1.3b2ab6fbd267dp-7,
+		      0x1.5d88a81cea49ep-10, 0x1.430912ea9b963p-13
+		    };
+		  r = (c[0] + z * c[1])
+		      + z2 * ((c[2] + z * c[3]) + z2 * (c[4] + z * c[5]));
+		}
+	    }
+	  else
+	    {
+	      static const double c[] =
+		{
+		  0x1.62e42fefa39efp-1,  0x1.ebfbdff82c639p-3,
+		  0x1.c6b08d7049f1cp-5,  0x1.3b2ab6f5243bdp-7,
+		  0x1.5d87fe80a9e6cp-10, 0x1.430d0b9257fa8p-13,
+		  0x1.ffcbfc4cf0952p-17
+		};
+	      r = (c[0] + z * c[1])
+		  + z2 * ((c[2] + z * c[3])
+			  + z2 * (c[4] + z * (c[5] + z * c[6])));
+	    }
+	}
+      else
+	{
+	  static const double c[] =
+	    {
+	      0x1.62e42fefa39efp-1,  0x1.ebfbdff82c591p-3,
+	      0x1.c6b08d704cf6bp-5,  0x1.3b2ab6fba00cep-7,
+	      0x1.5d87fdfdaadb4p-10, 0x1.4309137333066p-13,
+	      0x1.ffe5e90daf7ddp-17, 0x1.62c0220eed731p-20
+	    };
+	  r = ((c[0] + z * c[1]) + z2 * (c[2] + z * c[3]))
+	      + (z2 * z2) * ((c[4] + z * c[5]) + z2 * (c[6] + z * c[7]));
+	}
+      r *= z;
+      return r;
+    }
+  else
+    {
+      static const double c[] =
+	{
+	  0x1.62e42fefa398bp-5,  0x1.ebfbdff84555ap-11,
+	  0x1.c6b08d4ad86d3p-17, 0x1.3b2ad1b1716a2p-23,
+	  0x1.5d7472718ce9dp-30, 0x1.4a1d7f457ac56p-37
+	};
+      static const double tb[] =
+	{
+	  0x1p+0,               0x1.0b5586cf9890fp+0,  0x1.172b83c7d517bp+0,
+	  0x1.2387a6e756238p+0, 0x1.306fe0a31b715p+0,  0x1.3dea64c123422p+0,
+	  0x1.4bfdad5362a27p+0, 0x1.5ab07dd485429p+0,  0x1.6a09e667f3bcdp+0,
+	  0x1.7a11473eb0187p+0, 0x1.8ace5422aa0dap+0,  0x1.9c49182a3f09p+0,
+	  0x1.ae89f995ad3adp+0, 0x1.c199bdd85529cp+0,  0x1.d5818dcfba487p+0,
+	  0x1.ea4afa2a490dap+0
+	};
+      double a = 16.0 * z;
+      double ia = floor (a);
+      double h = a - ia;
+      double h2 = h * h;
+      int64_t i = ia, j = i & 0xf, e = i - j;
+      e >>= 4;
+      double s = tb[j];
+      s *= asdouble ((e + 0x3ffull) << 52);
+      double c0 = c[0] + h * c[1];
+      double c2 = c[2] + h * c[3];
+      double c4 = c[4] + h * c[5];
+      c0 += h2 * (c2 + h2 * c4);
+      double w = s * h;
+      return (s - 1.0) + w * c0;
+    }
+}
+libm_alias_float (__exp2m1, exp2m1)
diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
index de7e526008..c6fc9fd4ed 100644
--- a/sysdeps/loongarch/lp64/libm-test-ulps
+++ b/sysdeps/loongarch/lp64/libm-test-ulps
@@ -1010,22 +1010,18 @@ ldouble: 2
 
 Function: "exp2m1":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 ldouble: 3
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 ldouble: 4
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 ldouble: 5
 
 Function: "exp_downward":
diff --git a/sysdeps/m68k/m680x0/fpu/libm-test-ulps b/sysdeps/m68k/m680x0/fpu/libm-test-ulps
index 96cd7b3fd5..7fef8942ae 100644
--- a/sysdeps/m68k/m680x0/fpu/libm-test-ulps
+++ b/sysdeps/m68k/m680x0/fpu/libm-test-ulps
@@ -903,19 +903,15 @@ double: 1
 
 Function: "exp2m1":
 double: 1
-float: 1
 
 Function: "exp2m1_downward":
 double: 2
-float: 1
 
 Function: "exp2m1_towardzero":
 double: 2
-float: 1
 
 Function: "exp2m1_upward":
 double: 1
-float: 1
 
 Function: "exp_upward":
 double: 1
diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
index 829da3ebf1..d8daca6326 100644
--- a/sysdeps/mips/mips32/libm-test-ulps
+++ b/sysdeps/mips/mips32/libm-test-ulps
@@ -807,19 +807,15 @@ float: 1
 
 Function: "exp2m1":
 double: 2
-float: 2
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 
 Function: "exp_downward":
 double: 1
diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
index 5c7b050b11..39e94d5480 100644
--- a/sysdeps/mips/mips64/libm-test-ulps
+++ b/sysdeps/mips/mips64/libm-test-ulps
@@ -1014,22 +1014,18 @@ ldouble: 2
 
 Function: "exp2m1":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 ldouble: 3
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 ldouble: 4
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 ldouble: 5
 
 Function: "exp_downward":
diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
index 30ddbaf05f..dd25aaf94a 100644
--- a/sysdeps/powerpc/fpu/libm-test-ulps
+++ b/sysdeps/powerpc/fpu/libm-test-ulps
@@ -1227,25 +1227,21 @@ ldouble: 2
 
 Function: "exp2m1":
 double: 2
-float: 2
 float128: 2
 ldouble: 3
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 float128: 3
 ldouble: 7
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 float128: 4
 ldouble: 8
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 float128: 5
 ldouble: 9
 
diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
index e15e1f8fc0..1e5bae039b 100644
--- a/sysdeps/powerpc/nofpu/libm-test-ulps
+++ b/sysdeps/powerpc/nofpu/libm-test-ulps
@@ -1023,22 +1023,18 @@ ldouble: 2
 
 Function: "exp2m1":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 ldouble: 7
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 ldouble: 8
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 ldouble: 9
 
 Function: "exp_downward":
diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
index 2271e1ee6c..11f891988e 100644
--- a/sysdeps/riscv/nofpu/libm-test-ulps
+++ b/sysdeps/riscv/nofpu/libm-test-ulps
@@ -995,7 +995,6 @@ ldouble: 2
 
 Function: "exp2m1":
 double: 1
-float: 1
 ldouble: 1
 
 Function: "exp_downward":
diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
index 0bc61bf3c8..7d303fcb6b 100644
--- a/sysdeps/riscv/rvd/libm-test-ulps
+++ b/sysdeps/riscv/rvd/libm-test-ulps
@@ -1010,22 +1010,18 @@ ldouble: 2
 
 Function: "exp2m1":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 ldouble: 3
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 ldouble: 4
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 ldouble: 5
 
 Function: "exp_downward":
diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
index 860479f3ff..aa7a94a2be 100644
--- a/sysdeps/s390/fpu/libm-test-ulps
+++ b/sysdeps/s390/fpu/libm-test-ulps
@@ -1011,22 +1011,18 @@ ldouble: 2
 
 Function: "exp2m1":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 ldouble: 3
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 ldouble: 4
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 ldouble: 5
 
 Function: "exp_downward":
diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
index 4d8064b543..e7b3da6f1c 100644
--- a/sysdeps/sparc/fpu/libm-test-ulps
+++ b/sysdeps/sparc/fpu/libm-test-ulps
@@ -1014,22 +1014,18 @@ ldouble: 2
 
 Function: "exp2m1":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 ldouble: 3
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 ldouble: 4
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 ldouble: 5
 
 Function: "exp_downward":
diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
index 3f438c2090..71697e99e0 100644
--- a/sysdeps/x86_64/fpu/libm-test-ulps
+++ b/sysdeps/x86_64/fpu/libm-test-ulps
@@ -1495,25 +1495,21 @@ float: 1
 
 Function: "exp2m1":
 double: 2
-float: 2
 float128: 2
 ldouble: 3
 
 Function: "exp2m1_downward":
 double: 3
-float: 3
 float128: 3
 ldouble: 6
 
 Function: "exp2m1_towardzero":
 double: 3
-float: 2
 float128: 4
 ldouble: 5
 
 Function: "exp2m1_upward":
 double: 3
-float: 3
 float128: 5
 ldouble: 6
 
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 11/17] math: Use expm1f from CORE-MATH
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (9 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 10/17] math: Use exp2m1f " Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-30 19:27   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 12/17] math: Use log10f " Adhemerval Zanella
                   ` (6 subsequent siblings)
  17 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

The CORE-MATH implementation is correctly rounded (for any rounding mode)
and shows better performance compared to the generic expm1f.

The code was adapted to glibc style and to use the definition of
math_config.h (to handle errno, overflow, and underflow).

Benchtest on x64_64 (Ryzen 9 5900X, gcc 14.2.1), aarch64 (Neoverse-N1,
gcc 13.3.1), and powerpc (POWER10, gcc 13.2.1):

Latency                      master        patched   improvement
x86_64                      96.7402        36.4026        62.37%
x86_64v2                    97.5391        33.4625        65.69%
x86_64v3                    82.1778        30.8668        62.44%
i686                         120.58        94.8302        21.35%
aarch64                     32.3558        12.8881        60.17%
power10                     23.5087        9.8574         58.07%
powerpc                     23.4776        9.06325        61.40%

reciprocal-throughput        master        patched   improvement
x86_64                      27.8224        15.9255        42.76%
x86_64v2                    27.8364        9.6438         65.36%
x86_64v3                    20.3227        9.6146         52.69%
i686                        63.5629        59.4718         6.44%
aarch64                     17.4838        7.1082         59.34%
power10                     12.4644        8.7829         29.54%
powerpc                     14.2152        5.94765        58.16%

Signed-off-by: Alexei Sibidanov <sibid@uvic.ca>
Signed-off-by: Paul Zimmermann <Paul.Zimmermann@inria.fr>
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
 SHARED-FILES                                  |   4 +
 sysdeps/aarch64/libm-test-ulps                |   5 +-
 sysdeps/alpha/fpu/libm-test-ulps              |   4 -
 sysdeps/arc/fpu/libm-test-ulps                |   4 -
 sysdeps/arc/nofpu/libm-test-ulps              |   1 -
 sysdeps/arm/libm-test-ulps                    |   7 +-
 sysdeps/csky/fpu/libm-test-ulps               |   4 -
 sysdeps/csky/nofpu/libm-test-ulps             |   4 -
 sysdeps/hppa/fpu/libm-test-ulps               |   4 -
 sysdeps/i386/fpu/libm-test-ulps               |   3 -
 sysdeps/i386/fpu/s_expm1f.S                   | 112 ---------
 .../i386/i686/fpu/multiarch/libm-test-ulps    |   3 -
 sysdeps/ieee754/flt-32/s_expm1f.c             | 232 +++++++++---------
 sysdeps/loongarch/lp64/libm-test-ulps         |   4 -
 sysdeps/microblaze/libm-test-ulps             |   1 -
 sysdeps/mips/mips32/libm-test-ulps            |   4 -
 sysdeps/mips/mips64/libm-test-ulps            |   4 -
 sysdeps/nios2/libm-test-ulps                  |   1 -
 sysdeps/or1k/fpu/libm-test-ulps               |   4 -
 sysdeps/or1k/nofpu/libm-test-ulps             |   4 -
 sysdeps/powerpc/fpu/libm-test-ulps            |   5 +-
 sysdeps/powerpc/nofpu/libm-test-ulps          |   4 -
 sysdeps/riscv/nofpu/libm-test-ulps            |   4 -
 sysdeps/riscv/rvd/libm-test-ulps              |   4 -
 sysdeps/s390/fpu/libm-test-ulps               |   4 -
 sysdeps/sh/libm-test-ulps                     |   2 -
 sysdeps/sparc/fpu/libm-test-ulps              |   4 -
 sysdeps/x86_64/fpu/libm-test-ulps             |   5 +-
 28 files changed, 122 insertions(+), 319 deletions(-)
 delete mode 100644 sysdeps/i386/fpu/s_expm1f.S

diff --git a/SHARED-FILES b/SHARED-FILES
index 5e771cd1c4..a559e97318 100644
--- a/SHARED-FILES
+++ b/SHARED-FILES
@@ -239,3 +239,7 @@ sysdeps/ieee754/flt-32/s_exp2m1f.c
   (file src/binary32/exp2m1/exp2m1f.c in CORE_MATH)
   - The code was adapted to use glibc code style and internal
     functions to handle errno, overflow, and underflow.
+sysdeps/ieee754/flt-32/s_expm1f.c
+  (file src/binary32/expm1/expm1f.c in CORE_MATH)
+  - The code was adapted to use glibc code style and internal
+    functions to handle errno, overflow, and underflow.
diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
index 29ccd1dfe9..c6c40df9fa 100644
--- a/sysdeps/aarch64/libm-test-ulps
+++ b/sysdeps/aarch64/libm-test-ulps
@@ -801,6 +801,7 @@ float: 1
 ldouble: 1
 
 Function: Imaginary part of "csin":
+float: 1
 ldouble: 1
 
 Function: Real part of "csin_downward":
@@ -1163,7 +1164,6 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_advsimd":
@@ -1172,7 +1172,6 @@ float: 1
 
 Function: "expm1_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_sve":
@@ -1181,12 +1180,10 @@ float: 1
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 ldouble: 4
 
 Function: "expm1_upward":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "gamma":
diff --git a/sysdeps/alpha/fpu/libm-test-ulps b/sysdeps/alpha/fpu/libm-test-ulps
index 5c6175406b..09185dd902 100644
--- a/sysdeps/alpha/fpu/libm-test-ulps
+++ b/sysdeps/alpha/fpu/libm-test-ulps
@@ -1034,22 +1034,18 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 ldouble: 4
 
 Function: "expm1_upward":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "gamma":
diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps
index fd6d4181f8..ca01eb3b4b 100644
--- a/sysdeps/arc/fpu/libm-test-ulps
+++ b/sysdeps/arc/fpu/libm-test-ulps
@@ -842,19 +842,15 @@ float: 2
 
 Function: "expm1":
 double: 2
-float: 2
 
 Function: "expm1_downward":
 double: 1
-float: 1
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 
 Function: "expm1_upward":
 double: 2
-float: 2
 
 Function: "gamma":
 double: 7
diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
index 574ae8b8be..266381f6ea 100644
--- a/sysdeps/arc/nofpu/libm-test-ulps
+++ b/sysdeps/arc/nofpu/libm-test-ulps
@@ -203,7 +203,6 @@ double: 2
 
 Function: "expm1":
 double: 1
-float: 1
 
 Function: "gamma":
 double: 4
diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
index 28718c7d2c..12451d24a7 100644
--- a/sysdeps/arm/libm-test-ulps
+++ b/sysdeps/arm/libm-test-ulps
@@ -574,6 +574,9 @@ Function: Real part of "csin":
 double: 1
 float: 1
 
+Function: Imaginary part of "csin":
+float: 1
+
 Function: Real part of "csin_downward":
 double: 3
 float: 3
@@ -831,19 +834,15 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 
 Function: "expm1_downward":
 double: 1
-float: 1
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 
 Function: "expm1_upward":
 double: 1
-float: 1
 
 Function: "gamma":
 double: 4
diff --git a/sysdeps/csky/fpu/libm-test-ulps b/sysdeps/csky/fpu/libm-test-ulps
index 151df00638..3f17778d03 100644
--- a/sysdeps/csky/fpu/libm-test-ulps
+++ b/sysdeps/csky/fpu/libm-test-ulps
@@ -799,19 +799,15 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 
 Function: "expm1_downward":
 double: 1
-float: 1
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 
 Function: "expm1_upward":
 double: 1
-float: 1
 
 Function: "gamma":
 double: 4
diff --git a/sysdeps/csky/nofpu/libm-test-ulps b/sysdeps/csky/nofpu/libm-test-ulps
index 48697a7b09..fdef935578 100644
--- a/sysdeps/csky/nofpu/libm-test-ulps
+++ b/sysdeps/csky/nofpu/libm-test-ulps
@@ -797,19 +797,15 @@ double: 1
 
 Function: "expm1":
 double: 1
-float: 1
 
 Function: "expm1_downward":
 double: 1
-float: 1
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 
 Function: "expm1_upward":
 double: 1
-float: 1
 
 Function: "gamma":
 double: 4
diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
index 338ca77ade..05ad1cf9b3 100644
--- a/sysdeps/hppa/fpu/libm-test-ulps
+++ b/sysdeps/hppa/fpu/libm-test-ulps
@@ -850,20 +850,16 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 ldouble: 1
 
 Function: "expm1_downward":
 double: 1
-float: 1
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 
 Function: "expm1_upward":
 double: 1
-float: 1
 
 Function: "gamma":
 double: 4
diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
index 98a5a538ff..abf9a9192b 100644
--- a/sysdeps/i386/fpu/libm-test-ulps
+++ b/sysdeps/i386/fpu/libm-test-ulps
@@ -1234,19 +1234,16 @@ ldouble: 3
 
 Function: "expm1_downward":
 double: 1
-float: 1
 float128: 2
 ldouble: 4
 
 Function: "expm1_towardzero":
 double: 1
-float: 1
 float128: 4
 ldouble: 4
 
 Function: "expm1_upward":
 double: 1
-float: 1
 float128: 3
 ldouble: 4
 
diff --git a/sysdeps/i386/fpu/s_expm1f.S b/sysdeps/i386/fpu/s_expm1f.S
deleted file mode 100644
index a1cb5bf0ab..0000000000
--- a/sysdeps/i386/fpu/s_expm1f.S
+++ /dev/null
@@ -1,112 +0,0 @@
-/* ix87 specific implementation of exp(x)-1.
-   Copyright (C) 1996-2024 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <https://www.gnu.org/licenses/>.  */
-
-	/* Using: e^x - 1 = 2^(x * log2(e)) - 1 */
-
-#include <sysdep.h>
-#include <machine/asm.h>
-#include <i386-math-asm.h>
-#include <libm-alias-float.h>
-
-	.section .rodata
-
-	.align ALIGNARG(4)
-	.type minus1,@object
-minus1:	.double -1.0
-	ASM_SIZE_DIRECTIVE(minus1)
-	.type one,@object
-one:	.double 1.0
-	ASM_SIZE_DIRECTIVE(one)
-	.type l2e,@object
-l2e:	.quad  0xb8aa3b295c17f0bc  /* 1.442695040888963407359924681002  */
-	.short 0x3fff
-	ASM_SIZE_DIRECTIVE(l2e)
-
-DEFINE_FLT_MIN
-
-#ifdef PIC
-#define MO(op) op##@GOTOFF(%edx)
-#else
-#define MO(op) op
-#endif
-
-	.text
-ENTRY(__expm1f)
-	movzwl	4+2(%esp), %eax
-	xorb	$0x80, %ah	// invert sign bit (now 1 is "positive")
-	cmpl	$0xc2b1, %eax	// is num >= 88.5?
-	jae	HIDDEN_JUMPTARGET (__expf)
-
-	flds	4(%esp)		// x
-	fxam			// Is NaN, +-Inf or +-0?
-	xorb	$0x80, %ah
-	cmpl	$0xc190, %eax	// is num <= -18.0?
-	fstsw	%ax
-	movb	$0x45, %ch
-	jb	4f
-
-	// Below -18.0 (may be -NaN or -Inf).
-	andb	%ah, %ch
-#ifdef	PIC
-	LOAD_PIC_REG (dx)
-#endif
-	cmpb	$0x01, %ch
-	je	5f		// If -NaN, jump.
-	jmp	2f		// -large, possibly -Inf.
-
-4:	// In range -18.0 to 88.5 (may be +-0 but not NaN or +-Inf).
-	andb	%ah, %ch
-	cmpb	$0x40, %ch
-	je	3f		// If +-0, jump.
-#ifdef	PIC
-	LOAD_PIC_REG (dx)
-#endif
-
-5:	fldt	MO(l2e)		// log2(e) : x
-	fmulp			// log2(e)*x
-	fld	%st		// log2(e)*x : log2(e)*x
-	// Set round-to-nearest temporarily.
-	subl	$8, %esp
-	cfi_adjust_cfa_offset (8)
-	fstcw	4(%esp)
-	movl	$0xf3ff, %ecx
-	andl	4(%esp), %ecx
-	movl	%ecx, (%esp)
-	fldcw	(%esp)
-	frndint			// int(log2(e)*x) : log2(e)*x
-	fldcw	4(%esp)
-	addl	$8, %esp
-	cfi_adjust_cfa_offset (-8)
-	fsubr	%st, %st(1)	// int(log2(e)*x) : fract(log2(e)*x)
-	fxch			// fract(log2(e)*x) : int(log2(e)*x)
-	f2xm1			// 2^fract(log2(e)*x)-1 : int(log2(e)*x)
-	fscale			// 2^(log2(e)*x)-2^int(log2(e)*x) : int(log2(e)*x)
-	fxch			// int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
-	fldl	MO(one)		// 1 : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
-	fscale			// 2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
-	fsubrl	MO(one)		// 1-2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
-	fstp	%st(1)		// 1-2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x)
-	fsubrp	%st, %st(1)	// 2^(log2(e)*x)
-	FLT_CHECK_FORCE_UFLOW
-	ret
-
-2:	fstp	%st
-	fldl	MO(minus1)	// Set result to -1.0.
-3:	ret
-END(__expm1f)
-libm_alias_float (__expm1, expm1)
diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
index 9afb63bc0f..6d9d49d153 100644
--- a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
+++ b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
@@ -1237,19 +1237,16 @@ ldouble: 3
 
 Function: "expm1_downward":
 double: 1
-float: 1
 float128: 2
 ldouble: 4
 
 Function: "expm1_towardzero":
 double: 1
-float: 1
 float128: 4
 ldouble: 4
 
 Function: "expm1_upward":
 double: 1
-float: 1
 float128: 3
 ldouble: 4
 
diff --git a/sysdeps/ieee754/flt-32/s_expm1f.c b/sysdeps/ieee754/flt-32/s_expm1f.c
index 35f7b5214a..edd7c9acf8 100644
--- a/sysdeps/ieee754/flt-32/s_expm1f.c
+++ b/sysdeps/ieee754/flt-32/s_expm1f.c
@@ -1,132 +1,124 @@
-/* s_expm1f.c -- float version of s_expm1.c.
- */
+/* Correctly-rounded natural exponent function biased by 1 for binary32 value.
 
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
+Copyright (c) 2022-2024 Alexei Sibidanov.
+
+This file is part of the CORE-MATH project
+project (file src/binary32/expm1/expm1f.c, revision bc385c2).
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
 
-#include <errno.h>
-#include <float.h>
 #include <math.h>
-#include <math-barriers.h>
-#include <math_private.h>
 #include <math-underflow.h>
 #include <libm-alias-float.h>
-
-static const float huge = 1.0e+30;
-static const float tiny = 1.0e-30;
-
-static const float
-one		= 1.0,
-o_threshold	= 8.8721679688e+01,/* 0x42b17180 */
-ln2_hi		= 6.9313812256e-01,/* 0x3f317180 */
-ln2_lo		= 9.0580006145e-06,/* 0x3717f7d1 */
-invln2		= 1.4426950216e+00,/* 0x3fb8aa3b */
-	/* scaled coefficients related to expm1 */
-Q1  =  -3.3333335072e-02, /* 0xbd088889 */
-Q2  =   1.5873016091e-03, /* 0x3ad00d01 */
-Q3  =  -7.9365076090e-05, /* 0xb8a670cd */
-Q4  =   4.0082177293e-06, /* 0x36867e54 */
-Q5  =  -2.0109921195e-07; /* 0xb457edbb */
+#include "math_config.h"
 
 float
-__expm1f(float x)
+__expm1f (float x)
 {
-	float y,hi,lo,c,t,e,hxs,hfx,r1;
-	int32_t k,xsb;
-	uint32_t hx;
-
-	GET_FLOAT_WORD(hx,x);
-	xsb = hx&0x80000000;		/* sign bit of x */
-	if(xsb==0) y=x; else y= -x;	/* y = |x| */
-	hx &= 0x7fffffff;		/* high word of |x| */
-
-    /* filter out huge and non-finite argument */
-	if(hx >= 0x4195b844) {			/* if |x|>=27*ln2 */
-	    if(hx >= 0x42b17218) {		/* if |x|>=88.721... */
-		if(hx>0x7f800000)
-		    return x+x;		 /* NaN */
-		if(hx==0x7f800000)
-		    return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */
-		if(x > o_threshold) {
-		  __set_errno (ERANGE);
-		  return huge*huge; /* overflow */
-		}
-	    }
-	    if(xsb!=0) { /* x < -27*ln2, return -1.0 with inexact */
-		math_force_eval(x+tiny);/* raise inexact */
-		return tiny-one;	/* return -1 */
-	    }
-	}
-
-    /* argument reduction */
-	if(hx > 0x3eb17218) {		/* if  |x| > 0.5 ln2 */
-	    if(hx < 0x3F851592) {	/* and |x| < 1.5 ln2 */
-		if(xsb==0)
-		    {hi = x - ln2_hi; lo =  ln2_lo;  k =  1;}
-		else
-		    {hi = x + ln2_hi; lo = -ln2_lo;  k = -1;}
-	    } else {
-		k  = invln2*x+((xsb==0)?(float)0.5:(float)-0.5);
-		t  = k;
-		hi = x - t*ln2_hi;	/* t*ln2_hi is exact here */
-		lo = t*ln2_lo;
-	    }
-	    x  = hi - lo;
-	    c  = (hi-x)-lo;
-	}
-	else if(hx < 0x33000000) {	/* when |x|<2**-25, return x */
-	    math_check_force_underflow (x);
-	    t = huge+x;	/* return x with inexact flags when x!=0 */
-	    return x - (t-(huge+x));
+  static const double c[] =
+    {
+      1, 0x1.62e42fef4c4e7p-6, 0x1.ebfd1b232f475p-13, 0x1.c6b19384ecd93p-20
+    };
+  static const double ch[] =
+    {
+      0x1.62e42fefa39efp-6,  0x1.ebfbdff82c58fp-13, 0x1.c6b08d702e0edp-20,
+      0x1.3b2ab6fb92e5ep-27, 0x1.5d886e6d54203p-35, 0x1.430976b8ce6efp-43
+    };
+  static const double td[] =
+    {
+      0x1p+0,               0x1.059b0d3158574p+0, 0x1.0b5586cf9890fp+0,
+      0x1.11301d0125b51p+0, 0x1.172b83c7d517bp+0, 0x1.1d4873168b9aap+0,
+      0x1.2387a6e756238p+0, 0x1.29e9df51fdee1p+0, 0x1.306fe0a31b715p+0,
+      0x1.371a7373aa9cbp+0, 0x1.3dea64c123422p+0, 0x1.44e086061892dp+0,
+      0x1.4bfdad5362a27p+0, 0x1.5342b569d4f82p+0, 0x1.5ab07dd485429p+0,
+      0x1.6247eb03a5585p+0, 0x1.6a09e667f3bcdp+0, 0x1.71f75e8ec5f74p+0,
+      0x1.7a11473eb0187p+0, 0x1.82589994cce13p+0, 0x1.8ace5422aa0dbp+0,
+      0x1.93737b0cdc5e5p+0, 0x1.9c49182a3f09p+0,  0x1.a5503b23e255dp+0,
+      0x1.ae89f995ad3adp+0, 0x1.b7f76f2fb5e47p+0, 0x1.c199bdd85529cp+0,
+      0x1.cb720dcef9069p+0, 0x1.d5818dcfba487p+0, 0x1.dfc97337b9b5fp+0,
+      0x1.ea4afa2a490dap+0, 0x1.f50765b6e454p+0
+    };
+  const double iln2 = 0x1.71547652b82fep+5;
+  const double big = 0x1.8p52;
+  double z = x;
+  uint32_t ux = asuint (x);
+  uint32_t ax = ux << 1;
+  if (__glibc_likely (ax < 0x7c400000u))
+    { /* |x| < 0.15625  */
+      if (__glibc_unlikely (ax < 0x676a09e8u))
+	{ /* |x| < 0x1.6a09e8p-24 */
+	  if (__glibc_unlikely (ax == 0x0u))
+	    return x; /* x = +-0 */
+	  return fmaf (fabsf (x), 0x1p-25f, x);
 	}
-	else k = 0;
-
-    /* x is now in primary range */
-	hfx = (float)0.5*x;
-	hxs = x*hfx;
-	r1 = one+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5))));
-	t  = (float)3.0-r1*hfx;
-	e  = hxs*((r1-t)/((float)6.0 - x*t));
-	if(k==0) return x - (x*e-hxs);		/* c is 0 */
-	else {
-	    e  = (x*(e-c)-c);
-	    e -= hxs;
-	    if(k== -1) return (float)0.5*(x-e)-(float)0.5;
-	    if(k==1) {
-		if(x < (float)-0.25) return -(float)2.0*(e-(x+(float)0.5));
-		else	      return  one+(float)2.0*(x-e);
-	    }
-	    if (k <= -2 || k>56) {   /* suffice to return exp(x)-1 */
-		int32_t i;
-		y = one-(e-x);
-		GET_FLOAT_WORD(i,y);
-		SET_FLOAT_WORD(y,i+(k<<23));	/* add k to y's exponent */
-		return y-one;
-	    }
-	    t = one;
-	    if(k<23) {
-		int32_t i;
-		SET_FLOAT_WORD(t,0x3f800000 - (0x1000000>>k)); /* t=1-2^-k */
-		y = t-(e-x);
-		GET_FLOAT_WORD(i,y);
-		SET_FLOAT_WORD(y,i+(k<<23));	/* add k to y's exponent */
-	   } else {
-		int32_t i;
-		SET_FLOAT_WORD(t,((0x7f-k)<<23));	/* 2^-k */
-		y = x-(e+t);
-		y += one;
-		GET_FLOAT_WORD(i,y);
-		SET_FLOAT_WORD(y,i+(k<<23));	/* add k to y's exponent */
-	    }
+      static const double b[] =
+	{
+	  0x1.fffffffffffc2p-2,  0x1.55555555555fep-3,  0x1.555555559767fp-5,
+	  0x1.1111111098dc1p-7,  0x1.6c16bca988aa9p-10, 0x1.a01a07658483fp-13,
+	  0x1.a05b04d2c3503p-16, 0x1.71de3a960b5e3p-19
+	};
+      double z2 = z * z, z4 = z2 * z2;
+      double r = z + z2
+	* ((b[0] + z * b[1]) + z2 * (b[2] + z * b[3])
+	   + z4 * ((b[4] + z * b[5]) + z2 * (b[6] + z * b[7])));
+      return r;
+    }
+  if (__glibc_unlikely (ax >= 0x8562e430u))
+    { /* |x| > 88.72 */
+      if (ax > (0xffu << 24))
+	return x + x; /* nan */
+      if (__glibc_unlikely (ux >> 31))
+	{ /* x < 0 */
+	  if (ax == (0xffu << 24))
+	    return -1.0f;
+	  return -1.0f + 0x1p-26f;
 	}
-	return y;
+      if (ax == (0xffu << 24))
+	return INFINITY;
+      return __math_oflowf (0);
+    }
+  double a = iln2 * z;
+  double ia = roundeven (a);
+  double h = a - ia;
+  double h2 = h * h;
+  uint64_t u = asuint64 (ia + big);
+  double c2 = c[2] + h * c[3], c0 = c[0] + h * c[1];
+  const uint64_t *tdl = (uint64_t *) ((void *) td);
+  double sv = asdouble (tdl[u & 0x1f] + ((u >> 5) << 52));
+  double r = (c0 + h2 * c2) * sv - 1.0;
+  float ub = r, lb = r - sv * 0x1.3b3p-33;
+  if (__glibc_unlikely (ub != lb))
+    {
+      if (__glibc_unlikely (ux > 0xc18aa123u)) /* x < -17.32 */
+	return -1.0f + 0x1p-26f;
+      const double iln2h = 0x1.7154765p+5;
+      const double iln2l = 0x1.5c17f0bbbe88p-26;
+      double s = sv;
+      h = (iln2h * z - ia) + iln2l * z;
+      h2 = h * h;
+      double w = s * h;
+      r = (s - 1) + w
+	* ((ch[0] + h * ch[1])
+	   + h2 * ((ch[2] + h * ch[3]) + h2 * (ch[4] + h * ch[5])));
+      ub = r;
+    }
+  return ub;
 }
 libm_alias_float (__expm1, expm1)
diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
index c6fc9fd4ed..5d407a49fe 100644
--- a/sysdeps/loongarch/lp64/libm-test-ulps
+++ b/sysdeps/loongarch/lp64/libm-test-ulps
@@ -1038,22 +1038,18 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 ldouble: 4
 
 Function: "expm1_upward":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "gamma":
diff --git a/sysdeps/microblaze/libm-test-ulps b/sysdeps/microblaze/libm-test-ulps
index 98ea940ccc..a84494b8f8 100644
--- a/sysdeps/microblaze/libm-test-ulps
+++ b/sysdeps/microblaze/libm-test-ulps
@@ -191,7 +191,6 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 
 Function: "gamma":
 double: 4
diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
index d8daca6326..f9d7bf8598 100644
--- a/sysdeps/mips/mips32/libm-test-ulps
+++ b/sysdeps/mips/mips32/libm-test-ulps
@@ -831,19 +831,15 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 
 Function: "expm1_downward":
 double: 1
-float: 1
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 
 Function: "expm1_upward":
 double: 1
-float: 1
 
 Function: "gamma":
 double: 4
diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
index 39e94d5480..4f3c82d64c 100644
--- a/sysdeps/mips/mips64/libm-test-ulps
+++ b/sysdeps/mips/mips64/libm-test-ulps
@@ -1042,22 +1042,18 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 ldouble: 4
 
 Function: "expm1_upward":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "gamma":
diff --git a/sysdeps/nios2/libm-test-ulps b/sysdeps/nios2/libm-test-ulps
index df6e932cb6..33f714e713 100644
--- a/sysdeps/nios2/libm-test-ulps
+++ b/sysdeps/nios2/libm-test-ulps
@@ -197,7 +197,6 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 
 Function: "gamma":
 double: 4
diff --git a/sysdeps/or1k/fpu/libm-test-ulps b/sysdeps/or1k/fpu/libm-test-ulps
index 4ccb136298..9ced4b0052 100644
--- a/sysdeps/or1k/fpu/libm-test-ulps
+++ b/sysdeps/or1k/fpu/libm-test-ulps
@@ -804,19 +804,15 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 
 Function: "expm1_downward":
 double: 1
-float: 1
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 
 Function: "expm1_upward":
 double: 1
-float: 1
 
 Function: "gamma":
 double: 4
diff --git a/sysdeps/or1k/nofpu/libm-test-ulps b/sysdeps/or1k/nofpu/libm-test-ulps
index 7087cf9add..6862551b79 100644
--- a/sysdeps/or1k/nofpu/libm-test-ulps
+++ b/sysdeps/or1k/nofpu/libm-test-ulps
@@ -802,19 +802,15 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 
 Function: "expm1_downward":
 double: 1
-float: 1
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 
 Function: "expm1_upward":
 double: 1
-float: 1
 
 Function: "gamma":
 double: 4
diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
index dd25aaf94a..ddbd184e58 100644
--- a/sysdeps/powerpc/fpu/libm-test-ulps
+++ b/sysdeps/powerpc/fpu/libm-test-ulps
@@ -870,6 +870,7 @@ float128: 1
 ldouble: 2
 
 Function: Imaginary part of "csin":
+float: 1
 float128: 1
 ldouble: 1
 
@@ -1262,25 +1263,21 @@ ldouble: 1
 
 Function: "expm1":
 double: 1
-float: 1
 float128: 2
 ldouble: 1
 
 Function: "expm1_downward":
 double: 1
-float: 1
 float128: 2
 ldouble: 7
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 float128: 4
 ldouble: 6
 
 Function: "expm1_upward":
 double: 1
-float: 1
 float128: 3
 ldouble: 6
 
diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
index 1e5bae039b..c79dfcc2cc 100644
--- a/sysdeps/powerpc/nofpu/libm-test-ulps
+++ b/sysdeps/powerpc/nofpu/libm-test-ulps
@@ -1054,22 +1054,18 @@ ldouble: 1
 
 Function: "expm1":
 double: 1
-float: 1
 ldouble: 1
 
 Function: "expm1_downward":
 double: 1
-float: 1
 ldouble: 5
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 ldouble: 5
 
 Function: "expm1_upward":
 double: 1
-float: 1
 ldouble: 6
 
 Function: "fma":
diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
index 11f891988e..4caf84f316 100644
--- a/sysdeps/riscv/nofpu/libm-test-ulps
+++ b/sysdeps/riscv/nofpu/libm-test-ulps
@@ -1011,22 +1011,18 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 ldouble: 4
 
 Function: "expm1_upward":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "gamma":
diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
index 7d303fcb6b..e9c4b72c04 100644
--- a/sysdeps/riscv/rvd/libm-test-ulps
+++ b/sysdeps/riscv/rvd/libm-test-ulps
@@ -1038,22 +1038,18 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 ldouble: 4
 
 Function: "expm1_upward":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "gamma":
diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
index aa7a94a2be..a42c9f273a 100644
--- a/sysdeps/s390/fpu/libm-test-ulps
+++ b/sysdeps/s390/fpu/libm-test-ulps
@@ -1039,22 +1039,18 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 ldouble: 4
 
 Function: "expm1_upward":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "gamma":
diff --git a/sysdeps/sh/libm-test-ulps b/sysdeps/sh/libm-test-ulps
index 36f21ed395..fc4556e977 100644
--- a/sysdeps/sh/libm-test-ulps
+++ b/sysdeps/sh/libm-test-ulps
@@ -394,11 +394,9 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 
 Function: "fma_towardzero":
 double: 1
diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
index e7b3da6f1c..3bee496247 100644
--- a/sysdeps/sparc/fpu/libm-test-ulps
+++ b/sysdeps/sparc/fpu/libm-test-ulps
@@ -1042,22 +1042,18 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_downward":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 ldouble: 4
 
 Function: "expm1_upward":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "gamma":
diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
index 71697e99e0..ffb1d4f3c9 100644
--- a/sysdeps/x86_64/fpu/libm-test-ulps
+++ b/sysdeps/x86_64/fpu/libm-test-ulps
@@ -1062,6 +1062,7 @@ float128: 1
 ldouble: 1
 
 Function: Imaginary part of "csin":
+float: 1
 float128: 1
 
 Function: Real part of "csin_downward":
@@ -1550,25 +1551,21 @@ float: 1
 
 Function: "expm1":
 double: 1
-float: 1
 float128: 2
 ldouble: 3
 
 Function: "expm1_downward":
 double: 1
-float: 1
 float128: 2
 ldouble: 4
 
 Function: "expm1_towardzero":
 double: 1
-float: 2
 float128: 4
 ldouble: 4
 
 Function: "expm1_upward":
 double: 1
-float: 1
 float128: 3
 ldouble: 4
 
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 12/17] math: Use log10f from CORE-MATH
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (10 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 11/17] math: Use expm1f " Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-31 20:42   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 13/17] math: Use log2p1f " Adhemerval Zanella
                   ` (5 subsequent siblings)
  17 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=UTF-8, Size: 12012 bytes --]

The CORE-MATH implementation is correctly rounded (for any rounding mode)
and shows better performance compared to the generic log10f.

The code was adapted to glibc style and to use the definition of
math_config.h (to handle errno, overflow, and underflow).

Benchtest on x64_64 (Ryzen 9 5900X, gcc 14.2.1), aarch64 (Neoverse-N1,
gcc 13.3.1), and powerpc (POWER10, gcc 13.2.1):

Latency                      master        patched   improvement
x86_64                      49.9017        33.5143        32.84%
x86_64v2                    50.4878        33.5623        33.52%
x86_64v3                    50.0991        27.6078        44.89%
i686                        140.874        106.086        24.69%
aarch64                     19.2846        11.3573        41.11%
power10                     14.0994        7.7739        44.86%
powerpc                     14.2898        7.92497        44.54%

reciprocal-throughput        master        patched   improvement
x86_64                      17.8336        12.9074        27.62%
x86_64v2                    16.4418        11.3220        31.14%
x86_64v3                    15.6002        10.5158        32.59%
i686                        66.0678        80.2287        -21.43%
aarch64                      9.4906        6.8393        27.94%
power10                      7.5255        5.5084        26.80%
powerpc                      9.5204        6.98055        26.68%

The performance decrease for i686 is mostly due the use of x87 fpu,
when building with '-msse2 -mfpmath=sse':

                             master        patched   improvement
latency                     140.874        77.1137        45.26%
reciprocal-throughput        64.481        56.4397        12.47%

Signed-off-by: Alexei Sibidanov <sibid@uvic.ca>
Signed-off-by: Paul Zimmermann <Paul.Zimmermann@inria.fr>
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
 sysdeps/i386/fpu/e_log10f.S       |  66 ----------
 sysdeps/ieee754/flt-32/e_log10f.c | 196 +++++++++++++++++++++++-------
 2 files changed, 152 insertions(+), 110 deletions(-)
 delete mode 100644 sysdeps/i386/fpu/e_log10f.S

diff --git a/sysdeps/i386/fpu/e_log10f.S b/sysdeps/i386/fpu/e_log10f.S
deleted file mode 100644
index 47f82e1993..0000000000
--- a/sysdeps/i386/fpu/e_log10f.S
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Public domain.
- */
-
-#include <machine/asm.h>
-#include <libm-alias-finite.h>
-
-	.section .rodata.cst8,"aM",@progbits,8
-
-	.p2align 3
-	.type one,@object
-one:	.double 1.0
-	ASM_SIZE_DIRECTIVE(one)
-	/* It is not important that this constant is precise.  It is only
-	   a value which is known to be on the safe side for using the
-	   fyl2xp1 instruction.  */
-	.type limit,@object
-limit:	.double 0.29
-	ASM_SIZE_DIRECTIVE(limit)
-
-
-#ifdef PIC
-# define MO(op) op##@GOTOFF(%edx)
-#else
-# define MO(op) op
-#endif
-
-	.text
-ENTRY(__ieee754_log10f)
-	fldlg2			// log10(2)
-	flds	4(%esp)		// x : log10(2)
-#ifdef PIC
-	LOAD_PIC_REG (dx)
-#endif
-	fxam
-	fnstsw
-	fld	%st		// x : x : log10(2)
-	sahf
-	jc	3f		// in case x is NaN or ±Inf
-4:	fsubl	MO(one)		// x-1 : x : log10(2)
-	fld	%st		// x-1 : x-1 : x : log10(2)
-	fabs			// |x-1| : x-1 : x : log10(2)
-	fcompl	MO(limit)	// x-1 : x : log10(2)
-	fnstsw			// x-1 : x : log10(2)
-	andb	$0x45, %ah
-	jz	2f
-	fxam
-	fnstsw
-	andb	$0x45, %ah
-	cmpb	$0x40, %ah
-	jne	5f
-	fabs			// log10(1) is +0 in all rounding modes.
-5:	fstp	%st(1)		// x-1 : log10(2)
-	fyl2xp1			// log10(x)
-	ret
-
-2:	fstp	%st(0)		// x : log10(2)
-	fyl2x			// log10(x)
-	ret
-
-3:	jp	4b		// in case x is ±Inf
-	fstp	%st(1)
-	fstp	%st(1)
-	ret
-END (__ieee754_log10f)
-libm_alias_finite (__ieee754_log10f, __log10f)
diff --git a/sysdeps/ieee754/flt-32/e_log10f.c b/sysdeps/ieee754/flt-32/e_log10f.c
index 791895e042..8620805634 100644
--- a/sysdeps/ieee754/flt-32/e_log10f.c
+++ b/sysdeps/ieee754/flt-32/e_log10f.c
@@ -1,54 +1,162 @@
-/* e_log10f.c -- float version of e_log10.c.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
+/* Correctly-rounded radix-10 logarithm function for binary32 value.
+
+Copyright (c) 2022-2023 Alexei Sibidanov.
+
+This file is part of the CORE-MATH project
+project (file src/binary32/expm1/expm1f.c, revision bc385c2).
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
 
 #include <math.h>
-#include <math_private.h>
-#include <fix-int-fp-convert-zero.h>
+#include <stdint.h>
 #include <libm-alias-finite.h>
+#include "math_config.h"
 
-static const float
-two25      =  3.3554432000e+07, /* 0x4c000000 */
-ivln10     =  4.3429449201e-01, /* 0x3ede5bd9 */
-log10_2hi  =  3.0102920532e-01, /* 0x3e9a2080 */
-log10_2lo  =  7.9034151668e-07; /* 0x355427db */
+static __attribute__ ((noinline)) float
+as_special (float x)
+{
+  uint32_t ux = asuint (x);
+  if (ux == 0x7f800000u)
+    return x; /* +inf */
+  uint32_t ax = ux << 1;
+  if (ax == 0u)
+    { /* -0.0 */
+      __math_divzerof (1);
+    }
+  if (ax > 0xff000000u)
+    return x + x; /* nan */
+  return __math_invalidf (x);
+}
 
 float
-__ieee754_log10f(float x)
+__ieee754_log10f (float x)
 {
-	float y,z;
-	int32_t i,k,hx;
-
-	GET_FLOAT_WORD(hx,x);
-
-	k=0;
-	if (hx < 0x00800000) {			/* x < 2**-126  */
-	    if (__builtin_expect((hx&0x7fffffff)==0, 0))
-	      return -two25/fabsf (x);	/* log(+-0)=-inf  */
-	    if (__builtin_expect(hx<0, 0))
-		return (x-x)/(x-x);	/* log(-#) = NaN */
-	    k -= 25; x *= two25; /* subnormal number, scale up x */
-	    GET_FLOAT_WORD(hx,x);
+  static const double tr[] =
+    {
+      0x1p+0,         0x1.f81f82p-1,  0x1.f07c1fp-1,  0x1.e9131acp-1,
+      0x1.e1e1e1ep-1, 0x1.dae6077p-1, 0x1.d41d41dp-1, 0x1.cd85689p-1,
+      0x1.c71c71cp-1, 0x1.c0e0704p-1, 0x1.bacf915p-1, 0x1.b4e81b5p-1,
+      0x1.af286bdp-1, 0x1.a98ef6p-1,  0x1.a41a41ap-1, 0x1.9ec8e95p-1,
+      0x1.999999ap-1, 0x1.948b0fdp-1, 0x1.8f9c19p-1,  0x1.8acb90fp-1,
+      0x1.8618618p-1, 0x1.8181818p-1, 0x1.7d05f41p-1, 0x1.78a4c81p-1,
+      0x1.745d174p-1, 0x1.702e05cp-1, 0x1.6c16c17p-1, 0x1.6816817p-1,
+      0x1.642c859p-1, 0x1.605816p-1,  0x1.5c9882cp-1, 0x1.58ed231p-1,
+      0x1.5555555p-1, 0x1.51d07ebp-1, 0x1.4e5e0a7p-1, 0x1.4afd6ap-1,
+      0x1.47ae148p-1, 0x1.446f865p-1, 0x1.4141414p-1, 0x1.3e22cbdp-1,
+      0x1.3b13b14p-1, 0x1.3813814p-1, 0x1.3521cfbp-1, 0x1.323e34ap-1,
+      0x1.2f684bep-1, 0x1.2c9fb4ep-1, 0x1.29e412ap-1, 0x1.27350b9p-1,
+      0x1.2492492p-1, 0x1.21fb781p-1, 0x1.1f7047ep-1, 0x1.1cf06aep-1,
+      0x1.1a7b961p-1, 0x1.1811812p-1, 0x1.15b1e5fp-1, 0x1.135c811p-1,
+      0x1.1111111p-1, 0x1.0ecf56cp-1, 0x1.0c9715p-1,  0x1.0a6810ap-1,
+      0x1.0842108p-1, 0x1.0624dd3p-1, 0x1.041041p-1,  0x1.0204081p-1,
+      0.5
+    };
+  static const double tl[] =
+    {
+      -0x1.d45fd6237ebe3p-47, 0x1.b947689311b6ep-8, 0x1.b5e909c96d7d5p-7,
+      0x1.45f4f59ed2165p-6,   0x1.af5f92cbd8f1ep-6, 0x1.0ba01a606de8cp-5,
+      0x1.3ed119b9a2b7bp-5,   0x1.714834298eec2p-5, 0x1.a30a9d98357fbp-5,
+      0x1.d41d512670813p-5,   0x1.02428c0f65519p-4, 0x1.1a23444eecc3ep-4,
+      0x1.31b30543f4cb4p-4,   0x1.48f3ed39bfd04p-4, 0x1.5fe8049a0e423p-4,
+      0x1.769140a6aa008p-4,   0x1.8cf1836c98cb3p-4, 0x1.a30a9d55541a1p-4,
+      0x1.b8de4d1ee823ep-4,   0x1.ce6e4202ca2e6p-4, 0x1.e3bc1accace07p-4,
+      0x1.f8c9683b5abd4p-4,   0x1.06cbd68ca9a6ep-3, 0x1.11142f19df73p-3,
+      0x1.1b3e71fa7a97fp-3,   0x1.254b4d37a46e3p-3, 0x1.2f3b6912cbf07p-3,
+      0x1.390f683115886p-3,   0x1.42c7e7fffc5a8p-3, 0x1.4c65808c78d3cp-3,
+      0x1.55e8c50751c55p-3,   0x1.5f52445dec3d8p-3, 0x1.68a288c3f12p-3,
+      0x1.71da17bdf0d19p-3,   0x1.7af973608afd9p-3, 0x1.84011952a2579p-3,
+      0x1.8cf1837a7ea6p-3,    0x1.95cb2891e43d6p-3, 0x1.9e8e7b0f869ep-3,
+      0x1.a73beaa5db18dp-3,   0x1.afd3e394558d3p-3, 0x1.b856cf060d9f1p-3,
+      0x1.c0c5134de1ffcp-3,   0x1.c91f1371bc99fp-3, 0x1.d1652ffcd3f53p-3,
+      0x1.d997c6f635e75p-3,   0x1.e1b733ab90f3bp-3, 0x1.e9c3ceadac856p-3,
+      0x1.f1bdeec43a305p-3,   0x1.f9a5e7a5fa3fep-3, 0x1.00be05ac02f2bp-2,
+      0x1.04a054d81a2d4p-2,   0x1.087a0835957fbp-2, 0x1.0c4b457099517p-2,
+      0x1.101431aa1fe51p-2,   0x1.13d4f08b98dd8p-2, 0x1.178da53edb892p-2,
+      0x1.1b3e71e9f9d58p-2,   0x1.1ee777defdeedp-2, 0x1.2288d7b48e23bp-2,
+      0x1.2622b0f52e49fp-2,   0x1.29b522a4c6314p-2, 0x1.2d404b0e30f8p-2,
+      0x1.30c4478f3fbe5p-2,   0x1.34413509f7915p-2
+    };
+  static const union
+  {
+    float f;
+    uint32_t u;
+  } st[] =
+  {
+    { 0x1p+0 },        { 0x1.4p+3 },      { 0x1.9p+6 },       { 0x1.f4p+9 },
+    { 0x1.388p+13 },   { 0x1.86ap+16 },   { 0x1.e848p+19 },   { 0x1.312dp+23 },
+    { 0x1.7d784p+26 }, { 0x1.dcd65p+29 }, { 0x1.2a05f2p+33 }, { 0 },
+    { 0 },             { 0 },             { 0 },              { 0 }
+  };
+  static const double b[] =
+    { 
+      0x1.bcb7b15c5a2f8p-2, -0x1.bcbb1dbb88ebap-3, 0x1.2871c39d521c6p-3
+    };
+  static const double c[] =
+    {
+      0x1.bcb7b1526e50ep-2,  -0x1.bcb7b1526e53dp-3, 0x1.287a7636f3fa2p-3,
+      -0x1.bcb7b146a14b3p-4, 0x1.63c627d5219cbp-4,  -0x1.2880736c8762dp-4,
+      0x1.fc1ecf913961ap-5
+    };
+  uint32_t ux = asuint (x);
+  if (__glibc_unlikely (ux < (1 << 23) || ux >= 0x7f800000u))
+    {
+      if (ux == 0 || ux >= 0x7f800000u)
+	return as_special (x);
+      /* subnormal */
+      int n = __builtin_clz (ux) - 8;
+      ux <<= n;
+      ux -= n << 23;
+    }
+  unsigned m = ux & ((1 << 23) - 1), j = (m + (1 << (23 - 7))) >> (23 - 6);
+  double ix = tr[j], l = tl[j];
+  int e = ((int) ux >> 23) - 127;
+  unsigned je = e + 1;
+  je = (je * 0x4d104d4) >> 28;
+  if (__glibc_unlikely (ux == st[je].u))
+    return je;
+
+  double tz = asdouble (((int64_t) m | ((int64_t) 1023 << 23)) << (52 - 23));
+  double z = tz * ix - 1, z2 = z * z;
+  double r
+      = ((e * 0x1.34413509f79ffp-2 + l) + z * b[0]) + z2 * (b[1] + z * b[2]);
+  float ub = r, lb = r + 0x1.b008p-34;
+  if (__glibc_unlikely (ub != lb))
+    {
+      double f = z
+		 * ((c[0] + z * c[1])
+		    + z2
+			  * ((c[2] + z * c[3])
+			     + z2 * (c[4] + z * c[5] + z2 * c[6])));
+      f -= 0x1.0cee0ed4ca7e9p-54 * e;
+      f += l - tl[0];
+      double el = e * 0x1.34413509f7ap-2;
+      r = el + f;
+      ub = r;
+      tz = r;
+      if (__glibc_unlikely (!((asuint64 (tz) & ((1 << 28) - 1)))))
+	{
+	  double dr = (el - r) + f;
+	  r += dr * 32;
+	  ub = r;
 	}
-	if (__builtin_expect(hx >= 0x7f800000, 0)) return x+x;
-	k += (hx>>23)-127;
-	i  = ((uint32_t)k&0x80000000)>>31;
-	hx = (hx&0x007fffff)|((0x7f-i)<<23);
-	y  = (float)(k+i);
-	if (FIX_INT_FP_CONVERT_ZERO && y == 0.0f)
-	  y = 0.0f;
-	SET_FLOAT_WORD(x,hx);
-	z  = y*log10_2lo + ivln10*__ieee754_logf(x);
-	return  z+y*log10_2hi;
+    }
+  return ub;
 }
 libm_alias_finite (__ieee754_log10f, __log10f)
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 13/17] math: Use log2p1f from CORE-MATH
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (11 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 12/17] math: Use log10f " Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-30 19:36   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 14/17] math: Use log1pf " Adhemerval Zanella
                   ` (4 subsequent siblings)
  17 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

The CORE-MATH implementation is correctly rounded (for any rounding mode)
and shows better performance compared to the generic log2p1f.

The code was adapted to glibc style and to use the definition of
math_config.h (to handle errno, overflow, and underflow).

Benchtest on x64_64 (Ryzen 9 5900X, gcc 14.2.1), aarch64 (Neoverse-N1,
gcc 13.3.1), and powerpc (POWER10, gcc 13.2.1):

Latency                      master        patched   improvement
x86_64                      70.1462        47.0090        32.98%
x86_64v2                    70.2513        47.6160        32.22%
x86_64v3                    60.4840        39.9443        33.96%
i686                        164.068        122.909        25.09%
aarch64                     25.9169        16.9207        34.71%
power10                     18.1261        9.8592         45.61%
powerpc                     17.2683        9.38665        45.64%

reciprocal-throughput        master        patched   improvement
x86_64                      26.2240        16.4082        37.43%
x86_64v2                    25.0911        15.7480        37.24%
x86_64v3                    20.9371        11.7264        43.99%
i686                        90.4209        95.3073        -5.40%
aarch64                     16.8537        8.9561         46.86%
power10                     12.9401        6.5555         49.34%
powerpc                     9.01763        7.54745        16.30%

The performance decrease for i686 is mostly due the use of x87 fpu,
when building with '-msse2 -mfpmath=sse:

                             master        patched   improvement
latency                     164.068        102.982        37.23%
reciprocal-throughput       89.1968        82.5117         7.49%

Signed-off-by: Alexei Sibidanov <sibid@uvic.ca>
Signed-off-by: Paul Zimmermann <Paul.Zimmermann@inria.fr>
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
 SHARED-FILES                                  |   4 +
 sysdeps/aarch64/libm-test-ulps                |   4 -
 sysdeps/arc/fpu/libm-test-ulps                |   4 -
 sysdeps/arc/nofpu/libm-test-ulps              |   2 -
 sysdeps/arm/libm-test-ulps                    |   4 -
 sysdeps/hppa/fpu/libm-test-ulps               |   4 -
 sysdeps/i386/fpu/libm-test-ulps               |   4 -
 .../i386/i686/fpu/multiarch/libm-test-ulps    |   4 -
 sysdeps/ieee754/flt-32/s_log2p1f.c            | 248 ++++++++++++++++++
 sysdeps/loongarch/lp64/libm-test-ulps         |   4 -
 sysdeps/m68k/m680x0/fpu/libm-test-ulps        |   4 -
 sysdeps/mips/mips32/libm-test-ulps            |   4 -
 sysdeps/mips/mips64/libm-test-ulps            |   4 -
 sysdeps/powerpc/fpu/libm-test-ulps            |   4 -
 sysdeps/powerpc/nofpu/libm-test-ulps          |   4 -
 sysdeps/riscv/nofpu/libm-test-ulps            |   1 -
 sysdeps/riscv/rvd/libm-test-ulps              |   4 -
 sysdeps/s390/fpu/libm-test-ulps               |   4 -
 sysdeps/sparc/fpu/libm-test-ulps              |   4 -
 sysdeps/x86_64/fpu/libm-test-ulps             |   4 -
 20 files changed, 252 insertions(+), 67 deletions(-)
 create mode 100644 sysdeps/ieee754/flt-32/s_log2p1f.c

diff --git a/SHARED-FILES b/SHARED-FILES
index a559e97318..98ad2671b1 100644
--- a/SHARED-FILES
+++ b/SHARED-FILES
@@ -243,3 +243,7 @@ sysdeps/ieee754/flt-32/s_expm1f.c
   (file src/binary32/expm1/expm1f.c in CORE_MATH)
   - The code was adapted to use glibc code style and internal
     functions to handle errno, overflow, and underflow.
+sysdeps/ieee754/flt-32/s_log2p1f.c
+  (file src/binary32/log2p1/log2p1f.c in CORE_MATH)
+  - The code was adapted to use glibc code style and internal
+    functions to handle errno, overflow, and underflow.
diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
index c6c40df9fa..cb1c18cb50 100644
--- a/sysdeps/aarch64/libm-test-ulps
+++ b/sysdeps/aarch64/libm-test-ulps
@@ -1422,22 +1422,18 @@ ldouble: 1
 
 Function: "log2p1":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log_advsimd":
diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps
index ca01eb3b4b..d233bd75a0 100644
--- a/sysdeps/arc/fpu/libm-test-ulps
+++ b/sysdeps/arc/fpu/libm-test-ulps
@@ -1012,19 +1012,15 @@ float: 1
 
 Function: "log2p1":
 double: 2
-float: 2
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 
 Function: "log_towardzero":
 double: 1
diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
index 266381f6ea..fe74fb8ea9 100644
--- a/sysdeps/arc/nofpu/libm-test-ulps
+++ b/sysdeps/arc/nofpu/libm-test-ulps
@@ -246,11 +246,9 @@ float: 1
 
 Function: "log2p1":
 double: 1
-float: 2
 
 Function: "logp1":
 double: 1
-float: 1
 
 Function: "pow":
 double: 1
diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
index 12451d24a7..b6b194143a 100644
--- a/sysdeps/arm/libm-test-ulps
+++ b/sysdeps/arm/libm-test-ulps
@@ -1006,19 +1006,15 @@ float: 3
 
 Function: "log2p1":
 double: 1
-float: 2
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 
 Function: "log_downward":
 float: 2
diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
index 05ad1cf9b3..9f89528947 100644
--- a/sysdeps/hppa/fpu/libm-test-ulps
+++ b/sysdeps/hppa/fpu/libm-test-ulps
@@ -1029,19 +1029,15 @@ float: 3
 
 Function: "log2p1":
 double: 2
-float: 2
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 
 Function: "log_downward":
 float: 2
diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
index abf9a9192b..d0bd63371d 100644
--- a/sysdeps/i386/fpu/libm-test-ulps
+++ b/sysdeps/i386/fpu/libm-test-ulps
@@ -1484,25 +1484,21 @@ ldouble: 1
 
 Function: "log2p1":
 double: 1
-float: 1
 float128: 3
 ldouble: 4
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 float128: 3
 ldouble: 3
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 float128: 2
 ldouble: 3
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 float128: 3
 ldouble: 5
 
diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
index 6d9d49d153..a97722b7e7 100644
--- a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
+++ b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
@@ -1487,25 +1487,21 @@ ldouble: 1
 
 Function: "log2p1":
 double: 1
-float: 1
 float128: 3
 ldouble: 4
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 float128: 2
 ldouble: 4
 
 Function: "log2p1_upward":
 double: 1
-float: 2
 float128: 3
 ldouble: 5
 
diff --git a/sysdeps/ieee754/flt-32/s_log2p1f.c b/sysdeps/ieee754/flt-32/s_log2p1f.c
new file mode 100644
index 0000000000..a185ddc376
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/s_log2p1f.c
@@ -0,0 +1,248 @@
+/* Correctly-rounded biased argument natural logarithm function for binary32
+   value.
+
+Copyright (c) 2022-2024 Alexei Sibidanov.
+
+This file is part of the CORE-MATH project
+project (file src/binary32/log2p1/log2p1f.c revision bc385c2).
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#include <errno.h>
+#include <math.h>
+#include <math-underflow.h>
+#include <libm-alias-float.h>
+#include "math_config.h"
+
+float
+__log2p1f (float x)
+{
+  static const double ix[] =
+    {
+      0x1p+0,           0x1.fc07f01fcp-1, 0x1.f81f81f82p-1,
+      0x1.f44659e4ap-1, 0x1.f07c1f07cp-1, 0x1.ecc07b302p-1,
+      0x1.e9131abfp-1,  0x1.e573ac902p-1, 0x1.e1e1e1e1ep-1,
+      0x1.de5d6e3f8p-1, 0x1.dae6076bap-1, 0x1.d77b654b8p-1,
+      0x1.d41d41d42p-1, 0x1.d0cb58f6ep-1, 0x1.cd8568904p-1,
+      0x1.ca4b3055ep-1, 0x1.c71c71c72p-1, 0x1.c3f8f01c4p-1,
+      0x1.c0e070382p-1, 0x1.bdd2b8994p-1, 0x1.bacf914c2p-1,
+      0x1.b7d6c3ddap-1, 0x1.b4e81b4e8p-1, 0x1.b2036406cp-1,
+      0x1.af286bca2p-1, 0x1.ac5701ac6p-1, 0x1.a98ef606ap-1,
+      0x1.a6d01a6dp-1,  0x1.a41a41a42p-1, 0x1.a16d3f97ap-1,
+      0x1.9ec8e951p-1,  0x1.9c2d14ee4p-1, 0x1.99999999ap-1,
+      0x1.970e4f80cp-1, 0x1.948b0fcd6p-1, 0x1.920fb49dp-1,
+      0x1.8f9c18f9cp-1, 0x1.8d3018d3p-1,  0x1.8acb90f6cp-1,
+      0x1.886e5f0acp-1, 0x1.861861862p-1, 0x1.83c977ab2p-1,
+      0x1.818181818p-1, 0x1.7f405fd02p-1, 0x1.7d05f417ep-1,
+      0x1.7ad2208ep-1,  0x1.78a4c8178p-1, 0x1.767dce434p-1,
+      0x1.745d1745ep-1, 0x1.724287f46p-1, 0x1.702e05c0cp-1,
+      0x1.6e1f76b44p-1, 0x1.6c16c16c2p-1, 0x1.6a13cd154p-1,
+      0x1.681681682p-1, 0x1.661ec6a52p-1, 0x1.642c8590cp-1,
+      0x1.623fa7702p-1, 0x1.605816058p-1, 0x1.5e75bb8dp-1,
+      0x1.5c9882b94p-1, 0x1.5ac056b02p-1, 0x1.58ed23082p-1,
+      0x1.571ed3c5p-1,  0x1.555555556p-1, 0x1.5390948f4p-1,
+      0x1.51d07eae2p-1, 0x1.501501502p-1, 0x1.4e5e0a73p-1,
+      0x1.4cab88726p-1, 0x1.4afd6a052p-1, 0x1.49539e3b2p-1,
+      0x1.47ae147aep-1, 0x1.460cbc7f6p-1, 0x1.446f86562p-1,
+      0x1.42d6625d6p-1, 0x1.414141414p-1, 0x1.3fb013fbp-1,
+      0x1.3e22cbce4p-1, 0x1.3c995a47cp-1, 0x1.3b13b13b2p-1,
+      0x1.3991c2c18p-1, 0x1.381381382p-1, 0x1.3698df3dep-1,
+      0x1.3521cfb2cp-1, 0x1.33ae45b58p-1, 0x1.323e34a2cp-1,
+      0x1.30d19013p-1,  0x1.2f684bda2p-1, 0x1.2e025c04cp-1,
+      0x1.2c9fb4d82p-1, 0x1.2b404ad02p-1, 0x1.29e4129e4p-1,
+      0x1.288b01288p-1, 0x1.27350b882p-1, 0x1.25e22708p-1,
+      0x1.24924924ap-1, 0x1.23456789ap-1, 0x1.21fb78122p-1,
+      0x1.20b470c68p-1, 0x1.1f7047dc2p-1, 0x1.1e2ef3b4p-1,
+      0x1.1cf06ada2p-1, 0x1.1bb4a4046p-1, 0x1.1a7b9611ap-1,
+      0x1.19453808cp-1, 0x1.181181182p-1, 0x1.16e068942p-1,
+      0x1.15b1e5f76p-1, 0x1.1485f0e0ap-1, 0x1.135c81136p-1,
+      0x1.12358e75ep-1, 0x1.111111112p-1, 0x1.0fef010fep-1,
+      0x1.0ecf56be6p-1, 0x1.0db20a89p-1,  0x1.0c9714fbcp-1,
+      0x1.0b7e6ec26p-1, 0x1.0a6810a68p-1, 0x1.0953f3902p-1,
+      0x1.084210842p-1, 0x1.073260a48p-1, 0x1.0624dd2f2p-1,
+      0x1.05197f7d8p-1, 0x1.041041042p-1, 0x1.03091b52p-1,
+      0x1.020408102p-1, 0x1.01010101p-1,  0x1p-1
+    };
+
+  static const double lix[] = {
+      0x0p+0,               -0x1.6fe50b6f1eafap-7, -0x1.6e79685c160d5p-6,
+     -0x1.11cd1d51955bap-5, -0x1.6bad37591e03p-5,  -0x1.c4dfab908ddb5p-5,
+     -0x1.0eb389fab4795p-4, -0x1.3aa2fdd26ae99p-4, -0x1.663f6faca846bp-4,
+     -0x1.918a16e4cb157p-4, -0x1.bc84240a78a13p-4, -0x1.e72ec1181cfb1p-4,
+     -0x1.08c588cd964e4p-3, -0x1.1dcd19759f2e3p-3, -0x1.32ae9e27627c6p-3,
+     -0x1.476a9f989a58ap-3, -0x1.5c01a39fa6533p-3, -0x1.70742d4eed455p-3,
+     -0x1.84c2bd02d6434p-3, -0x1.98edd077e9f0ap-3, -0x1.acf5e2db31eeap-3,
+     -0x1.c0db6cddaa82dp-3, -0x1.d49ee4c33121ap-3, -0x1.e840be751d775p-3,
+     -0x1.fbc16b9003e0bp-3, -0x1.0790adbae3fcp-2,  -0x1.11307dad465b5p-2,
+     -0x1.1ac05b2924cc5p-2, -0x1.24407ab0cc41p-2,  -0x1.2db10fc4ea424p-2,
+     -0x1.37124cea58697p-2, -0x1.406463b1d455dp-2, -0x1.49a784bcbaa37p-2,
+     -0x1.52dbdfc4f341dp-2, -0x1.5c01a39ff2c9bp-2, -0x1.6518fe46abaa5p-2,
+     -0x1.6e221cd9d6933p-2, -0x1.771d2ba7f5791p-2, -0x1.800a56315ee2ap-2,
+     -0x1.88e9c72df8611p-2, -0x1.91bba891d495fp-2, -0x1.9a8023920fa4dp-2,
+     -0x1.a33760a7fbca6p-2, -0x1.abe18797d2effp-2, -0x1.b47ebf734b923p-2,
+     -0x1.bd0f2e9eb2b84p-2, -0x1.c592fad2be1aap-2, -0x1.ce0a4923cf5e6p-2,
+     -0x1.d6753e02f4ebcp-2, -0x1.ded3fd445afp-2,   -0x1.e726aa1e558fep-2,
+     -0x1.ef6d67325ba38p-2, -0x1.f7a8568c8aea6p-2, -0x1.ffd799a81be87p-2,
+     0x1.f804ae8d33c4p-2,    0x1.efec61b04af4ep-2,  0x1.e7df5fe572606p-2,
+     0x1.dfdd89d5b0009p-2,   0x1.d7e6c0abbd924p-2,  0x1.cffae611a74d6p-2,
+     0x1.c819dc2d8578cp-2,   0x1.c043859e5bdbcp-2,  0x1.b877c57b47c04p-2,
+     0x1.b0b67f4f29a66p-2,   0x1.a8ff97183ed07p-2,  0x1.a152f14293c74p-2,
+     0x1.99b072a9289cap-2,   0x1.921800927e284p-2,  0x1.8a8980ac4113p-2,
+     0x1.8304d90c2859dp-2,   0x1.7b89f02cbd49ap-2,  0x1.7418aceb84ab1p-2,
+     0x1.6cb0f68656c95p-2,   0x1.6552b49993dc2p-2,  0x1.5dfdcf1eacd7bp-2,
+     0x1.56b22e6b97c18p-2,   0x1.4f6fbb2ce6943p-2,  0x1.48365e6957b42p-2,
+     0x1.4106017c0dbcfp-2,   0x1.39de8e15727d9p-2,  0x1.32bfee37489bcp-2,
+     0x1.2baa0c34989c3p-2,   0x1.249cd2b177fd5p-2,  0x1.1d982c9d50468p-2,
+     0x1.169c0536677acp-2,   0x1.0fa848045f67bp-2,  0x1.08bce0d9a7c6p-2,
+     0x1.01d9bbcf66a2cp-2,   0x1.f5fd8a90e2d85p-3,  0x1.e857d3d3af1e5p-3,
+     0x1.dac22d3ec5f4ep-3,   0x1.cd3c712db459ap-3,  0x1.bfc67a7ff3c22p-3,
+     0x1.b2602497678f4p-3,   0x1.a5094b555a1f8p-3,  0x1.97c1cb136b96fp-3,
+     0x1.8a8980ac8652dp-3,   0x1.7d60496c83f66p-3,  0x1.7046031c7cdafp-3,
+     0x1.633a8bf460335p-3,   0x1.563dc2a08b102p-3,  0x1.494f863bbc1dep-3,
+     0x1.3c6fb6507a37ep-3,   0x1.2f9e32d5257ecp-3,  0x1.22dadc2a627efp-3,
+     0x1.1625931802e49p-3,   0x1.097e38cef9519p-3,  0x1.f9c95dc138295p-4,
+     0x1.e0b1ae90505f6p-4,   0x1.c7b528b5fcffap-4,  0x1.aed391abb17a1p-4,
+     0x1.960caf9bd35eap-4,   0x1.7d60496e3edebp-4,  0x1.64ce26bf2108ep-4,
+     0x1.4c560fe5b573bp-4,   0x1.33f7cde24adfbp-4,  0x1.1bb32a5ed9353p-4,
+     0x1.0387efbd3006ep-4,   0x1.d6ebd1f1d0955p-5,  0x1.a6f9c37a8beabp-5,
+     0x1.77394c9d6762cp-5,   0x1.47aa07358e1a4p-5,  0x1.184b8e4d490efp-5,
+     0x1.d23afc4d95c78p-6,   0x1.743ee8678a7cbp-6,  0x1.16a21e243bf78p-6,
+     0x1.72c7ba20c907ep-7,   0x1.720d9c0536e17p-8,  0x0p+0
+  };
+
+  double z = x;
+  uint32_t ux = asuint (x);
+  uint32_t ax = ux & (~0u >> 1);
+  if (__glibc_unlikely (ux >= 0x17fu << 23))
+    { /* x <= -1 */
+      if (ux == (0x17fu << 23))
+	return __math_divzerof (1);
+      if (ux > (0x1ffu << 23))
+	return x + x;		   /* nan */
+      return __math_invalidf (x);
+    }
+  else if (__glibc_unlikely (ax >= (0xff << 23)))
+    { /* +inf, nan  */
+      if (ax > (0xff << 23))
+	return x + x; /* nan  */
+      return INFINITY;
+    }
+  else if (__glibc_likely (ax < 0x3cb7aa26u))
+    { /* |x| < 0x1.6f544cp-6  */
+      double z2 = z * z, z4 = z2 * z2;
+      if ( __glibc_likely(ax < 0x3b9d9d34u))
+	{ /* |x| < 0x1.3b3a68p-8 */
+	  if (__glibc_likely (ax < 0x39638a7eu))
+	    { /* |x| < 0x1.c714fcp-13 */
+	      if (__glibc_likely (ax < 0x329c5639u))
+		{ /* |x| < 0x1.38ac72p-26 */
+		  static const double c[] =
+		    {
+		      0x1.71547652b82fep+0, -0x1.71547652b82ffp-1
+		    };
+		  return z * (c[0] + z * c[1]);
+		}
+	      else
+		{
+		  if (__glibc_unlikely (ux == 0x32ff7045u))
+		    return 0x1.70851ap-25f - 0x1.8p-80f;
+		  if (__glibc_unlikely (ux == 0xb395efbbu))
+		    return -0x1.b0a00ap-24f + 0x1p-76f;
+		  if (__glibc_unlikely (ux == 0x35a14df7u))
+		    return 0x1.d16d2p-20f + 0x1p-72f;
+		  if (__glibc_unlikely (ux == 0x3841cb81u))
+		    return 0x1.17949ep-14f + 0x1p-67f;
+		  static const double c[] =
+		    {
+		      0x1.71547652b82fep+0, -0x1.71547652b82fdp-1,
+		      0x1.ec709ead0c9a7p-2, -0x1.7154773c1cb29p-2
+		    };
+		  return z * ((c[0] + z * c[1]) + z2 * (c[2] + z * c[3]));
+		}
+	    }
+	  else
+	    {
+	      if (__glibc_unlikely (ux == 0xbac9363du))
+		return -0x1.2282aap-9f + 0x1p-61f;
+	      static const double c[] =
+	       	{
+		  0x1.71547652b82fep+0, -0x1.71547652b83p-1,
+		  0x1.ec709dc28f51bp-2, -0x1.7154765157748p-2,
+		  0x1.2778a510a3682p-2, -0x1.ec745df1551fcp-3
+		};
+	      return z
+		     * ((c[0] + z * c[1]) + z2 * (c[2] + z * c[3])
+			+ z4 * ((c[4] + z * c[5])));
+	    }
+	}
+      else
+	{
+	  static const double c[] =
+	    {
+	      0x1.71547652b82fep+0, -0x1.71547652b82fbp-1,
+	      0x1.ec709dc3b6a73p-2, -0x1.71547652dc09p-2,
+	      0x1.2776c1a88901p-2,  -0x1.ec7095bd4d208p-3,
+	      0x1.a66bec7fc8f7p-3,  -0x1.71a900fc3f3f9p-3
+	    };
+	  return z
+		 * ((c[0] + z * c[1]) + z2 * (c[2] + z * c[3])
+		    + z4 * ((c[4] + z * c[5]) + z2 * (c[6] + z * c[7])));
+	}
+    }
+  else
+    { /* |x| >= 0x1.6f544cp-6 */
+      float h, l;
+      /* With gcc 6.3.0, if we return 0x1.e90026p+4f + 0x1.fp-21
+	 in the second exceptional case, with rounding up it yields
+	 0x1.e90026p+4 which is incorrect, thus we use this workaround. See
+	 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112367. */
+      if (__glibc_unlikely (ux == 0x52928e33u))
+	{
+	  h = 0x1.318ffap+5f;
+	  l = 0x1.fp-20f;
+	  return h + l;
+	}
+      if (__glibc_unlikely (ux == 0x4ebd09e3u))
+	{
+	  h = 0x1.e90026p+4f;
+	  l = 0x1.fp-21;
+	  return h + l;
+	}
+      uint64_t tp = asuint64 (z + 1.0);
+      uint64_t m = tp & (~(uint64_t) 0 >> 12);
+      int e = (tp >> 52) - 0x3ff;
+      int j = (m + ((int64_t) 1 << (52 - 8))) >> (52 - 7), k = j > 53;
+      e += k;
+      double xd = asdouble (m | (uint64_t) 0x3ff << 52);
+      z = fma (xd, ix[j], -1.0);
+      static const double c[] =
+	{
+	  0x1.71547652b82fep+0, -0x1.71547652b82ffp-1, 0x1.ec709dc32988bp-2,
+	  -0x1.715476521ec2bp-2, 0x1.277801a1ad904p-2, -0x1.ec731704d6a88p-3
+       	};
+      double z2 = z * z;
+      double c0 = c[0] + z * c[1];
+      double c2 = c[2] + z * c[3];
+      double c4 = c[4] + z * c[5];
+      c0 += z2 * (c2 + z2 * c4);
+      return (z * c0 - lix[j]) + e;
+    }
+}
+libm_alias_float (__log2p1, log2p1)
diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
index 5d407a49fe..b59d68202e 100644
--- a/sysdeps/loongarch/lp64/libm-test-ulps
+++ b/sysdeps/loongarch/lp64/libm-test-ulps
@@ -1252,22 +1252,18 @@ ldouble: 1
 
 Function: "log2p1":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log_downward":
diff --git a/sysdeps/m68k/m680x0/fpu/libm-test-ulps b/sysdeps/m68k/m680x0/fpu/libm-test-ulps
index 7fef8942ae..3964b83b81 100644
--- a/sysdeps/m68k/m680x0/fpu/libm-test-ulps
+++ b/sysdeps/m68k/m680x0/fpu/libm-test-ulps
@@ -1091,19 +1091,15 @@ double: 1
 
 Function: "log2p1":
 double: 1
-float: 2
 
 Function: "log2p1_downward":
 double: 1
-float: 2
 
 Function: "log2p1_towardzero":
 double: 1
-float: 2
 
 Function: "log2p1_upward":
 double: 1
-float: 2
 
 Function: "logp1":
 double: 1
diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
index f9d7bf8598..f1d0543aea 100644
--- a/sysdeps/mips/mips32/libm-test-ulps
+++ b/sysdeps/mips/mips32/libm-test-ulps
@@ -1003,22 +1003,18 @@ float: 3
 
 Function: "log2p1":
 double: 1
-float: 2
 ldouble: 1
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 ldouble: 1
 
 Function: "log_downward":
diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
index 4f3c82d64c..fecd998560 100644
--- a/sysdeps/mips/mips64/libm-test-ulps
+++ b/sysdeps/mips/mips64/libm-test-ulps
@@ -1260,22 +1260,18 @@ ldouble: 1
 
 Function: "log2p1":
 double: 1
-float: 2
 ldouble: 3
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log_downward":
diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
index ddbd184e58..f775c56618 100644
--- a/sysdeps/powerpc/fpu/libm-test-ulps
+++ b/sysdeps/powerpc/fpu/libm-test-ulps
@@ -1569,25 +1569,21 @@ ldouble: 4
 
 Function: "log2p1":
 double: 2
-float: 2
 float128: 3
 ldouble: 2
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 float128: 2
 ldouble: 5
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 float128: 3
 ldouble: 6
 
diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
index c79dfcc2cc..a732166765 100644
--- a/sysdeps/powerpc/nofpu/libm-test-ulps
+++ b/sysdeps/powerpc/nofpu/libm-test-ulps
@@ -1317,22 +1317,18 @@ ldouble: 4
 
 Function: "log2p1":
 double: 1
-float: 2
 ldouble: 2
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 ldouble: 4
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 ldouble: 5
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 ldouble: 6
 
 Function: "log_downward":
diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
index 4caf84f316..739d04bc5c 100644
--- a/sysdeps/riscv/nofpu/libm-test-ulps
+++ b/sysdeps/riscv/nofpu/libm-test-ulps
@@ -1209,7 +1209,6 @@ ldouble: 1
 
 Function: "log2p1":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "log_downward":
diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
index e9c4b72c04..f6bb6e05e1 100644
--- a/sysdeps/riscv/rvd/libm-test-ulps
+++ b/sysdeps/riscv/rvd/libm-test-ulps
@@ -1252,22 +1252,18 @@ ldouble: 1
 
 Function: "log2p1":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log_downward":
diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
index a42c9f273a..b444d4475e 100644
--- a/sysdeps/s390/fpu/libm-test-ulps
+++ b/sysdeps/s390/fpu/libm-test-ulps
@@ -1251,22 +1251,18 @@ ldouble: 1
 
 Function: "log2p1":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log_downward":
diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
index 3bee496247..c7f8531d6d 100644
--- a/sysdeps/sparc/fpu/libm-test-ulps
+++ b/sysdeps/sparc/fpu/libm-test-ulps
@@ -1260,22 +1260,18 @@ ldouble: 1
 
 Function: "log2p1":
 double: 1
-float: 2
 ldouble: 3
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log_downward":
diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
index ffb1d4f3c9..de19bf26f7 100644
--- a/sysdeps/x86_64/fpu/libm-test-ulps
+++ b/sysdeps/x86_64/fpu/libm-test-ulps
@@ -1910,25 +1910,21 @@ float: 1
 
 Function: "log2p1":
 double: 2
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "log2p1_downward":
 double: 2
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "log2p1_towardzero":
 double: 2
-float: 2
 float128: 2
 ldouble: 4
 
 Function: "log2p1_upward":
 double: 2
-float: 2
 float128: 3
 ldouble: 5
 
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 14/17] math: Use log1pf from CORE-MATH
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (12 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 13/17] math: Use log2p1f " Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-25 19:12   ` Joseph Myers
  2024-10-31 21:20   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 15/17] math: Use log10p1f " Adhemerval Zanella
                   ` (3 subsequent siblings)
  17 siblings, 2 replies; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=UTF-8, Size: 33689 bytes --]

The CORE-MATH implementation is correctly rounded (for any rounding mode)
and shows slight better performance to the generic log10pf.

The code was adapted to glibc style and to use the definition of
math_config.h (to handle errno, overflow, and underflow).

Benchtest on x64_64 (Ryzen 9 5900X, gcc 14.2.1), aarch64 (M1,
gcc 13.2.1), and powerpc (POWER10, gcc 13.2.1):

Latency                      master        patched   improvement
x86_64                      71.8142        38.9668        45.74%
x86_64v2                    71.9094        39.1321        45.58%
x86_64v3                    60.1000        32.4016        46.09%
i686                        147.105        104.258        29.13%
aarch64                     26.4439        14.0050        47.04%
power10                     19.4874         9.4146        51.69%
powerpc                     17.6145        8.00736        54.54%

reciprocal-throughput        master        patched   improvement
x86_64                      19.7604        12.7254        35.60%
x86_64v2                    19.0039        11.9455        37.14%
x86_64v3                    16.8559        11.9317        29.21%
i686                        82.3426        73.9718        10.17%
aarch64                     14.4665         7.9614        44.97%
power10                     11.9974         8.4117        29.89%
powerpc                     7.15222         6.0914        14.83%

Signed-off-by: Alexei Sibidanov <sibid@uvic.ca>
Signed-off-by: Paul Zimmermann <Paul.Zimmermann@inria.fr>
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
 sysdeps/aarch64/libm-test-ulps                |   8 -
 sysdeps/alpha/fpu/libm-test-ulps              |   8 -
 sysdeps/arc/fpu/libm-test-ulps                |   8 -
 sysdeps/arc/nofpu/libm-test-ulps              |   1 -
 sysdeps/arm/libm-test-ulps                    |   8 -
 sysdeps/csky/fpu/libm-test-ulps               |   8 -
 sysdeps/csky/nofpu/libm-test-ulps             |   8 -
 sysdeps/hppa/fpu/libm-test-ulps               |   8 -
 sysdeps/i386/fpu/libm-test-ulps               |   6 -
 sysdeps/i386/fpu/s_log1pf.S                   |  66 -----
 .../i386/i686/fpu/multiarch/libm-test-ulps    |   6 -
 sysdeps/ieee754/flt-32/s_log1pf.c             | 271 +++++++++++-------
 sysdeps/ieee754/flt-32/w_log1pf.c             |   1 +
 sysdeps/loongarch/lp64/libm-test-ulps         |   8 -
 sysdeps/m68k/coldfire/fpu/libm-test-ulps      |   6 -
 sysdeps/m68k/m680x0/fpu/w_log1pf.c            |  20 ++
 sysdeps/microblaze/libm-test-ulps             |   2 -
 sysdeps/mips/mips32/libm-test-ulps            |   8 -
 sysdeps/mips/mips64/libm-test-ulps            |   8 -
 sysdeps/nios2/libm-test-ulps                  |   2 -
 sysdeps/or1k/nofpu/libm-test-ulps             |   8 -
 sysdeps/powerpc/fpu/libm-test-ulps            |   8 -
 sysdeps/powerpc/nofpu/libm-test-ulps          |   8 -
 sysdeps/riscv/nofpu/libm-test-ulps            |   8 -
 sysdeps/riscv/rvd/libm-test-ulps              |   8 -
 sysdeps/s390/fpu/libm-test-ulps               |   8 -
 sysdeps/sh/libm-test-ulps                     |   4 -
 sysdeps/sparc/fpu/libm-test-ulps              |   8 -
 sysdeps/x86_64/fpu/libm-test-ulps             |   8 -
 29 files changed, 189 insertions(+), 340 deletions(-)
 delete mode 100644 sysdeps/i386/fpu/s_log1pf.S
 create mode 100644 sysdeps/ieee754/flt-32/w_log1pf.c
 create mode 100644 sysdeps/m68k/m680x0/fpu/w_log1pf.c

diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
index cb1c18cb50..5700c712ff 100644
--- a/sysdeps/aarch64/libm-test-ulps
+++ b/sysdeps/aarch64/libm-test-ulps
@@ -1366,7 +1366,6 @@ ldouble: 4
 
 Function: "log1p":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "log1p_advsimd":
@@ -1375,7 +1374,6 @@ float: 1
 
 Function: "log1p_downward":
 double: 1
-float: 2
 ldouble: 3
 
 Function: "log1p_sve":
@@ -1384,12 +1382,10 @@ float: 1
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log1p_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2":
@@ -1459,22 +1455,18 @@ ldouble: 1
 
 Function: "logp1":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "logp1_downward":
 double: 1
-float: 2
 ldouble: 3
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "logp1_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "pow":
diff --git a/sysdeps/alpha/fpu/libm-test-ulps b/sysdeps/alpha/fpu/libm-test-ulps
index 09185dd902..212c52c8cc 100644
--- a/sysdeps/alpha/fpu/libm-test-ulps
+++ b/sysdeps/alpha/fpu/libm-test-ulps
@@ -1202,22 +1202,18 @@ ldouble: 3
 
 Function: "log1p":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "log1p_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log1p_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2":
@@ -1267,22 +1263,18 @@ ldouble: 1
 
 Function: "logp1":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "logp1_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "logp1_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "pow":
diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps
index d233bd75a0..54dc4d6760 100644
--- a/sysdeps/arc/fpu/libm-test-ulps
+++ b/sysdeps/arc/fpu/libm-test-ulps
@@ -984,19 +984,15 @@ float: 3
 
 Function: "log1p":
 double: 1
-float: 1
 
 Function: "log1p_downward":
 double: 1
-float: 2
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 
 Function: "log1p_upward":
 double: 2
-float: 2
 
 Function: "log2":
 double: 2
@@ -1032,19 +1028,15 @@ float: 1
 
 Function: "logp1":
 double: 1
-float: 1
 
 Function: "logp1_downward":
 double: 1
-float: 2
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 
 Function: "logp1_upward":
 double: 2
-float: 2
 
 Function: "pow":
 double: 1
diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
index fe74fb8ea9..f6d1ef062c 100644
--- a/sysdeps/arc/nofpu/libm-test-ulps
+++ b/sysdeps/arc/nofpu/libm-test-ulps
@@ -238,7 +238,6 @@ float: 2
 
 Function: "log1p":
 double: 1
-float: 1
 
 Function: "log2":
 double: 2
diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
index b6b194143a..502680ff1b 100644
--- a/sysdeps/arm/libm-test-ulps
+++ b/sysdeps/arm/libm-test-ulps
@@ -974,19 +974,15 @@ float: 3
 
 Function: "log1p":
 double: 1
-float: 1
 
 Function: "log1p_downward":
 double: 2
-float: 2
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 
 Function: "log1p_upward":
 double: 2
-float: 2
 
 Function: "log2":
 double: 2
@@ -1028,19 +1024,15 @@ float: 2
 
 Function: "logp1":
 double: 1
-float: 1
 
 Function: "logp1_downward":
 double: 2
-float: 2
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 
 Function: "logp1_upward":
 double: 2
-float: 2
 
 Function: "pow":
 double: 1
diff --git a/sysdeps/csky/fpu/libm-test-ulps b/sysdeps/csky/fpu/libm-test-ulps
index 3f17778d03..a7b2bec17e 100644
--- a/sysdeps/csky/fpu/libm-test-ulps
+++ b/sysdeps/csky/fpu/libm-test-ulps
@@ -919,19 +919,15 @@ float: 2
 
 Function: "log1p":
 double: 1
-float: 1
 
 Function: "log1p_downward":
 double: 2
-float: 2
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 
 Function: "log1p_upward":
 double: 2
-float: 2
 
 Function: "log2":
 double: 2
@@ -948,19 +944,15 @@ double: 3
 
 Function: "logp1":
 double: 1
-float: 1
 
 Function: "logp1_downward":
 double: 2
-float: 2
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 
 Function: "logp1_upward":
 double: 2
-float: 2
 
 Function: "pow":
 double: 1
diff --git a/sysdeps/csky/nofpu/libm-test-ulps b/sysdeps/csky/nofpu/libm-test-ulps
index fdef935578..4e4451a5d2 100644
--- a/sysdeps/csky/nofpu/libm-test-ulps
+++ b/sysdeps/csky/nofpu/libm-test-ulps
@@ -920,19 +920,15 @@ float: 2
 
 Function: "log1p":
 double: 1
-float: 1
 
 Function: "log1p_downward":
 double: 2
-float: 2
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 
 Function: "log1p_upward":
 double: 2
-float: 2
 
 Function: "log2":
 double: 2
@@ -962,19 +958,15 @@ float: 2
 
 Function: "logp1":
 double: 1
-float: 1
 
 Function: "logp1_downward":
 double: 2
-float: 2
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 
 Function: "logp1_upward":
 double: 2
-float: 2
 
 Function: "pow":
 double: 1
diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
index 9f89528947..b56f512b39 100644
--- a/sysdeps/hppa/fpu/libm-test-ulps
+++ b/sysdeps/hppa/fpu/libm-test-ulps
@@ -997,19 +997,15 @@ float: 3
 
 Function: "log1p":
 double: 1
-float: 1
 
 Function: "log1p_downward":
 double: 2
-float: 2
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 
 Function: "log1p_upward":
 double: 2
-float: 2
 
 Function: "log2":
 double: 2
@@ -1051,19 +1047,15 @@ float: 2
 
 Function: "logp1":
 double: 1
-float: 1
 
 Function: "logp1_downward":
 double: 2
-float: 2
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 
 Function: "logp1_upward":
 double: 2
-float: 2
 
 Function: "pow":
 double: 1
diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
index d0bd63371d..63ef3569b4 100644
--- a/sysdeps/i386/fpu/libm-test-ulps
+++ b/sysdeps/i386/fpu/libm-test-ulps
@@ -1443,19 +1443,16 @@ ldouble: 2
 
 Function: "log1p_downward":
 double: 1
-float: 1
 float128: 3
 ldouble: 4
 
 Function: "log1p_towardzero":
 double: 1
-float: 1
 float128: 3
 ldouble: 4
 
 Function: "log1p_upward":
 double: 1
-float: 1
 float128: 2
 ldouble: 3
 
@@ -1524,19 +1521,16 @@ ldouble: 2
 
 Function: "logp1_downward":
 double: 1
-float: 1
 float128: 3
 ldouble: 4
 
 Function: "logp1_towardzero":
 double: 1
-float: 1
 float128: 3
 ldouble: 4
 
 Function: "logp1_upward":
 double: 1
-float: 1
 float128: 2
 ldouble: 3
 
diff --git a/sysdeps/i386/fpu/s_log1pf.S b/sysdeps/i386/fpu/s_log1pf.S
deleted file mode 100644
index 82a3f448db..0000000000
--- a/sysdeps/i386/fpu/s_log1pf.S
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Public domain.
- */
-
-#include <machine/asm.h>
-#include <i386-math-asm.h>
-
-RCSID("$NetBSD: s_log1pf.S,v 1.4 1995/05/09 00:13:05 jtc Exp $")
-
-	.section .rodata
-
-	.align ALIGNARG(4)
-	/* The fyl2xp1 can only be used for values in
-		-1 + sqrt(2) / 2 <= x <= 1 - sqrt(2) / 2
-	   0.29 is a safe value.
-	*/
-limit:	.float 0.29
-one:	.float 1.0
-
-DEFINE_FLT_MIN
-
-#ifdef PIC
-# define MO(op) op##@GOTOFF(%edx)
-#else
-# define MO(op) op
-#endif
-
-/*
- * Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29,
- * otherwise fyl2x with the needed extra computation.
- */
-	.text
-ENTRY(__log1pf)
-	fldln2
-
-	flds	4(%esp)
-
-#ifdef	PIC
-	LOAD_PIC_REG (dx)
-#endif
-
-	fxam
-	fnstsw
-	fld	%st
-	sahf
-	jc	3f		// in case x is NaN or ±Inf
-4:	fabs
-	fcomps	MO(limit)
-	fnstsw
-	sahf
-	jc	2f
-
-	fadds	MO(one)
-	fyl2x
-	ret
-
-2:	fyl2xp1
-	FLT_CHECK_FORCE_UFLOW_NONNAN
-	ret
-
-3:	jp	4b		// in case x is ±Inf
-	fstp	%st(1)
-	fstp	%st(1)
-	ret
-
-END (__log1pf)
diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
index a97722b7e7..f6393dbdf1 100644
--- a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
+++ b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
@@ -1446,19 +1446,16 @@ ldouble: 2
 
 Function: "log1p_downward":
 double: 1
-float: 1
 float128: 3
 ldouble: 4
 
 Function: "log1p_towardzero":
 double: 1
-float: 1
 float128: 3
 ldouble: 4
 
 Function: "log1p_upward":
 double: 1
-float: 1
 float128: 2
 ldouble: 3
 
@@ -1527,19 +1524,16 @@ ldouble: 2
 
 Function: "logp1_downward":
 double: 1
-float: 1
 float128: 3
 ldouble: 4
 
 Function: "logp1_towardzero":
 double: 1
-float: 1
 float128: 3
 ldouble: 4
 
 Function: "logp1_upward":
 double: 1
-float: 1
 float128: 2
 ldouble: 3
 
diff --git a/sysdeps/ieee754/flt-32/s_log1pf.c b/sysdeps/ieee754/flt-32/s_log1pf.c
index 555f0f82c8..d1686e78aa 100644
--- a/sysdeps/ieee754/flt-32/s_log1pf.c
+++ b/sysdeps/ieee754/flt-32/s_log1pf.c
@@ -1,116 +1,181 @@
-/* s_log1pf.c -- float version of s_log1p.c.
- */
+/* Correctly-rounded biased argument natural logarithm function for binary32
+   value.
 
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
+Copyright (c) 2023, 2024  Alexei Sibidanov.
 
-#include <float.h>
-#include <math.h>
-#include <math-barriers.h>
-#include <math_private.h>
-#include <math-underflow.h>
-#include <libc-diag.h>
+This file is part of the CORE-MATH project
+project (file src/binary32/log1p/log1pf.c revision bc385c2).
 
-static const float
-ln2_hi =   6.9313812256e-01,	/* 0x3f317180 */
-ln2_lo =   9.0580006145e-06,	/* 0x3717f7d1 */
-two25 =    3.355443200e+07,	/* 0x4c000000 */
-Lp1 = 6.6666668653e-01,	/* 3F2AAAAB */
-Lp2 = 4.0000000596e-01,	/* 3ECCCCCD */
-Lp3 = 2.8571429849e-01, /* 3E924925 */
-Lp4 = 2.2222198546e-01, /* 3E638E29 */
-Lp5 = 1.8183572590e-01, /* 3E3A3325 */
-Lp6 = 1.5313838422e-01, /* 3E1CD04F */
-Lp7 = 1.4798198640e-01; /* 3E178897 */
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
 
-static const float zero = 0.0;
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
 
-float
-__log1pf(float x)
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#include <math.h>
+#include <stdint.h>
+#include <errno.h>
+#include <libm-alias-float.h>
+#include "math_config.h"
+
+static __attribute__ ((noinline)) float
+as_special (float x)
 {
-	float hfsq,f,c,s,z,R,u;
-	int32_t k,hx,hu,ax;
+  uint32_t t = asuint (x);
+  if (t == 0xbf800000u)
+    return __math_divzerof (1);
+  if (t == 0x7f800000u)
+    return x; /* +inf */
+  uint32_t ax = t << 1;
+  if (ax > 0xff000000u)
+    return x + x; /* nan */
+  return __math_invalidf (0.0f);
+}
 
-	GET_FLOAT_WORD(hx,x);
-	ax = hx&0x7fffffff;
+float
+__log1pf (float x)
+{
+  static const double x0[] =
+    {
+      0x1.f81f82p-1,  0x1.e9131acp-1, 0x1.dae6077p-1, 0x1.cd85689p-1,
+      0x1.c0e0704p-1, 0x1.b4e81b5p-1, 0x1.a98ef6p-1,  0x1.9ec8e95p-1,
+      0x1.948b0fdp-1, 0x1.8acb90fp-1, 0x1.8181818p-1, 0x1.78a4c81p-1,
+      0x1.702e05cp-1, 0x1.6816817p-1, 0x1.605816p-1,  0x1.58ed231p-1,
+      0x1.51d07ebp-1, 0x1.4afd6ap-1,  0x1.446f865p-1, 0x1.3e22cbdp-1,
+      0x1.3813814p-1, 0x1.323e34ap-1, 0x1.2c9fb4ep-1, 0x1.27350b9p-1,
+      0x1.21fb781p-1, 0x1.1cf06aep-1, 0x1.1811812p-1, 0x1.135c811p-1,
+      0x1.0ecf56cp-1, 0x1.0a6810ap-1, 0x1.0624dd3p-1, 0x1.0204081p-1
+    };
+  static const double lixb[] =
+    {
+      0x1.fc0a8909b4218p-7, 0x1.77458f51aac89p-5, 0x1.341d793afb997p-4,
+      0x1.a926d3a5ebd2ap-4, 0x1.0d77e7a8a823dp-3, 0x1.44d2b6c557102p-3,
+      0x1.7ab89040accecp-3, 0x1.af3c94ecab3d6p-3, 0x1.e27076d54e6c9p-3,
+      0x1.0a324e3888ad5p-2, 0x1.22941fc0c7357p-2, 0x1.3a64c56ae3fdbp-2,
+      0x1.51aad874af21fp-2, 0x1.686c81d300eap-2,  0x1.7eaf83c7fa9b5p-2,
+      0x1.947941aa610ecp-2, 0x1.a9cec9a3f023bp-2, 0x1.beb4d9ea4156ep-2,
+      0x1.d32fe7f35e5c7p-2, 0x1.e7442617b817ap-2, 0x1.faf588dd5ed1p-2,
+      0x1.0723e5c635c39p-1, 0x1.109f39d53c99p-1,  0x1.19ee6b38a4668p-1,
+      0x1.23130d7f93c3bp-1, 0x1.2c0e9ec9b0b85p-1, 0x1.34e289cb35eccp-1,
+      0x1.3d9026ad3d3f3p-1, 0x1.4618bc1eadbbbp-1, 0x1.4e7d8127dd8a9p-1,
+      0x1.56bf9d5967092p-1, 0x1.5ee02a926936ep-1
+    };
+  static const double lix[] =
+    {
+      0x1.fc0a890fc03e4p-7, 0x1.77458f532dcfcp-5, 0x1.341d793bbd1d1p-4,
+      0x1.a926d3a6ad563p-4, 0x1.0d77e7a908e59p-3, 0x1.44d2b6c5b7d1ep-3,
+      0x1.7ab890410d909p-3, 0x1.af3c94ed0bff3p-3, 0x1.e27076d5af2e6p-3,
+      0x1.0a324e38b90e3p-2, 0x1.22941fc0f7966p-2, 0x1.3a64c56b145eap-2,
+      0x1.51aad874df82dp-2, 0x1.686c81d3314afp-2, 0x1.7eaf83c82afc3p-2,
+      0x1.947941aa916fbp-2, 0x1.a9cec9a42084ap-2, 0x1.beb4d9ea71b7cp-2,
+      0x1.d32fe7f38ebd5p-2, 0x1.e7442617e8788p-2, 0x1.faf588dd8f31fp-2,
+      0x1.0723e5c64df4p-1,  0x1.109f39d554c97p-1, 0x1.19ee6b38bc96fp-1,
+      0x1.23130d7fabf43p-1, 0x1.2c0e9ec9c8e8cp-1, 0x1.34e289cb4e1d3p-1,
+      0x1.3d9026ad556fbp-1, 0x1.4618bc1ec5ec2p-1, 0x1.4e7d8127f5bb1p-1,
+      0x1.56bf9d597f399p-1, 0x1.5ee02a9281675p-1
+    };
+  static const double b[] =
+    {
+      0x1p+0,
+      -0x1p-1,
+      0x1.5555555556f6bp-2,
+      -0x1.00000000029b9p-2,
+      0x1.9999988d176e4p-3,
+      -0x1.55555418889a7p-3,
+      0x1.24adeca50e2bcp-3,
+      -0x1.001ba33bf57cfp-3
+    };
 
-	k = 1;
-	if (hx < 0x3ed413d7) {			/* x < 0.41422  */
-	    if(ax>=0x3f800000) {		/* x <= -1.0 */
-		if(x==(float)-1.0) return -two25/zero; /* log1p(-1)=-inf */
-		else return (x-x)/(x-x);	/* log1p(x<-1)=NaN */
-	    }
-	    if(ax<0x31000000) {			/* |x| < 2**-29 */
-		math_force_eval(two25+x);	/* raise inexact */
-		if (ax<0x24800000)		/* |x| < 2**-54 */
-		  {
-		    math_check_force_underflow (x);
-		    return x;
-		  }
-		else
-		    return x - x*x*(float)0.5;
-	    }
-	    if(hx>0||hx<=((int32_t)0xbe95f61f)) {
-		k=0;f=x;hu=1;}	/* -0.2929<x<0.41422 */
+  double z = x;
+  uint32_t ux = asuint (x);
+  uint32_t ax = ux & (~0u >> 1);
+  if (__glibc_likely (ax < 0x3c880000))
+    {
+      if (__glibc_unlikely (ax < 0x33000000))
+	{
+	  if (!ax)
+	    return x;
+	  return fmaf (x, -x, x);
 	}
-	if (hx >= 0x7f800000) return x+x;
-	if(k!=0) {
-	    if(hx<0x5a000000) {
-		u  = (float)1.0+x;
-		GET_FLOAT_WORD(hu,u);
-		k  = (hu>>23)-127;
-		/* correction term */
-		c  = (k>0)? (float)1.0-(u-x):x-(u-(float)1.0);
-		c /= u;
-	    } else {
-		u  = x;
-		GET_FLOAT_WORD(hu,u);
-		k  = (hu>>23)-127;
-		c  = 0;
-	    }
-	    hu &= 0x007fffff;
-	    if(hu<0x3504f7) {
-		SET_FLOAT_WORD(u,hu|0x3f800000);/* normalize u */
-	    } else {
-		k += 1;
-		SET_FLOAT_WORD(u,hu|0x3f000000);	/* normalize u/2 */
-		hu = (0x00800000-hu)>>2;
+      double z2 = z * z, z4 = z2 * z2;
+      double f = z2
+		 * ((b[1] + z * b[2]) + z2 * (b[3] + z * b[4])
+		    + z4 * ((b[5] + z * b[6]) + z2 * b[7]));
+      double r = z + f;
+      if (__glibc_unlikely ((asuint64 (r) & 0xfffffffll) == 0))
+	r += 0x1p14 * (f + (z - r));
+      return r;
+    }
+  else
+    {
+      if (__glibc_unlikely (ux >= 0xbf800000u || ax >= 0x7f800000))
+	return as_special (x);
+      uint64_t tp = asuint64 (z + 1);
+      int e = tp >> 52;
+      uint64_t m52 = tp & (~(uint64_t) 0 >> 12);
+      unsigned int j = (tp >> (52 - 5)) & 31;
+      e -= 0x3ff;
+      double xd = asdouble (m52 | ((uint64_t) 0x3ff << 52));
+      z = xd * x0[j] - 1;
+      static const double c[] =
+	{
+	  -0x1.3902c33434e7fp-43, 0x1.ffffffe1cbed5p-1, -0x1.ffffff7d1b014p-2,
+	  0x1.5564e0ed3613ap-2, -0x1.0012232a00d4ap-2
+	};
+      const double ln2 = 0x1.62e42fefa39efp-1;
+      double z2 = z * z,
+	     r = (ln2 * e + lixb[j])
+		 + z * ((c[1] + z * c[2]) + z2 * (c[3] + z * c[4]));
+      float ub = r;
+      float lb = r + 2.2e-11;
+      if (__glibc_unlikely (ub != lb))
+	{
+	  double z4 = z2 * z2,
+		 f = z
+		     * ((b[0] + z * b[1]) + z2 * (b[2] + z * b[3])
+			+ z4 * ((b[4] + z * b[5]) + z2 * (b[6] + z * b[7])));
+	  const double ln2l = 0x1.7f7d1cf79abcap-20, ln2h = 0x1.62e4p-1;
+	  double Lh = ln2h * e;
+	  double Ll = ln2l * e;
+	  double rl = f + Ll + lix[j];
+	  double tr = rl + Lh;
+	  if (__glibc_unlikely ((asuint64 (tr) & 0xfffffffll) == 0))
+	    {
+	      if (x == -0x1.247ab0p-6)
+		return -0x1.271f0ep-6f - 0x1p-31f;
+	      if (x == -0x1.3a415ep-5)
+		return -0x1.407112p-5f + 0x1p-30f;
+	      if (x == 0x1.fb035ap-2)
+		return 0x1.9bddc2p-2f + 0x1p-27f;
+	      tr += 64 * (rl + (Lh - tr));
 	    }
-	    f = u-(float)1.0;
-	}
-	hfsq=(float)0.5*f*f;
-	if(hu==0) {	/* |f| < 2**-20 */
-	    if(f==zero) {
-		if(k==0) return zero;
-		else {c += k*ln2_lo; return k*ln2_hi+c;}
+	  else if (rl + (Lh - tr) == 0.0)
+	    {
+	      if (x == 0x1.b7fd86p-4)
+		return 0x1.a1ece2p-4f + 0x1p-29f;
+	      if (x == -0x1.3a415ep-5)
+		return -0x1.407112p-5f + 0x1p-30f;
+	      if (x == 0x1.43c7e2p-6)
+		return 0x1.409f80p-6f + 0x1p-31f;
 	    }
-	    R = hfsq*(1.0f-0.66666666666666666f*f);
-	    if(k==0) return f-R; else
-		     return k*ln2_hi-((R-(k*ln2_lo+c))-f);
+	  ub = tr;
 	}
-	s = f/((float)2.0+f);
-	z = s*s;
-	R = z*(Lp1+z*(Lp2+z*(Lp3+z*(Lp4+z*(Lp5+z*(Lp6+z*Lp7))))));
-	if (k == 0)
-	  return f - (hfsq - s * (hfsq + R));
-	else
-	  {
-	    /* With GCC 7 when compiling with -Os the compiler warns
-	       that c might be used uninitialized.  This can't be true
-	       because k must be 0 for c to be uninitialized and we
-	       handled that computation earlier without using c.  */
-	    DIAG_PUSH_NEEDS_COMMENT;
-	    DIAG_IGNORE_Os_NEEDS_COMMENT (7, "-Wmaybe-uninitialized");
-	    return k * ln2_hi - ((hfsq - (s * (hfsq + R)
-					  + (k * ln2_lo + c))) - f);
-	    DIAG_POP_NEEDS_COMMENT;
-	  }
+      return ub;
+    }
 }
+libm_alias_float (__log1p, log1p)
+strong_alias (__log1pf, __logp1f)
+libm_alias_float (__logp1, logp1)
diff --git a/sysdeps/ieee754/flt-32/w_log1pf.c b/sysdeps/ieee754/flt-32/w_log1pf.c
new file mode 100644
index 0000000000..1cc8931700
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/w_log1pf.c
@@ -0,0 +1 @@
+/* Not needed.  */
diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
index b59d68202e..846ddb4b3e 100644
--- a/sysdeps/loongarch/lp64/libm-test-ulps
+++ b/sysdeps/loongarch/lp64/libm-test-ulps
@@ -1215,22 +1215,18 @@ ldouble: 4
 
 Function: "log1p":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "log1p_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log1p_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2":
@@ -1278,22 +1274,18 @@ ldouble: 2
 
 Function: "logp1":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "logp1_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "logp1_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "pow":
diff --git a/sysdeps/m68k/coldfire/fpu/libm-test-ulps b/sysdeps/m68k/coldfire/fpu/libm-test-ulps
index ae05498719..8130d491e8 100644
--- a/sysdeps/m68k/coldfire/fpu/libm-test-ulps
+++ b/sysdeps/m68k/coldfire/fpu/libm-test-ulps
@@ -131,12 +131,6 @@ Function: "log10":
 double: 1
 float: 2
 
-Function: "log1p":
-float: 1
-
-Function: "logp1":
-float: 1
-
 Function: "sincos":
 double: 1
 float: 1
diff --git a/sysdeps/m68k/m680x0/fpu/w_log1pf.c b/sysdeps/m68k/m680x0/fpu/w_log1pf.c
new file mode 100644
index 0000000000..5f363cc66b
--- /dev/null
+++ b/sysdeps/m68k/m680x0/fpu/w_log1pf.c
@@ -0,0 +1,20 @@
+/* Wrapper for __log1p that handles setting errno.
+   Copyright (C) 2015-2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <math-type-macros-float.h>
+#include <w_log1p_template.c>
diff --git a/sysdeps/microblaze/libm-test-ulps b/sysdeps/microblaze/libm-test-ulps
index a84494b8f8..328e31582b 100644
--- a/sysdeps/microblaze/libm-test-ulps
+++ b/sysdeps/microblaze/libm-test-ulps
@@ -224,7 +224,6 @@ float: 2
 
 Function: "log1p":
 double: 1
-float: 1
 
 Function: "log2":
 double: 2
@@ -232,7 +231,6 @@ float: 1
 
 Function: "logp1":
 double: 1
-float: 1
 
 Function: "pow":
 float: 1
diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
index f1d0543aea..2ba46a0749 100644
--- a/sysdeps/mips/mips32/libm-test-ulps
+++ b/sysdeps/mips/mips32/libm-test-ulps
@@ -971,19 +971,15 @@ float: 3
 
 Function: "log1p":
 double: 1
-float: 1
 
 Function: "log1p_downward":
 double: 2
-float: 2
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 
 Function: "log1p_upward":
 double: 2
-float: 2
 
 Function: "log2":
 double: 2
@@ -1029,19 +1025,15 @@ float: 2
 
 Function: "logp1":
 double: 1
-float: 1
 
 Function: "logp1_downward":
 double: 2
-float: 2
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 
 Function: "logp1_upward":
 double: 2
-float: 2
 
 Function: "pow":
 double: 1
diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
index fecd998560..f73f95cdad 100644
--- a/sysdeps/mips/mips64/libm-test-ulps
+++ b/sysdeps/mips/mips64/libm-test-ulps
@@ -1220,22 +1220,18 @@ ldouble: 4
 
 Function: "log1p":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "log1p_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log1p_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2":
@@ -1289,22 +1285,18 @@ ldouble: 1
 
 Function: "logp1":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "logp1_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "logp1_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "pow":
diff --git a/sysdeps/nios2/libm-test-ulps b/sysdeps/nios2/libm-test-ulps
index 33f714e713..5240767c0e 100644
--- a/sysdeps/nios2/libm-test-ulps
+++ b/sysdeps/nios2/libm-test-ulps
@@ -230,7 +230,6 @@ float: 2
 
 Function: "log1p":
 double: 1
-float: 1
 
 Function: "log2":
 double: 2
@@ -238,7 +237,6 @@ float: 1
 
 Function: "logp1":
 double: 1
-float: 1
 
 Function: "pow":
 double: 1
diff --git a/sysdeps/or1k/nofpu/libm-test-ulps b/sysdeps/or1k/nofpu/libm-test-ulps
index 6862551b79..c7ae0f002b 100644
--- a/sysdeps/or1k/nofpu/libm-test-ulps
+++ b/sysdeps/or1k/nofpu/libm-test-ulps
@@ -923,19 +923,15 @@ float: 2
 
 Function: "log1p":
 double: 1
-float: 1
 
 Function: "log1p_downward":
 double: 2
-float: 2
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 
 Function: "log1p_upward":
 double: 2
-float: 2
 
 Function: "log2":
 float: 1
@@ -951,19 +947,15 @@ double: 1
 
 Function: "logp1":
 double: 1
-float: 1
 
 Function: "logp1_downward":
 double: 2
-float: 2
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 
 Function: "logp1_upward":
 double: 2
-float: 2
 
 Function: "pow":
 double: 1
diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
index f775c56618..48a3ea10db 100644
--- a/sysdeps/powerpc/fpu/libm-test-ulps
+++ b/sysdeps/powerpc/fpu/libm-test-ulps
@@ -1521,25 +1521,21 @@ ldouble: 6
 
 Function: "log1p":
 double: 1
-float: 1
 float128: 3
 ldouble: 2
 
 Function: "log1p_downward":
 double: 1
-float: 2
 float128: 3
 ldouble: 2
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 float128: 3
 ldouble: 3
 
 Function: "log1p_upward":
 double: 2
-float: 2
 float128: 2
 ldouble: 3
 
@@ -1605,25 +1601,21 @@ ldouble: 1
 
 Function: "logp1":
 double: 1
-float: 1
 float128: 3
 ldouble: 2
 
 Function: "logp1_downward":
 double: 1
-float: 2
 float128: 3
 ldouble: 2
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 float128: 3
 ldouble: 3
 
 Function: "logp1_upward":
 double: 2
-float: 2
 float128: 2
 ldouble: 3
 
diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
index a732166765..ec9104806a 100644
--- a/sysdeps/powerpc/nofpu/libm-test-ulps
+++ b/sysdeps/powerpc/nofpu/libm-test-ulps
@@ -1277,22 +1277,18 @@ ldouble: 6
 
 Function: "log1p":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "log1p_downward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log1p_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2":
@@ -1346,22 +1342,18 @@ ldouble: 1
 
 Function: "logp1":
 double: 1
-float: 1
 ldouble: 2
 
 Function: "logp1_downward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "logp1_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "mul_downward_ldouble":
diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
index 739d04bc5c..0189fc5bd0 100644
--- a/sysdeps/riscv/nofpu/libm-test-ulps
+++ b/sysdeps/riscv/nofpu/libm-test-ulps
@@ -1172,22 +1172,18 @@ ldouble: 3
 
 Function: "log1p":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "log1p_downward":
 double: 1
-float: 2
 ldouble: 3
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log1p_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2":
@@ -1223,22 +1219,18 @@ ldouble: 1
 
 Function: "logp1":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "logp1_downward":
 double: 1
-float: 2
 ldouble: 3
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "logp1_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "pow":
diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
index f6bb6e05e1..a0b43761a2 100644
--- a/sysdeps/riscv/rvd/libm-test-ulps
+++ b/sysdeps/riscv/rvd/libm-test-ulps
@@ -1215,22 +1215,18 @@ ldouble: 4
 
 Function: "log1p":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "log1p_downward":
 double: 1
-float: 2
 ldouble: 3
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log1p_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2":
@@ -1278,22 +1274,18 @@ ldouble: 2
 
 Function: "logp1":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "logp1_downward":
 double: 1
-float: 2
 ldouble: 3
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "logp1_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "pow":
diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
index b444d4475e..658752c41e 100644
--- a/sysdeps/s390/fpu/libm-test-ulps
+++ b/sysdeps/s390/fpu/libm-test-ulps
@@ -1216,22 +1216,18 @@ ldouble: 4
 
 Function: "log1p":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "log1p_downward":
 double: 1
-float: 2
 ldouble: 3
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log1p_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2":
@@ -1276,22 +1272,18 @@ ldouble: 1
 
 Function: "logp1":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "logp1_downward":
 double: 1
-float: 2
 ldouble: 3
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "logp1_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "pow":
diff --git a/sysdeps/sh/libm-test-ulps b/sysdeps/sh/libm-test-ulps
index fc4556e977..8562796de8 100644
--- a/sysdeps/sh/libm-test-ulps
+++ b/sysdeps/sh/libm-test-ulps
@@ -460,11 +460,9 @@ float: 1
 
 Function: "log1p":
 double: 1
-float: 1
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 
 Function: "log2":
 double: 2
@@ -475,11 +473,9 @@ double: 2
 
 Function: "logp1":
 double: 1
-float: 1
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 
 Function: "pow":
 double: 1
diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
index c7f8531d6d..4c4d8ff238 100644
--- a/sysdeps/sparc/fpu/libm-test-ulps
+++ b/sysdeps/sparc/fpu/libm-test-ulps
@@ -1220,22 +1220,18 @@ ldouble: 4
 
 Function: "log1p":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "log1p_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log1p_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "log2":
@@ -1289,22 +1285,18 @@ ldouble: 1
 
 Function: "logp1":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "logp1_downward":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "logp1_upward":
 double: 2
-float: 2
 ldouble: 2
 
 Function: "pow":
diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
index de19bf26f7..ef9ef51e5e 100644
--- a/sysdeps/x86_64/fpu/libm-test-ulps
+++ b/sysdeps/x86_64/fpu/libm-test-ulps
@@ -1822,25 +1822,21 @@ ldouble: 6
 
 Function: "log1p":
 double: 1
-float: 1
 float128: 3
 ldouble: 2
 
 Function: "log1p_downward":
 double: 2
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "log1p_towardzero":
 double: 2
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "log1p_upward":
 double: 2
-float: 2
 float128: 2
 ldouble: 3
 
@@ -1966,25 +1962,21 @@ float: 3
 
 Function: "logp1":
 double: 1
-float: 1
 float128: 3
 ldouble: 2
 
 Function: "logp1_downward":
 double: 2
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "logp1_towardzero":
 double: 2
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "logp1_upward":
 double: 2
-float: 2
 float128: 2
 ldouble: 3
 
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 15/17] math: Use log10p1f from CORE-MATH
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (13 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 14/17] math: Use log1pf " Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-30 19:43   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 16/17] x86_64: Add exp10m1f with FMA Adhemerval Zanella
                   ` (2 subsequent siblings)
  17 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

The CORE-MATH implementation is correctly rounded (for any rounding mode)
and shows slight better performance to the generic log10p1f.

The code was adapted to glibc style and to use the definition of
math_config.h (to handle errno, overflow, and underflow).

Benchtest on x64_64 (Ryzen 9 5900X, gcc 14.2.1), aarch64 (M1,
gcc 13.2.1), and powerpc (POWER10, gcc 13.2.1):

Latency                      master        patched   improvement
x86_64                      68.5251        32.2627        52.92%
x86_64v2                    68.8912        32.7887        52.41%
x86_64v3                    59.3427        27.0521        54.41%
i686                        162.026        103.383        36.19%
aarch64                     26.8513        14.5695        45.74%
power10                     12.7426         8.4929        33.35%
powerpc                     16.6768        9.29135        44.29%

reciprocal-throughput        master        patched   improvement
x86_64                      26.0969        12.4023        52.48%
x86_64v2                    25.0045        11.0748        55.71%
x86_64v3                    20.5610        10.2995        49.91%
i686                        89.8842        78.5211        12.64%
aarch64                     17.1200         9.4832        44.61%
power10                      6.7814         6.4258         5.24%
powerpc                      15.769         7.6825        51.28%

Signed-off-by: Alexei Sibidanov <sibid@uvic.ca>
Signed-off-by: Paul Zimmermann <Paul.Zimmermann@inria.fr>
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
 sysdeps/aarch64/libm-test-ulps                |   4 -
 sysdeps/arc/fpu/libm-test-ulps                |   4 -
 sysdeps/arc/nofpu/libm-test-ulps              |   1 -
 sysdeps/arm/libm-test-ulps                    |   4 -
 sysdeps/hppa/fpu/libm-test-ulps               |   4 -
 sysdeps/i386/fpu/libm-test-ulps               |   4 -
 .../i386/i686/fpu/multiarch/libm-test-ulps    |   4 -
 sysdeps/ieee754/flt-32/s_log10p1f.c           | 182 ++++++++++++++++++
 sysdeps/loongarch/lp64/libm-test-ulps         |   4 -
 sysdeps/mips/mips32/libm-test-ulps            |   4 -
 sysdeps/mips/mips64/libm-test-ulps            |   4 -
 sysdeps/powerpc/fpu/libm-test-ulps            |   4 -
 sysdeps/powerpc/nofpu/libm-test-ulps          |   4 -
 sysdeps/riscv/nofpu/libm-test-ulps            |   1 -
 sysdeps/riscv/rvd/libm-test-ulps              |   4 -
 sysdeps/s390/fpu/libm-test-ulps               |   4 -
 sysdeps/sparc/fpu/libm-test-ulps              |   4 -
 sysdeps/x86_64/fpu/libm-test-ulps             |   4 -
 18 files changed, 182 insertions(+), 62 deletions(-)
 create mode 100644 sysdeps/ieee754/flt-32/s_log10p1f.c

diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
index 5700c712ff..c523d45802 100644
--- a/sysdeps/aarch64/libm-test-ulps
+++ b/sysdeps/aarch64/libm-test-ulps
@@ -1346,22 +1346,18 @@ ldouble: 1
 
 Function: "log10p1":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 ldouble: 4
 
 Function: "log10p1_towardzero":
 double: 3
-float: 2
 ldouble: 3
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 ldouble: 4
 
 Function: "log1p":
diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps
index 54dc4d6760..c12e241c48 100644
--- a/sysdeps/arc/fpu/libm-test-ulps
+++ b/sysdeps/arc/fpu/libm-test-ulps
@@ -968,19 +968,15 @@ float: 4
 
 Function: "log10p1":
 double: 2
-float: 2
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 
 Function: "log10p1_towardzero":
 double: 3
-float: 2
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 
 Function: "log1p":
 double: 1
diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
index f6d1ef062c..d0cfa46c3d 100644
--- a/sysdeps/arc/nofpu/libm-test-ulps
+++ b/sysdeps/arc/nofpu/libm-test-ulps
@@ -234,7 +234,6 @@ float: 2
 
 Function: "log10p1":
 double: 1
-float: 2
 
 Function: "log1p":
 double: 1
diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
index 502680ff1b..6cdd3d53d6 100644
--- a/sysdeps/arm/libm-test-ulps
+++ b/sysdeps/arm/libm-test-ulps
@@ -958,19 +958,15 @@ float: 2
 
 Function: "log10p1":
 double: 1
-float: 2
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 
 Function: "log10p1_towardzero":
 double: 3
-float: 2
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 
 Function: "log1p":
 double: 1
diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
index b56f512b39..021a2a482c 100644
--- a/sysdeps/hppa/fpu/libm-test-ulps
+++ b/sysdeps/hppa/fpu/libm-test-ulps
@@ -981,19 +981,15 @@ float: 2
 
 Function: "log10p1":
 double: 2
-float: 2
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 
 Function: "log10p1_towardzero":
 double: 3
-float: 2
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 
 Function: "log1p":
 double: 1
diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
index 63ef3569b4..a77ded2648 100644
--- a/sysdeps/i386/fpu/libm-test-ulps
+++ b/sysdeps/i386/fpu/libm-test-ulps
@@ -1414,25 +1414,21 @@ ldouble: 1
 
 Function: "log10p1":
 double: 1
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 float128: 4
 ldouble: 8
 
 Function: "log10p1_towardzero":
 double: 2
-float: 1
 float128: 3
 ldouble: 8
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 float128: 4
 ldouble: 6
 
diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
index f6393dbdf1..a9cd01bf03 100644
--- a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
+++ b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
@@ -1417,25 +1417,21 @@ ldouble: 1
 
 Function: "log10p1":
 double: 1
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "log10p1_downward":
 double: 2
-float: 1
 float128: 4
 ldouble: 8
 
 Function: "log10p1_towardzero":
 double: 2
-float: 1
 float128: 3
 ldouble: 8
 
 Function: "log10p1_upward":
 double: 2
-float: 2
 float128: 4
 ldouble: 6
 
diff --git a/sysdeps/ieee754/flt-32/s_log10p1f.c b/sysdeps/ieee754/flt-32/s_log10p1f.c
new file mode 100644
index 0000000000..29dad2ea94
--- /dev/null
+++ b/sysdeps/ieee754/flt-32/s_log10p1f.c
@@ -0,0 +1,182 @@
+/* Correctly-rounded biased argument base-10 logarithm function for binary32 value.
+
+Copyright (c) 2022-2023 Alexei Sibidanov.
+
+This file is part of the CORE-MATH project
+project (file src/binary32/log10p1/log10p1f.c revision bc385c2).
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+#include <stdint.h>
+#include <errno.h>
+#include <fenv.h>
+#include <libm-alias-float.h>
+#include "math_config.h"
+
+static __attribute__ ((noinline)) float
+as_special (float x)
+{
+  uint32_t ux = asuint (x);
+  if (ux == 0x7f800000u)
+    return x; /* +inf */
+  uint32_t ax = ux << 1;
+  if (ax == 0x17fu << 24)
+    /* x+1 = 0.0 */
+    return __math_divzerof (1);
+  if (ax > 0xff000000u)
+    return x + x; /* nan */
+  return  __math_invalidf (x);
+}
+
+float
+__log10p1f (float x)
+{
+  static const double tr[] =
+    {
+      0x1p+0,         0x1.f81f82p-1,  0x1.f07c1fp-1,  0x1.e9131acp-1,
+      0x1.e1e1e1ep-1, 0x1.dae6077p-1, 0x1.d41d41dp-1, 0x1.cd85689p-1,
+      0x1.c71c71cp-1, 0x1.c0e0704p-1, 0x1.bacf915p-1, 0x1.b4e81b5p-1,
+      0x1.af286bdp-1, 0x1.a98ef6p-1,  0x1.a41a41ap-1, 0x1.9ec8e95p-1,
+      0x1.999999ap-1, 0x1.948b0fdp-1, 0x1.8f9c19p-1,  0x1.8acb90fp-1,
+      0x1.8618618p-1, 0x1.8181818p-1, 0x1.7d05f41p-1, 0x1.78a4c81p-1,
+      0x1.745d174p-1, 0x1.702e05cp-1, 0x1.6c16c17p-1, 0x1.6816817p-1,
+      0x1.642c859p-1, 0x1.605816p-1,  0x1.5c9882cp-1, 0x1.58ed231p-1,
+      0x1.5555555p-1, 0x1.51d07ebp-1, 0x1.4e5e0a7p-1, 0x1.4afd6ap-1,
+      0x1.47ae148p-1, 0x1.446f865p-1, 0x1.4141414p-1, 0x1.3e22cbdp-1,
+      0x1.3b13b14p-1, 0x1.3813814p-1, 0x1.3521cfbp-1, 0x1.323e34ap-1,
+      0x1.2f684bep-1, 0x1.2c9fb4ep-1, 0x1.29e412ap-1, 0x1.27350b9p-1,
+      0x1.2492492p-1, 0x1.21fb781p-1, 0x1.1f7047ep-1, 0x1.1cf06aep-1,
+      0x1.1a7b961p-1, 0x1.1811812p-1, 0x1.15b1e5fp-1, 0x1.135c811p-1,
+      0x1.1111111p-1, 0x1.0ecf56cp-1, 0x1.0c9715p-1,  0x1.0a6810ap-1,
+      0x1.0842108p-1, 0x1.0624dd3p-1, 0x1.041041p-1,  0x1.0204081p-1,
+      0.5
+    };
+  static const double tl[] =
+    {
+      0x1.562ec497ef351p-43, 0x1.b9476892ea99cp-8, 0x1.b5e909c959eecp-7,
+      0x1.45f4f59ec84fp-6,   0x1.af5f92cbcf2aap-6, 0x1.0ba01a6069052p-5,
+      0x1.3ed119b99dd41p-5,  0x1.714834298a088p-5, 0x1.a30a9d98309c1p-5,
+      0x1.d41d51266b9d9p-5,  0x1.02428c0f62dfcp-4, 0x1.1a23444eea521p-4,
+      0x1.31b30543f2597p-4,  0x1.48f3ed39bd5e7p-4, 0x1.5fe8049a0bd06p-4,
+      0x1.769140a6a78eap-4,  0x1.8cf1836c96595p-4, 0x1.a30a9d5551a84p-4,
+      0x1.b8de4d1ee5b21p-4,  0x1.ce6e4202c7bc9p-4, 0x1.e3bc1accaa6eap-4,
+      0x1.f8c9683b584b7p-4,  0x1.06cbd68ca86ep-3,  0x1.11142f19de3a2p-3,
+      0x1.1b3e71fa795fp-3,   0x1.254b4d37a3354p-3, 0x1.2f3b6912cab79p-3,
+      0x1.390f6831144f7p-3,  0x1.42c7e7fffb21ap-3, 0x1.4c65808c779aep-3,
+      0x1.55e8c507508c7p-3,  0x1.5f52445deb049p-3, 0x1.68a288c3efe72p-3,
+      0x1.71da17bdef98bp-3,  0x1.7af9736089c4bp-3, 0x1.84011952a11ebp-3,
+      0x1.8cf1837a7d6d1p-3,  0x1.95cb2891e3048p-3, 0x1.9e8e7b0f85651p-3,
+      0x1.a73beaa5d9dfep-3,  0x1.afd3e39454544p-3, 0x1.b856cf060c662p-3,
+      0x1.c0c5134de0c6dp-3,  0x1.c91f1371bb611p-3, 0x1.d1652ffcd2bc5p-3,
+      0x1.d997c6f634ae6p-3,  0x1.e1b733ab8fbadp-3, 0x1.e9c3ceadab4c8p-3,
+      0x1.f1bdeec438f77p-3,  0x1.f9a5e7a5f906fp-3, 0x1.00be05ac02564p-2,
+      0x1.04a054d81990cp-2,  0x1.087a083594e33p-2, 0x1.0c4b457098b4fp-2,
+      0x1.101431aa1f48ap-2,  0x1.13d4f08b98411p-2, 0x1.178da53edaecbp-2,
+      0x1.1b3e71e9f9391p-2,  0x1.1ee777defd526p-2, 0x1.2288d7b48d874p-2,
+      0x1.2622b0f52dad8p-2,  0x1.29b522a4c594cp-2, 0x1.2d404b0e305b9p-2,
+      0x1.30c4478f3f21dp-2,  0x1.34413509f6f4dp-2
+    };
+  static const union
+  {
+    float f;
+    uint32_t u;
+  } st[] =
+  {
+    { 0x0p+0 },        { 0x1.2p+3 },      { 0x1.8cp+6 },
+    { 0x1.f38p+9 },    { 0x1.3878p+13 },  { 0x1.869fp+16 },
+    { 0x1.e847ep+19 }, { 0x1.312cfep+23 }
+  };
+  double z = x;
+  uint32_t ux = asuint (x);
+  if (__glibc_unlikely (ux >= 0x17fu << 23)) /* x <= -1 */
+    return as_special (x);
+  uint32_t ax = ux & (~0u >> 1);
+  if (__glibc_unlikely (ax == 0))
+    return copysign (0, x);
+  if (__glibc_unlikely (ax >= (0xff << 23))) /* +inf, nan */
+    return as_special (x);
+  int ie = ux;
+  ie >>= 23;
+  unsigned int je = ie - 126;
+  je = (je * 0x9a209a8) >> 29;
+  if (__glibc_unlikely (ux == st[je].u))
+    return je;
+
+  uint64_t tz = asuint64 (z + 1.0);
+  uint64_t m = tz & (~(uint64_t) 0 >> 12);
+  int32_t e = (tz >> 52) - 1023, j = ((m + ((int64_t) 1 << 45)) >> 46);
+  tz = m | ((uint64_t) 0x3ff << 52);
+  double ix = tr[j], l = tl[j];
+  double off = e * 0x1.34413509f79ffp-2 + l;
+  double v = asdouble (tz) * ix - 1;
+
+  static const double h[] =
+    {
+      0x1.bcb7b150bf6d8p-2, -0x1.bcb7b1738c07ep-3,
+      0x1.287de19e795c5p-3, -0x1.bca44edc44bc4p-4
+    };
+  double v2 = v * v;
+  double f = (h[0] + v * h[1]) + v2 * (h[2] + v * h[3]);
+  double r = off + v * f;
+  float ub = r;
+  float lb = r + 0x1.5cp-42;
+  if (__glibc_unlikely (ub != lb))
+    {
+      if (__glibc_unlikely (ax < 0x3d32743eu))
+	{ /* 0x1.64e87cp-5f */
+	  if (__glibc_unlikely (ux == 0xa6aba8afu))
+	    return -0x1.2a33bcp-51f + 0x1p-76f;
+	  if (__glibc_unlikely (ux == 0xaf39b9a7u))
+	    return -0x1.42a342p-34f + 0x1p-59f;
+	  if (__glibc_unlikely (ux == 0x399a7c00u))
+	    return 0x1.0c53cap-13f + 0x1p-38f;
+	  z /= 2.0 + z;
+	  double z2 = z * z, z4 = z2 * z2;
+	  static const double c[] =
+	    { 
+	      0x1.bcb7b1526e50fp-1, 0x1.287a76370129dp-2,
+	      0x1.63c62378fa3dbp-3, 0x1.fca4139a42374p-4
+	    };
+	  float ret = z * ((c[0] + z2 * c[1]) + z4 * (c[2] + z2 * c[3]));
+	  if (x != 0.0f && ret == 0.0)
+	    __set_errno (ERANGE);
+	  return ret;
+	}
+      if (__glibc_unlikely (ux == 0x7956ba5eu))
+	return 0x1.16bebap+5f + 0x1p-20f;
+      if (__glibc_unlikely (ux == 0xbd86ffb9u))
+	return -0x1.e53536p-6f + 0x1p-31f;
+      static const double c[] =
+       	{
+	  0x1.bcb7b1526e50ep-2,  -0x1.bcb7b1526e53dp-3, 0x1.287a7636f3fa2p-3,
+	  -0x1.bcb7b146a14b3p-4,  0x1.63c627d5219cbp-4, -0x1.2880736c8762dp-4,
+	  0x1.fc1ecf913961ap-5
+	};
+      f = v
+	  * ((c[0] + v * c[1])
+	     + v2 * ((c[2] + v * c[3]) + v2 * (c[4] + v * c[5] + v2 * c[6])));
+      f += l - tl[0];
+      double el = e * 0x1.34413509f79ffp-2;
+      r = el + f;
+      ub = r;
+    }
+  return ub;
+}
+libm_alias_float (__log10p1, log10p1)
diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
index 846ddb4b3e..ecd9cc5873 100644
--- a/sysdeps/loongarch/lp64/libm-test-ulps
+++ b/sysdeps/loongarch/lp64/libm-test-ulps
@@ -1195,22 +1195,18 @@ ldouble: 1
 
 Function: "log10p1":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 ldouble: 4
 
 Function: "log10p1_towardzero":
 double: 3
-float: 2
 ldouble: 3
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 ldouble: 4
 
 Function: "log1p":
diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
index 2ba46a0749..c319e0642c 100644
--- a/sysdeps/mips/mips32/libm-test-ulps
+++ b/sysdeps/mips/mips32/libm-test-ulps
@@ -955,19 +955,15 @@ float: 2
 
 Function: "log10p1":
 double: 1
-float: 2
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 
 Function: "log10p1_towardzero":
 double: 3
-float: 2
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 
 Function: "log1p":
 double: 1
diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
index f73f95cdad..365b860c54 100644
--- a/sysdeps/mips/mips64/libm-test-ulps
+++ b/sysdeps/mips/mips64/libm-test-ulps
@@ -1200,22 +1200,18 @@ ldouble: 1
 
 Function: "log10p1":
 double: 1
-float: 2
 ldouble: 3
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 ldouble: 4
 
 Function: "log10p1_towardzero":
 double: 3
-float: 2
 ldouble: 3
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 ldouble: 4
 
 Function: "log1p":
diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
index 48a3ea10db..8d0c18eed1 100644
--- a/sysdeps/powerpc/fpu/libm-test-ulps
+++ b/sysdeps/powerpc/fpu/libm-test-ulps
@@ -1497,25 +1497,21 @@ ldouble: 2
 
 Function: "log10p1":
 double: 2
-float: 2
 float128: 3
 ldouble: 3
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 float128: 4
 ldouble: 6
 
 Function: "log10p1_towardzero":
 double: 3
-float: 2
 float128: 3
 ldouble: 6
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 float128: 4
 ldouble: 6
 
diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
index ec9104806a..20036c779c 100644
--- a/sysdeps/powerpc/nofpu/libm-test-ulps
+++ b/sysdeps/powerpc/nofpu/libm-test-ulps
@@ -1257,22 +1257,18 @@ ldouble: 2
 
 Function: "log10p1":
 double: 1
-float: 2
 ldouble: 3
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 ldouble: 6
 
 Function: "log10p1_towardzero":
 double: 3
-float: 2
 ldouble: 6
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 ldouble: 6
 
 Function: "log1p":
diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
index 0189fc5bd0..cccc864a7a 100644
--- a/sysdeps/riscv/nofpu/libm-test-ulps
+++ b/sysdeps/riscv/nofpu/libm-test-ulps
@@ -1167,7 +1167,6 @@ ldouble: 1
 
 Function: "log10p1":
 double: 1
-float: 1
 ldouble: 3
 
 Function: "log1p":
diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
index a0b43761a2..14fc7633af 100644
--- a/sysdeps/riscv/rvd/libm-test-ulps
+++ b/sysdeps/riscv/rvd/libm-test-ulps
@@ -1195,22 +1195,18 @@ ldouble: 1
 
 Function: "log10p1":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 ldouble: 4
 
 Function: "log10p1_towardzero":
 double: 3
-float: 2
 ldouble: 3
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 ldouble: 4
 
 Function: "log1p":
diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
index 658752c41e..288054aafc 100644
--- a/sysdeps/s390/fpu/libm-test-ulps
+++ b/sysdeps/s390/fpu/libm-test-ulps
@@ -1196,22 +1196,18 @@ ldouble: 1
 
 Function: "log10p1":
 double: 2
-float: 2
 ldouble: 3
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 ldouble: 4
 
 Function: "log10p1_towardzero":
 double: 3
-float: 2
 ldouble: 3
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 ldouble: 4
 
 Function: "log1p":
diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
index 4c4d8ff238..6ea02058e9 100644
--- a/sysdeps/sparc/fpu/libm-test-ulps
+++ b/sysdeps/sparc/fpu/libm-test-ulps
@@ -1200,22 +1200,18 @@ ldouble: 1
 
 Function: "log10p1":
 double: 1
-float: 2
 ldouble: 3
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 ldouble: 4
 
 Function: "log10p1_towardzero":
 double: 3
-float: 2
 ldouble: 3
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 ldouble: 4
 
 Function: "log1p":
diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
index ef9ef51e5e..e3c811549c 100644
--- a/sysdeps/x86_64/fpu/libm-test-ulps
+++ b/sysdeps/x86_64/fpu/libm-test-ulps
@@ -1798,25 +1798,21 @@ float: 1
 
 Function: "log10p1":
 double: 2
-float: 2
 float128: 3
 ldouble: 4
 
 Function: "log10p1_downward":
 double: 2
-float: 3
 float128: 4
 ldouble: 8
 
 Function: "log10p1_towardzero":
 double: 3
-float: 2
 float128: 3
 ldouble: 8
 
 Function: "log10p1_upward":
 double: 2
-float: 3
 float128: 4
 ldouble: 6
 
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 16/17] x86_64: Add exp10m1f with FMA
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (14 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 15/17] math: Use log10p1f " Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-26 18:38   ` Noah Goldstein
  2024-10-30 20:06   ` DJ Delorie
  2024-10-25 18:21 ` [PATCH 17/17] x86_64: Add exp2m1f " Adhemerval Zanella
  2024-10-26 18:28 ` [PATCH 00/17] Add more CORE-MATH on libm Noah Goldstein
  17 siblings, 2 replies; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

The CORE-MATH exp10m1f implementation showed slight worse latency
when using x86_64 baseline ABI.  This patch adds a ifunc variant
with similar performance for x86_64-v3.
---
 sysdeps/ieee754/flt-32/s_exp10m1f.c           |  2 ++
 sysdeps/x86_64/fpu/multiarch/Makefile         |  2 ++
 sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c |  4 +++
 sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c     | 33 +++++++++++++++++++
 4 files changed, 41 insertions(+)
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c

diff --git a/sysdeps/ieee754/flt-32/s_exp10m1f.c b/sysdeps/ieee754/flt-32/s_exp10m1f.c
index 610f269b01..c918c905e8 100644
--- a/sysdeps/ieee754/flt-32/s_exp10m1f.c
+++ b/sysdeps/ieee754/flt-32/s_exp10m1f.c
@@ -222,4 +222,6 @@ __exp10m1f (float x)
       return (s - 1.0) + w * c0;
     }
 }
+#ifndef __exp10m1f
 libm_alias_float (__exp10m1, exp10m1)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile
index cbe09d49f4..dcff4df2f1 100644
--- a/sysdeps/x86_64/fpu/multiarch/Makefile
+++ b/sysdeps/x86_64/fpu/multiarch/Makefile
@@ -11,6 +11,7 @@ CFLAGS-s_log1p-fma.c = -mfma -mavx2
 CFLAGS-s_sin-fma.c = -mfma -mavx2
 CFLAGS-s_tan-fma.c = -mfma -mavx2
 CFLAGS-s_sincos-fma.c = -mfma -mavx2
+CFLAGS-s_exp10m1f-fma.c = -mfma -mavx2
 
 CFLAGS-e_exp2f-fma.c = -mfma -mavx2
 CFLAGS-e_expf-fma.c = -mfma -mavx2
@@ -72,6 +73,7 @@ libm-sysdep_routines += \
   s_ceilf-sse4_1 \
   s_cosf-fma \
   s_cosf-sse2 \
+  s_exp10m1f-fma \
   s_expm1-fma \
   s_floor-sse4_1 \
   s_floorf-sse4_1 \
diff --git a/sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c b/sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c
new file mode 100644
index 0000000000..3dda04e2dd
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c
@@ -0,0 +1,4 @@
+#define __exp10m1f __exp10m1f_fma
+#define SECTION __attribute__ ((section (".text.fma")))
+
+#include <sysdeps/ieee754/flt-32/s_exp10m1f.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c b/sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c
new file mode 100644
index 0000000000..8040b7ed79
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c
@@ -0,0 +1,33 @@
+/* Multiple versions of exp10m1.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-float.h>
+
+extern float __redirect_exp10m1f (float);
+
+# define SYMBOL_NAME exp10m1f
+# include "ifunc-fma.h"
+
+libc_ifunc_redirected (__redirect_exp10m1f, __exp10m1f, IFUNC_SELECTOR ());
+libm_alias_float (__exp10m1, exp10m1)
+
+# define __exp10m1f __exp10m1f_sse2
+#endif
+#include <sysdeps/ieee754/flt-32/s_exp10m1f.c>
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH 17/17] x86_64: Add exp2m1f with FMA
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (15 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 16/17] x86_64: Add exp10m1f with FMA Adhemerval Zanella
@ 2024-10-25 18:21 ` Adhemerval Zanella
  2024-10-25 19:10   ` Joseph Myers
                     ` (2 more replies)
  2024-10-26 18:28 ` [PATCH 00/17] Add more CORE-MATH on libm Noah Goldstein
  17 siblings, 3 replies; 53+ messages in thread
From: Adhemerval Zanella @ 2024-10-25 18:21 UTC (permalink / raw)
  To: libc-alpha; +Cc: Paul Zimmermann, Alexei Sibidanov

The CORE-MATH exp10m1f implementation showed slight worse latency
when using x86_64 baseline ABI.  This patch adds a ifunc variant
with similar performance for x86_64-v3.
---
 sysdeps/ieee754/flt-32/s_exp2m1f.c           |  2 ++
 sysdeps/x86_64/fpu/multiarch/Makefile        |  2 ++
 sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c |  4 +++
 sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c     | 33 ++++++++++++++++++++
 4 files changed, 41 insertions(+)
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c
 create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c

diff --git a/sysdeps/ieee754/flt-32/s_exp2m1f.c b/sysdeps/ieee754/flt-32/s_exp2m1f.c
index f899152d2a..3e79030888 100644
--- a/sysdeps/ieee754/flt-32/s_exp2m1f.c
+++ b/sysdeps/ieee754/flt-32/s_exp2m1f.c
@@ -189,4 +189,6 @@ __exp2m1f (float x)
       return (s - 1.0) + w * c0;
     }
 }
+#ifndef __exp2m1f
 libm_alias_float (__exp2m1, exp2m1)
+#endif
diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile
index dcff4df2f1..e823d2fcc6 100644
--- a/sysdeps/x86_64/fpu/multiarch/Makefile
+++ b/sysdeps/x86_64/fpu/multiarch/Makefile
@@ -12,6 +12,7 @@ CFLAGS-s_sin-fma.c = -mfma -mavx2
 CFLAGS-s_tan-fma.c = -mfma -mavx2
 CFLAGS-s_sincos-fma.c = -mfma -mavx2
 CFLAGS-s_exp10m1f-fma.c = -mfma -mavx2
+CFLAGS-s_exp2m1f-fma.c = -mfma -mavx2
 
 CFLAGS-e_exp2f-fma.c = -mfma -mavx2
 CFLAGS-e_expf-fma.c = -mfma -mavx2
@@ -74,6 +75,7 @@ libm-sysdep_routines += \
   s_cosf-fma \
   s_cosf-sse2 \
   s_exp10m1f-fma \
+  s_exp2m1f-fma \
   s_expm1-fma \
   s_floor-sse4_1 \
   s_floorf-sse4_1 \
diff --git a/sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c b/sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c
new file mode 100644
index 0000000000..bfa00eae4e
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c
@@ -0,0 +1,4 @@
+#define __exp2m1f __exp2m1f_fma
+#define SECTION __attribute__ ((section (".text.fma")))
+
+#include <sysdeps/ieee754/flt-32/s_exp2m1f.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c b/sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c
new file mode 100644
index 0000000000..8e2d7ec384
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c
@@ -0,0 +1,33 @@
+/* Multiple versions of exp2m1.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <sysdeps/x86/isa-level.h>
+#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
+# include <libm-alias-float.h>
+
+extern float __redirect_exp2m1f (float);
+
+# define SYMBOL_NAME exp2m1f
+# include "ifunc-fma.h"
+
+libc_ifunc_redirected (__redirect_exp2m1f, __exp2m1f, IFUNC_SELECTOR ());
+libm_alias_float (__exp2m1, exp2m1)
+
+# define __exp2m1f __exp2m1f_sse2
+#endif
+#include <sysdeps/ieee754/flt-32/s_exp2m1f.c>
-- 
2.43.0


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 17/17] x86_64: Add exp2m1f with FMA
  2024-10-25 18:21 ` [PATCH 17/17] x86_64: Add exp2m1f " Adhemerval Zanella
@ 2024-10-25 19:10   ` Joseph Myers
  2024-10-26 18:34   ` Noah Goldstein
  2024-10-30 20:09   ` DJ Delorie
  2 siblings, 0 replies; 53+ messages in thread
From: Joseph Myers @ 2024-10-25 19:10 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul Zimmermann, Alexei Sibidanov

On Fri, 25 Oct 2024, Adhemerval Zanella wrote:

> The CORE-MATH exp10m1f implementation showed slight worse latency
> when using x86_64 baseline ABI.  This patch adds a ifunc variant
> with similar performance for x86_64-v3.

This commit message should refer to exp2m1f, not exp10m1f.

-- 
Joseph S. Myers
josmyers@redhat.com


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 14/17] math: Use log1pf from CORE-MATH
  2024-10-25 18:21 ` [PATCH 14/17] math: Use log1pf " Adhemerval Zanella
@ 2024-10-25 19:12   ` Joseph Myers
  2024-10-25 20:07     ` Adhemerval Zanella Netto
  2024-10-31 21:20   ` DJ Delorie
  1 sibling, 1 reply; 53+ messages in thread
From: Joseph Myers @ 2024-10-25 19:12 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul Zimmermann, Alexei Sibidanov

On Fri, 25 Oct 2024, Adhemerval Zanella wrote:

> The CORE-MATH implementation is correctly rounded (for any rounding mode)
> and shows slight better performance to the generic log10pf.

This commit message should refer to log1pf, not log10pf.

-- 
Joseph S. Myers
josmyers@redhat.com


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 14/17] math: Use log1pf from CORE-MATH
  2024-10-25 19:12   ` Joseph Myers
@ 2024-10-25 20:07     ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 53+ messages in thread
From: Adhemerval Zanella Netto @ 2024-10-25 20:07 UTC (permalink / raw)
  To: Joseph Myers; +Cc: libc-alpha, Paul Zimmermann, Alexei Sibidanov



On 25/10/24 16:12, Joseph Myers wrote:
> On Fri, 25 Oct 2024, Adhemerval Zanella wrote:
> 
>> The CORE-MATH implementation is correctly rounded (for any rounding mode)
>> and shows slight better performance to the generic log10pf.
> 
> This commit message should refer to log1pf, not log10pf.
> 

Sigh, I though I had it fixed. Thanks for pointing out, Paul did it 
privately to me as well.

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 00/17] Add more CORE-MATH on libm
  2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
                   ` (16 preceding siblings ...)
  2024-10-25 18:21 ` [PATCH 17/17] x86_64: Add exp2m1f " Adhemerval Zanella
@ 2024-10-26 18:28 ` Noah Goldstein
  2024-10-28 12:09   ` Adhemerval Zanella Netto
  17 siblings, 1 reply; 53+ messages in thread
From: Noah Goldstein @ 2024-10-26 18:28 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul Zimmermann, Alexei Sibidanov

On Fri, Oct 25, 2024 at 1:26 PM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> Following the tgammaf implementation (392b3f0971764) and its telling
> performance improvement, I worked with Pauz Zimmermann to check if we
> can integrate more routines on glibc.
>
> This patchset adds the optimized and correctly rounded exp10m1f,
> exp2m1f, expm1f, log10f, log2p1f, log1pf, and log10p1f. I also added
> a benchmark to evaluate each implementation.
>
> I tested the implementation on recent hardware (Ryzen 9 5900X for
> x86_64, Ampere/Neoverse for aarch64, and POWER10 for powerpc), and
> most of the implementation shows impressive performance
> improvements. Like the implementation from ARM optimized routines,
> the CORE-MATH one takes advantage of recent ISA and platform support
> (like fma and rounding instructions, along with FP throughpu).
>
> For a couple of implementations, exp10m1f, and exp2m1f, CORE-MATH
> shows slightly worse performance for x86_64-v1. It is due the glibc
> generic implementation that calls optimized exp10f/exp2f, and when a
> more recent ISA is used (x86_64-v2 or x86_64-v3) CORE-MATH shows a
> better output than the current implementation. For both cases I added
> iFUNC support to use FMA on x86_64.
>
> Adhemerval Zanella (17):
>   math: Add e_gammaf_r to glibc code and style
>   benchtests: Add exp10m1f benchmark
>   benchtests: Add exp2m1f benchmark
>   benchtests: Add expm1f benchmark
>   benchtests: Add log10f benchmark
>   benchtests: Add log2p1f benchmark
>   benchtests: Add log1p benchmark
>   benchtests: Add log10p1f benchmark
>   math: Use exp10m1f from CORE-MATH
>   math: Use exp2m1f from CORE-MATH
>   math: Use expm1f from CORE-MATH
>   math: Use log10f from CORE-MATH
>   math: Use log2p1f from CORE-MATH
>   math: Use log1pf from CORE-MATH
>   math: Use log10p1f from CORE-MATH
>   x86_64: Add exp10m1f with FMA
>   x86_64: Add exp2m1f with FMA
>
>  SHARED-FILES                                  |   16 +
>  benchtests/Makefile                           |    7 +
>  benchtests/exp10m1f-inputs                    | 2389 ++++++++++++++
>  benchtests/exp2m1f-inputs                     | 2388 ++++++++++++++
>  benchtests/expm1f-inputs                      |  799 +++++
>  benchtests/log10f-inputs                      | 1005 ++++++
>  benchtests/log10p1f-inputs                    | 2888 +++++++++++++++++
>  benchtests/log1pf-inputs                      | 1005 ++++++
>  benchtests/log2p1f-inputs                     | 2888 +++++++++++++++++
>  sysdeps/aarch64/libm-test-ulps                |   29 +-
>  sysdeps/alpha/fpu/libm-test-ulps              |   12 -
>  sysdeps/arc/fpu/libm-test-ulps                |   25 -
>  sysdeps/arc/nofpu/libm-test-ulps              |    7 -
>  sysdeps/arm/libm-test-ulps                    |   31 +-
>  sysdeps/csky/fpu/libm-test-ulps               |   12 -
>  sysdeps/csky/nofpu/libm-test-ulps             |   12 -
>  sysdeps/hppa/fpu/libm-test-ulps               |   28 -
>  sysdeps/i386/fpu/e_log10f.S                   |   66 -
>  sysdeps/i386/fpu/libm-test-ulps               |   25 -
>  sysdeps/i386/fpu/s_expm1f.S                   |  112 -
>  sysdeps/i386/fpu/s_log1pf.S                   |   66 -
>  .../i386/i686/fpu/multiarch/libm-test-ulps    |   25 -
>  sysdeps/ieee754/flt-32/e_gammaf_r.c           |  178 +-
>  sysdeps/ieee754/flt-32/e_log10f.c             |  196 +-
>  sysdeps/ieee754/flt-32/s_exp10m1f.c           |  227 ++
>  sysdeps/ieee754/flt-32/s_exp2m1f.c            |  194 ++
>  sysdeps/ieee754/flt-32/s_expm1f.c             |  232 +-
>  sysdeps/ieee754/flt-32/s_log10p1f.c           |  182 ++
>  sysdeps/ieee754/flt-32/s_log1pf.c             |  271 +-
>  sysdeps/ieee754/flt-32/s_log2p1f.c            |  248 ++
>  .../math_errf.c => ieee754/flt-32/w_log1pf.c} |    0
>  sysdeps/loongarch/lp64/libm-test-ulps         |   28 -
>  sysdeps/m68k/coldfire/fpu/libm-test-ulps      |    6 -
>  sysdeps/m68k/m680x0/fpu/libm-test-ulps        |   12 -
>  sysdeps/m68k/m680x0/fpu/w_log1pf.c            |   20 +
>  sysdeps/microblaze/libm-test-ulps             |    3 -
>  sysdeps/mips/mips32/libm-test-ulps            |   28 -
>  sysdeps/mips/mips64/libm-test-ulps            |   28 -
>  sysdeps/nios2/libm-test-ulps                  |    3 -
>  sysdeps/or1k/fpu/libm-test-ulps               |    4 -
>  sysdeps/or1k/nofpu/libm-test-ulps             |   12 -
>  sysdeps/powerpc/fpu/libm-test-ulps            |   29 +-
>  sysdeps/powerpc/nofpu/libm-test-ulps          |   28 -
>  sysdeps/riscv/nofpu/libm-test-ulps            |   16 -
>  sysdeps/riscv/rvd/libm-test-ulps              |   28 -
>  sysdeps/s390/fpu/libm-test-ulps               |   28 -
>  sysdeps/sh/libm-test-ulps                     |    6 -
>  sysdeps/sparc/fpu/libm-test-ulps              |   28 -
>  sysdeps/x86_64/fpu/libm-test-ulps             |   29 +-
>  sysdeps/x86_64/fpu/multiarch/Makefile         |    4 +
>  sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c |    4 +
>  sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c     |   33 +
>  sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c  |    4 +
>  sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c      |   33 +
>  54 files changed, 14873 insertions(+), 1104 deletions(-)
>  create mode 100644 benchtests/exp10m1f-inputs
>  create mode 100644 benchtests/exp2m1f-inputs
>  create mode 100644 benchtests/expm1f-inputs
>  create mode 100644 benchtests/log10f-inputs
>  create mode 100644 benchtests/log10p1f-inputs
>  create mode 100644 benchtests/log1pf-inputs
>  create mode 100644 benchtests/log2p1f-inputs
>  delete mode 100644 sysdeps/i386/fpu/e_log10f.S
>  delete mode 100644 sysdeps/i386/fpu/s_expm1f.S
>  delete mode 100644 sysdeps/i386/fpu/s_log1pf.S
>  create mode 100644 sysdeps/ieee754/flt-32/s_exp10m1f.c
>  create mode 100644 sysdeps/ieee754/flt-32/s_exp2m1f.c
>  create mode 100644 sysdeps/ieee754/flt-32/s_log10p1f.c
>  create mode 100644 sysdeps/ieee754/flt-32/s_log2p1f.c
>  rename sysdeps/{m68k/m680x0/fpu/math_errf.c => ieee754/flt-32/w_log1pf.c} (100%)
>  create mode 100644 sysdeps/m68k/m680x0/fpu/w_log1pf.c
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c
>
> --
> 2.43.0
>

Whitespace issues in some of your patches:
```
Applying: math: Add e_gammaf_r to glibc code and style
Applying: benchtests: Add exp10m1f benchmark
Applying: benchtests: Add exp2m1f benchmark
Applying: benchtests: Add expm1f benchmark
Applying: benchtests: Add log10f benchmark
Applying: benchtests: Add log2p1f benchmark
Applying: benchtests: Add log1p benchmark
Applying: benchtests: Add log10p1f benchmark
Applying: math: Use exp10m1f from CORE-MATH
Applying: math: Use exp2m1f from CORE-MATH
Applying: math: Use expm1f from CORE-MATH
Applying: math: Use log2p1f from CORE-MATH
.git/rebase-apply/patch:402: space before tab in indent.
               {
.git/rebase-apply/patch:456: space before tab in indent.
           };
warning: 2 lines add whitespace errors.
Applying: math: Use log10p1f from CORE-MATH
.git/rebase-apply/patch:352: trailing whitespace.
        {
.git/rebase-apply/patch:366: space before tab in indent.
           {
warning: 2 lines add whitespace errors.
Applying: x86_64: Add exp10m1f with FMA
Applying: x86_64: Add exp2m1f with FMA
```

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 17/17] x86_64: Add exp2m1f with FMA
  2024-10-25 18:21 ` [PATCH 17/17] x86_64: Add exp2m1f " Adhemerval Zanella
  2024-10-25 19:10   ` Joseph Myers
@ 2024-10-26 18:34   ` Noah Goldstein
  2024-10-30 20:09   ` DJ Delorie
  2 siblings, 0 replies; 53+ messages in thread
From: Noah Goldstein @ 2024-10-26 18:34 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul Zimmermann, Alexei Sibidanov

On Fri, Oct 25, 2024 at 1:31 PM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> The CORE-MATH exp10m1f implementation showed slight worse latency
> when using x86_64 baseline ABI.  This patch adds a ifunc variant
> with similar performance for x86_64-v3.
> ---
>  sysdeps/ieee754/flt-32/s_exp2m1f.c           |  2 ++
>  sysdeps/x86_64/fpu/multiarch/Makefile        |  2 ++
>  sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c |  4 +++
>  sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c     | 33 ++++++++++++++++++++
>  4 files changed, 41 insertions(+)
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c
>
> diff --git a/sysdeps/ieee754/flt-32/s_exp2m1f.c b/sysdeps/ieee754/flt-32/s_exp2m1f.c
> index f899152d2a..3e79030888 100644
> --- a/sysdeps/ieee754/flt-32/s_exp2m1f.c
> +++ b/sysdeps/ieee754/flt-32/s_exp2m1f.c
> @@ -189,4 +189,6 @@ __exp2m1f (float x)
>        return (s - 1.0) + w * c0;
>      }
>  }
> +#ifndef __exp2m1f
>  libm_alias_float (__exp2m1, exp2m1)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile
> index dcff4df2f1..e823d2fcc6 100644
> --- a/sysdeps/x86_64/fpu/multiarch/Makefile
> +++ b/sysdeps/x86_64/fpu/multiarch/Makefile
> @@ -12,6 +12,7 @@ CFLAGS-s_sin-fma.c = -mfma -mavx2
>  CFLAGS-s_tan-fma.c = -mfma -mavx2
>  CFLAGS-s_sincos-fma.c = -mfma -mavx2
>  CFLAGS-s_exp10m1f-fma.c = -mfma -mavx2
> +CFLAGS-s_exp2m1f-fma.c = -mfma -mavx2
>
>  CFLAGS-e_exp2f-fma.c = -mfma -mavx2
>  CFLAGS-e_expf-fma.c = -mfma -mavx2
> @@ -74,6 +75,7 @@ libm-sysdep_routines += \
>    s_cosf-fma \
>    s_cosf-sse2 \
>    s_exp10m1f-fma \
> +  s_exp2m1f-fma \
>    s_expm1-fma \
>    s_floor-sse4_1 \
>    s_floorf-sse4_1 \
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c b/sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c
> new file mode 100644
> index 0000000000..bfa00eae4e
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c
> @@ -0,0 +1,4 @@
> +#define __exp2m1f __exp2m1f_fma
> +#define SECTION __attribute__ ((section (".text.fma")))
> +
> +#include <sysdeps/ieee754/flt-32/s_exp2m1f.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c b/sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c
> new file mode 100644
> index 0000000000..8e2d7ec384
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c
> @@ -0,0 +1,33 @@
> +/* Multiple versions of exp2m1.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +
> +extern float __redirect_exp2m1f (float);
> +
> +# define SYMBOL_NAME exp2m1f
> +# include "ifunc-fma.h"
> +
> +libc_ifunc_redirected (__redirect_exp2m1f, __exp2m1f, IFUNC_SELECTOR ());
> +libm_alias_float (__exp2m1, exp2m1)
> +
> +# define __exp2m1f __exp2m1f_sse2
> +#endif
> +#include <sysdeps/ieee754/flt-32/s_exp2m1f.c>
> --
> 2.43.0
>

Code LGTM but please update commit message to reference correct function.

Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 16/17] x86_64: Add exp10m1f with FMA
  2024-10-25 18:21 ` [PATCH 16/17] x86_64: Add exp10m1f with FMA Adhemerval Zanella
@ 2024-10-26 18:38   ` Noah Goldstein
  2024-10-30 20:06   ` DJ Delorie
  1 sibling, 0 replies; 53+ messages in thread
From: Noah Goldstein @ 2024-10-26 18:38 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul Zimmermann, Alexei Sibidanov

On Fri, Oct 25, 2024 at 1:31 PM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> The CORE-MATH exp10m1f implementation showed slight worse latency
> when using x86_64 baseline ABI.  This patch adds a ifunc variant
> with similar performance for x86_64-v3.
> ---
>  sysdeps/ieee754/flt-32/s_exp10m1f.c           |  2 ++
>  sysdeps/x86_64/fpu/multiarch/Makefile         |  2 ++
>  sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c |  4 +++
>  sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c     | 33 +++++++++++++++++++
>  4 files changed, 41 insertions(+)
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c
>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c
>
> diff --git a/sysdeps/ieee754/flt-32/s_exp10m1f.c b/sysdeps/ieee754/flt-32/s_exp10m1f.c
> index 610f269b01..c918c905e8 100644
> --- a/sysdeps/ieee754/flt-32/s_exp10m1f.c
> +++ b/sysdeps/ieee754/flt-32/s_exp10m1f.c
> @@ -222,4 +222,6 @@ __exp10m1f (float x)
>        return (s - 1.0) + w * c0;
>      }
>  }
> +#ifndef __exp10m1f
>  libm_alias_float (__exp10m1, exp10m1)
> +#endif
> diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile
> index cbe09d49f4..dcff4df2f1 100644
> --- a/sysdeps/x86_64/fpu/multiarch/Makefile
> +++ b/sysdeps/x86_64/fpu/multiarch/Makefile
> @@ -11,6 +11,7 @@ CFLAGS-s_log1p-fma.c = -mfma -mavx2
>  CFLAGS-s_sin-fma.c = -mfma -mavx2
>  CFLAGS-s_tan-fma.c = -mfma -mavx2
>  CFLAGS-s_sincos-fma.c = -mfma -mavx2
> +CFLAGS-s_exp10m1f-fma.c = -mfma -mavx2
>
>  CFLAGS-e_exp2f-fma.c = -mfma -mavx2
>  CFLAGS-e_expf-fma.c = -mfma -mavx2
> @@ -72,6 +73,7 @@ libm-sysdep_routines += \
>    s_ceilf-sse4_1 \
>    s_cosf-fma \
>    s_cosf-sse2 \
> +  s_exp10m1f-fma \
>    s_expm1-fma \
>    s_floor-sse4_1 \
>    s_floorf-sse4_1 \
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c b/sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c
> new file mode 100644
> index 0000000000..3dda04e2dd
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c
> @@ -0,0 +1,4 @@
> +#define __exp10m1f __exp10m1f_fma
> +#define SECTION __attribute__ ((section (".text.fma")))
> +
> +#include <sysdeps/ieee754/flt-32/s_exp10m1f.c>
> diff --git a/sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c b/sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c
> new file mode 100644
> index 0000000000..8040b7ed79
> --- /dev/null
> +++ b/sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c
> @@ -0,0 +1,33 @@
> +/* Multiple versions of exp10m1.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +
> +extern float __redirect_exp10m1f (float);
> +
> +# define SYMBOL_NAME exp10m1f
> +# include "ifunc-fma.h"
> +
> +libc_ifunc_redirected (__redirect_exp10m1f, __exp10m1f, IFUNC_SELECTOR ());
> +libm_alias_float (__exp10m1, exp10m1)
> +
> +# define __exp10m1f __exp10m1f_sse2
> +#endif
> +#include <sysdeps/ieee754/flt-32/s_exp10m1f.c>
> --
> 2.43.0
>

LGTM
Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 00/17] Add more CORE-MATH on libm
  2024-10-26 18:28 ` [PATCH 00/17] Add more CORE-MATH on libm Noah Goldstein
@ 2024-10-28 12:09   ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 53+ messages in thread
From: Adhemerval Zanella Netto @ 2024-10-28 12:09 UTC (permalink / raw)
  To: Noah Goldstein; +Cc: libc-alpha, Paul Zimmermann, Alexei Sibidanov



On 26/10/24 15:28, Noah Goldstein wrote:
> On Fri, Oct 25, 2024 at 1:26 PM Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>>
>> Following the tgammaf implementation (392b3f0971764) and its telling
>> performance improvement, I worked with Pauz Zimmermann to check if we
>> can integrate more routines on glibc.
>>
>> This patchset adds the optimized and correctly rounded exp10m1f,
>> exp2m1f, expm1f, log10f, log2p1f, log1pf, and log10p1f. I also added
>> a benchmark to evaluate each implementation.
>>
>> I tested the implementation on recent hardware (Ryzen 9 5900X for
>> x86_64, Ampere/Neoverse for aarch64, and POWER10 for powerpc), and
>> most of the implementation shows impressive performance
>> improvements. Like the implementation from ARM optimized routines,
>> the CORE-MATH one takes advantage of recent ISA and platform support
>> (like fma and rounding instructions, along with FP throughpu).
>>
>> For a couple of implementations, exp10m1f, and exp2m1f, CORE-MATH
>> shows slightly worse performance for x86_64-v1. It is due the glibc
>> generic implementation that calls optimized exp10f/exp2f, and when a
>> more recent ISA is used (x86_64-v2 or x86_64-v3) CORE-MATH shows a
>> better output than the current implementation. For both cases I added
>> iFUNC support to use FMA on x86_64.
>>
>> Adhemerval Zanella (17):
>>   math: Add e_gammaf_r to glibc code and style
>>   benchtests: Add exp10m1f benchmark
>>   benchtests: Add exp2m1f benchmark
>>   benchtests: Add expm1f benchmark
>>   benchtests: Add log10f benchmark
>>   benchtests: Add log2p1f benchmark
>>   benchtests: Add log1p benchmark
>>   benchtests: Add log10p1f benchmark
>>   math: Use exp10m1f from CORE-MATH
>>   math: Use exp2m1f from CORE-MATH
>>   math: Use expm1f from CORE-MATH
>>   math: Use log10f from CORE-MATH
>>   math: Use log2p1f from CORE-MATH
>>   math: Use log1pf from CORE-MATH
>>   math: Use log10p1f from CORE-MATH
>>   x86_64: Add exp10m1f with FMA
>>   x86_64: Add exp2m1f with FMA
>>
>>  SHARED-FILES                                  |   16 +
>>  benchtests/Makefile                           |    7 +
>>  benchtests/exp10m1f-inputs                    | 2389 ++++++++++++++
>>  benchtests/exp2m1f-inputs                     | 2388 ++++++++++++++
>>  benchtests/expm1f-inputs                      |  799 +++++
>>  benchtests/log10f-inputs                      | 1005 ++++++
>>  benchtests/log10p1f-inputs                    | 2888 +++++++++++++++++
>>  benchtests/log1pf-inputs                      | 1005 ++++++
>>  benchtests/log2p1f-inputs                     | 2888 +++++++++++++++++
>>  sysdeps/aarch64/libm-test-ulps                |   29 +-
>>  sysdeps/alpha/fpu/libm-test-ulps              |   12 -
>>  sysdeps/arc/fpu/libm-test-ulps                |   25 -
>>  sysdeps/arc/nofpu/libm-test-ulps              |    7 -
>>  sysdeps/arm/libm-test-ulps                    |   31 +-
>>  sysdeps/csky/fpu/libm-test-ulps               |   12 -
>>  sysdeps/csky/nofpu/libm-test-ulps             |   12 -
>>  sysdeps/hppa/fpu/libm-test-ulps               |   28 -
>>  sysdeps/i386/fpu/e_log10f.S                   |   66 -
>>  sysdeps/i386/fpu/libm-test-ulps               |   25 -
>>  sysdeps/i386/fpu/s_expm1f.S                   |  112 -
>>  sysdeps/i386/fpu/s_log1pf.S                   |   66 -
>>  .../i386/i686/fpu/multiarch/libm-test-ulps    |   25 -
>>  sysdeps/ieee754/flt-32/e_gammaf_r.c           |  178 +-
>>  sysdeps/ieee754/flt-32/e_log10f.c             |  196 +-
>>  sysdeps/ieee754/flt-32/s_exp10m1f.c           |  227 ++
>>  sysdeps/ieee754/flt-32/s_exp2m1f.c            |  194 ++
>>  sysdeps/ieee754/flt-32/s_expm1f.c             |  232 +-
>>  sysdeps/ieee754/flt-32/s_log10p1f.c           |  182 ++
>>  sysdeps/ieee754/flt-32/s_log1pf.c             |  271 +-
>>  sysdeps/ieee754/flt-32/s_log2p1f.c            |  248 ++
>>  .../math_errf.c => ieee754/flt-32/w_log1pf.c} |    0
>>  sysdeps/loongarch/lp64/libm-test-ulps         |   28 -
>>  sysdeps/m68k/coldfire/fpu/libm-test-ulps      |    6 -
>>  sysdeps/m68k/m680x0/fpu/libm-test-ulps        |   12 -
>>  sysdeps/m68k/m680x0/fpu/w_log1pf.c            |   20 +
>>  sysdeps/microblaze/libm-test-ulps             |    3 -
>>  sysdeps/mips/mips32/libm-test-ulps            |   28 -
>>  sysdeps/mips/mips64/libm-test-ulps            |   28 -
>>  sysdeps/nios2/libm-test-ulps                  |    3 -
>>  sysdeps/or1k/fpu/libm-test-ulps               |    4 -
>>  sysdeps/or1k/nofpu/libm-test-ulps             |   12 -
>>  sysdeps/powerpc/fpu/libm-test-ulps            |   29 +-
>>  sysdeps/powerpc/nofpu/libm-test-ulps          |   28 -
>>  sysdeps/riscv/nofpu/libm-test-ulps            |   16 -
>>  sysdeps/riscv/rvd/libm-test-ulps              |   28 -
>>  sysdeps/s390/fpu/libm-test-ulps               |   28 -
>>  sysdeps/sh/libm-test-ulps                     |    6 -
>>  sysdeps/sparc/fpu/libm-test-ulps              |   28 -
>>  sysdeps/x86_64/fpu/libm-test-ulps             |   29 +-
>>  sysdeps/x86_64/fpu/multiarch/Makefile         |    4 +
>>  sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c |    4 +
>>  sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c     |   33 +
>>  sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c  |    4 +
>>  sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c      |   33 +
>>  54 files changed, 14873 insertions(+), 1104 deletions(-)
>>  create mode 100644 benchtests/exp10m1f-inputs
>>  create mode 100644 benchtests/exp2m1f-inputs
>>  create mode 100644 benchtests/expm1f-inputs
>>  create mode 100644 benchtests/log10f-inputs
>>  create mode 100644 benchtests/log10p1f-inputs
>>  create mode 100644 benchtests/log1pf-inputs
>>  create mode 100644 benchtests/log2p1f-inputs
>>  delete mode 100644 sysdeps/i386/fpu/e_log10f.S
>>  delete mode 100644 sysdeps/i386/fpu/s_expm1f.S
>>  delete mode 100644 sysdeps/i386/fpu/s_log1pf.S
>>  create mode 100644 sysdeps/ieee754/flt-32/s_exp10m1f.c
>>  create mode 100644 sysdeps/ieee754/flt-32/s_exp2m1f.c
>>  create mode 100644 sysdeps/ieee754/flt-32/s_log10p1f.c
>>  create mode 100644 sysdeps/ieee754/flt-32/s_log2p1f.c
>>  rename sysdeps/{m68k/m680x0/fpu/math_errf.c => ieee754/flt-32/w_log1pf.c} (100%)
>>  create mode 100644 sysdeps/m68k/m680x0/fpu/w_log1pf.c
>>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c
>>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c
>>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c
>>  create mode 100644 sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c
>>
>> --
>> 2.43.0
>>
> 
> Whitespace issues in some of your patches:
> ```
> Applying: math: Add e_gammaf_r to glibc code and style
> Applying: benchtests: Add exp10m1f benchmark
> Applying: benchtests: Add exp2m1f benchmark
> Applying: benchtests: Add expm1f benchmark
> Applying: benchtests: Add log10f benchmark
> Applying: benchtests: Add log2p1f benchmark
> Applying: benchtests: Add log1p benchmark
> Applying: benchtests: Add log10p1f benchmark
> Applying: math: Use exp10m1f from CORE-MATH
> Applying: math: Use exp2m1f from CORE-MATH
> Applying: math: Use expm1f from CORE-MATH
> Applying: math: Use log2p1f from CORE-MATH
> .git/rebase-apply/patch:402: space before tab in indent.
>                {
> .git/rebase-apply/patch:456: space before tab in indent.
>            };
> warning: 2 lines add whitespace errors.
> Applying: math: Use log10p1f from CORE-MATH
> .git/rebase-apply/patch:352: trailing whitespace.
>         {
> .git/rebase-apply/patch:366: space before tab in indent.
>            {
> warning: 2 lines add whitespace errors.
> Applying: x86_64: Add exp10m1f with FMA
> Applying: x86_64: Add exp2m1f with FMA
> ```

Thanks, I have fixed it loacally.

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 01/17] math: Add e_gammaf_r to glibc code and style
  2024-10-25 18:21 ` [PATCH 01/17] math: Add e_gammaf_r to glibc code and style Adhemerval Zanella
@ 2024-10-29  2:58   ` DJ Delorie
  2024-10-31 12:18     ` Adhemerval Zanella Netto
  0 siblings, 1 reply; 53+ messages in thread
From: DJ Delorie @ 2024-10-29  2:58 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


A few comments that were reformatted but lack two spaces after '.'

Otherwise LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

FYI I would have lined up the '0x' in all those tables (i.e. put a space
before all positive ones), but that's just me ;-)

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/sysdeps/ieee754/flt-32/e_gammaf_r.c b/sysdeps/ieee754/flt-32/e_gammaf_r.c
> -
> -typedef union {float f; uint32_t u;} b32u32_u;
> -typedef union {double f; uint64_t u;} b64u64_u;
> +#include "math_config.h"

Ok

>  
>    /* List of exceptional cases. Each entry contains the 32-bit encoding u of x,
>       a binary32 approximation f of gamma(x), and a correction term df.  */
> -  static const struct {uint32_t u; float f, df;} tb[] = {
> -    {0x27de86a9u, 0x1.268266p+47f, 0x1p22f},      // x = 0x1.bd0d52p-48
> -    {0x27e05475u, 0x1.242422p+47f, 0x1p22f},      // x = 0x1.c0a8eap-48
> -    {0xb63befb3u, -0x1.5cb6e4p+18f, 0x1p-7f},     // x = -0x1.77df66p-19
> -    {0x3c7bb570u, 0x1.021d9p+6f, 0x1p-19f},       // x = 0x1.f76aep-7
> -    {0x41e886d1u, 0x1.33136ap+98f, 0x1p73f},      // x = 0x1.d10da2p+4
> -    {0xc067d177u, 0x1.f6850cp-3f, 0x1p-28f},      // x = -0x1.cfa2eep+1
> -    {0xbd99da31u, -0x1.befe66p+3, -0x1p-22f},     // x = -0x1.33b462p-4
> -    {0xbf54c45au, -0x1.a6b4ecp+2, +0x1p-23f},     // x = -0x1.a988b4p-1
> -    {0x41ee77feu, 0x1.d3631cp+101, -0x1p-76f},    // x = 0x1.dceffcp+4
> -    {0x3f843a64u, 0x1.f6c638p-1, 0x1p-26f},       // x = 0x1.0874c8p+0
> +  static const struct
> +  {
> +    uint32_t u;
> +    float f, df;
> +  } tb[] = {
> +    { 0x27de86a9u, 0x1.268266p+47f, 0x1p22f },	 /* x = 0x1.bd0d52p-48 */
> +    { 0x27e05475u, 0x1.242422p+47f, 0x1p22f },	 /* x = 0x1.c0a8eap-48 */
> +    { 0xb63befb3u, -0x1.5cb6e4p+18f, 0x1p-7f },	 /* x = -0x1.77df66p-19 */
> +    { 0x3c7bb570u, 0x1.021d9p+6f, 0x1p-19f },	 /* x = 0x1.f76aep-7 */
> +    { 0x41e886d1u, 0x1.33136ap+98f, 0x1p73f },	 /* x = 0x1.d10da2p+4 */
> +    { 0xc067d177u, 0x1.f6850cp-3f, 0x1p-28f },	 /* x = -0x1.cfa2eep+1 */
> +    { 0xbd99da31u, -0x1.befe66p+3, -0x1p-22f },	 /* x = -0x1.33b462p-4 */
> +    { 0xbf54c45au, -0x1.a6b4ecp+2, +0x1p-23f },	 /* x = -0x1.a988b4p-1 */
> +    { 0x41ee77feu, 0x1.d3631cp+101, -0x1p-76f }, /* x = 0x1.dceffcp+4 */
> +    { 0x3f843a64u, 0x1.f6c638p-1, 0x1p-26f },	 /* x = 0x1.0874c8p+0 */
>    };

Format change, ok.

> -  b32u32_u t = {.f = x};
> -  uint32_t ax = t.u<<1;
> -  if(__builtin_expect(ax>=(0xffu<<24), 0)){ /* x=NaN or +/-Inf */
> -    if(ax==(0xffu<<24)){ /* x=+/-Inf */
> -      if(t.u>>31){ /* x=-Inf */
> -        return x / x; /* will raise the "Invalid operation" exception */
> -      }
> -      return x; /* x=+Inf */
> +  uint32_t t = asuint (x);
> +  uint32_t ax = t << 1;
> +  if (__glibc_unlikely (ax >= (0xffu << 24)))
> +    { /* x=NaN or +/-Inf */
> +      if (ax == (0xffu << 24))
> +	{ /* x=+/-Inf */
> +	  if (t >> 31) /* x=-Inf */
> +	    return __math_invalidf (x);
> +	  return x; /* x=+Inf */
> +	}
> +      return x + x; /* x=NaN, where x+x ensures the "Invalid operation"
> +		       exception is set if x is sNaN */
>      }
> -    return x + x; /* x=NaN, where x+x ensures the "Invalid operation"
> -                     exception is set if x is sNaN */
> -  }

Ok.

>    double z = x;
> -  if(__builtin_expect(ax<0x6d000000u, 0)){ /* |x| < 0x1p-18 */
> -    volatile double d = (0x1.fa658c23b1578p-1 - 0x1.d0a118f324b63p-1*z)*z - 0x1.2788cfc6fb619p-1;
> -    double f = 1.0/z + d;
> -    float r = f;
> -    b64u64_u rt = {.f = f};
> -    if(((rt.u+2)&0xfffffff) < 4){
> -      for(unsigned i=0;i<sizeof(tb)/sizeof(tb[0]);i++)
> -	if(t.u==tb[i].u) return tb[i].f + tb[i].df;
> +  if (__glibc_unlikely (ax < 0x6d000000u))
> +    { /* |x| < 0x1p-18 */
> +      volatile double d = (0x1.fa658c23b1578p-1 - 0x1.d0a118f324b63p-1 * z)
> +	* z - 0x1.2788cfc6fb619p-1;
> +      double f = 1.0 / z + d;
> +      float r = f;
> +      uint64_t rt = asuint64 (f);
> +      if (((rt + 2) & 0xfffffff) < 4)
> +	{
> +	  for (unsigned i = 0; i < sizeof (tb) / sizeof (tb[0]); i++)
> +	    if (t == tb[i].u)
> +	      return tb[i].f + tb[i].df;
> +	}

Ok.

> +      return r;
> +    }
> +  float fx = floorf (x);
> +  if (__glibc_unlikely (x >= 0x1.18522p+5f))
> +    {
> +      /* Overflow case. The original CORE-MATH code returns 0x1p127f *

Two spaces after period.

> +	 0x1p127f, but apparently some compilers replace this by +Inf.  */
> +      return math_narrow_eval (x * 0x1p127f);
>      }
> -    return r;
> -  }
> -  float fx = __builtin_floorf(x);
> -  if(__builtin_expect(x >= 0x1.18522p+5f, 0)){
> -    /* Overflow case. The original CORE-MATH code returns 0x1p127f * 0x1p127f,
> -       but apparently some compilers replace this by +Inf.  */
> -    return math_narrow_eval (x * 0x1p127f);
> -  }

Ok.

>    /* compute k only after the overflow check, otherwise the case to integer
>       might overflow */
>    int k = fx;
> -  if(__builtin_expect(fx==x, 0)){ /* x is integer */
> -    if(x == 0.0f){
> -      return 1.0f/x;
> +  if (__glibc_unlikely (fx == x))
> +    { /* x is integer */
> +      if (x == 0.0f)
> +	return 1.0f / x;
> +      if (x < 0.0f)
> +	return __math_invalidf (0.0f);
>      }
> -    if(x < 0.0f){
> -      return 0.0f / 0.0f; /* should raise the "Invalid operation" exception */

Ok.

> +      double t0 = 1, x0 = 1;
> +      for (int i = 1; i < k; i++, x0 += 1.0)
> +	t0 *= x0;
> +      return t0;
> +  if (__glibc_unlikely (x < -42.0f))
> +    { /* negative non-integer */
> +      /* For x < -42, x non-integer, |gamma(x)| < 2^-151.  */
> +      static const float sgn[2] = { 0x1p-127f, -0x1p-127f };
> +      /* Underflows always happens */
> +      return math_narrow_eval (0x1p-127f * sgn[k & 1]);
>      }
> -    double t0 = 1, x0 = 1;
> -    for(int i=1; i<k; i++, x0 += 1.0) t0 *= x0;
> -    return t0;
> -  }
> -  if(__builtin_expect(x<-42.0f, 0)){ /* negative non-integer */
> -    /* For x < -42, x non-integer, |gamma(x)| < 2^-151.  */
> -    static const float sgn[2] = {0x1p-127f, -0x1p-127f};
> -    /* Underflows always happens */
> -    return math_narrow_eval (0x1p-127f * sgn[k&1]);
> -  }

Ok.

> -  /* The array c[] stores a degree-15 polynomial approximation for gamma(x).  */
> +  /* The array c[] stores a degree-15 polynomial approximation for gamma(x). */

Two spaces after a period.

>    static const double c[] =
> -    {0x1.c9a76be577123p+0, 0x1.8f2754ddcf90dp+0, 0x1.0d1191949419bp+0, 0x1.e1f42cf0ae4a1p-2,
> -     0x1.82b358a3ab638p-3, 0x1.e1f2b30cd907bp-5, 0x1.240f6d4071bd8p-6, 0x1.1522c9f3cd012p-8,
> -     0x1.1fd0051a0525bp-10, 0x1.9808a8b96c37ep-13, 0x1.b3f78e01152b5p-15, 0x1.49c85a7e1fd04p-18,
> -     0x1.471ca49184475p-19, -0x1.368f0b7ed9e36p-23, 0x1.882222f9049efp-23, -0x1.a69ed2042842cp-25};
> +    {
> +      0x1.c9a76be577123p+0,  0x1.8f2754ddcf90dp+0,   0x1.0d1191949419bp+0,
> +      0x1.e1f42cf0ae4a1p-2,  0x1.82b358a3ab638p-3,   0x1.e1f2b30cd907bp-5,
> +      0x1.240f6d4071bd8p-6,  0x1.1522c9f3cd012p-8,   0x1.1fd0051a0525bp-10,
> +      0x1.9808a8b96c37ep-13, 0x1.b3f78e01152b5p-15,  0x1.49c85a7e1fd04p-18,
> +      0x1.471ca49184475p-19, -0x1.368f0b7ed9e36p-23, 0x1.882222f9049efp-23,
> +      -0x1.a69ed2042842cp-25
> +   };

Ok.

> -  double m = z - 0x1.7p+1, i = __builtin_roundeven(m), step = __builtin_copysign(1.0,i);
> -  double d = m - i, d2 = d*d, d4 = d2*d2, d8 = d4*d4;
> -  double f = (c[0] + d*c[1]) + d2*(c[2] + d*c[3]) + d4*((c[4] + d*c[5]) + d2*(c[6] + d*c[7]))
> -    + d8*((c[8] + d*c[9]) + d2*(c[10] + d*c[11]) + d4*((c[12] + d*c[13]) + d2*(c[14] + d*c[15])));
> -  int jm = __builtin_fabs(i);
> +  double m = z - 0x1.7p+1;
> +  double i = roundeven (m);
> +  double step = copysign (1.0, i);
> +  double d = m - i, d2 = d * d, d4 = d2 * d2, d8 = d4 * d4;
> +  double f = (c[0] + d * c[1]) + d2 * (c[2] + d * c[3])
> +	     + d4 * ((c[4] + d * c[5]) + d2 * (c[6] + d * c[7]))
> +	     + d8 * ((c[8] + d * c[9]) + d2 * (c[10] + d * c[11])
> +		     + d4 * ((c[12] + d * c[13]) + d2 * (c[14] + d * c[15])));
> +  int jm = fabs (i);

Ok.

>    double w = 1;
> -  if(jm){
> -    z -= 0.5 + step*0.5;
> -    w = z;
> -    for(int j=jm-1; j; j--) {z -= step; w *= z;}
> -  }
> -  if(i<=-0.5) w = 1/w;
> +  if (jm)
> +    {
> +      z -= 0.5 + step * 0.5;
> +      w = z;
> +      for (int j = jm - 1; j; j--)
> +	{
> +	  z -= step;
> +	  w *= z;
> +	}
> +    }
> +  if (i <= -0.5)
> +    w = 1 / w;

Ok.

>    f *= w;
> -  b64u64_u rt = {.f = f};
> +  uint64_t rt = asuint64 (f);

Ok.

>    float r = f;
>    /* Deal with exceptional cases.  */
> -  if(__builtin_expect(((rt.u+2)&0xfffffff) < 8, 0)){
> -    for(unsigned j=0;j<sizeof(tb)/sizeof(tb[0]);j++) {
> -      if(t.u==tb[j].u) return tb[j].f + tb[j].df;
> +  if (__glibc_unlikely (((rt + 2) & 0xfffffff) < 8))
> +    {
> +      for (unsigned j = 0; j < sizeof (tb) / sizeof (tb[0]); j++)
> +	if (t == tb[j].u)
> +	  return tb[j].f + tb[j].df;
>      }
> -  }
>    return r;
>  }

> diff --git a/sysdeps/m68k/m680x0/fpu/math_errf.c b/sysdeps/m68k/m680x0/fpu/math_errf.c
> deleted file mode 100644
> index 1cc8931700..0000000000
> --- a/sysdeps/m68k/m680x0/fpu/math_errf.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -/* Not needed.  */

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 02/17] benchtests: Add exp10m1f benchmark
  2024-10-25 18:21 ` [PATCH 02/17] benchtests: Add exp10m1f benchmark Adhemerval Zanella
@ 2024-10-29 18:16   ` DJ Delorie
  0 siblings, 0 replies; 53+ messages in thread
From: DJ Delorie @ 2024-10-29 18:16 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/benchtests/Makefile b/benchtests/Makefile
> index 79d802aaf0..6d57155437 100644
> --- a/benchtests/Makefile
> +++ b/benchtests/Makefile
> @@ -42,6 +42,7 @@ bench-math := \
>    exp \
>    exp10 \
>    exp10f \
> +  exp10m1f \
>    exp2 \
>    exp2f \
>    expf \

Ok.

> diff --git a/benchtests/exp10m1f-inputs b/benchtests/exp10m1f-inputs

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 03/17] benchtests: Add exp2m1f benchmark
  2024-10-25 18:21 ` [PATCH 03/17] benchtests: Add exp2m1f benchmark Adhemerval Zanella
@ 2024-10-29 18:18   ` DJ Delorie
  0 siblings, 0 replies; 53+ messages in thread
From: DJ Delorie @ 2024-10-29 18:18 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/benchtests/Makefile b/benchtests/Makefile
>    exp10m1f \
>    exp2 \
>    exp2f \
> +  exp2m1f \
>    expf \
>    expm1 \
>    floor \

Ok.

> diff --git a/benchtests/exp2m1f-inputs b/benchtests/exp2m1f-inputs

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 04/17] benchtests: Add expm1f benchmark
  2024-10-25 18:21 ` [PATCH 04/17] benchtests: Add expm1f benchmark Adhemerval Zanella
@ 2024-10-29 18:28   ` DJ Delorie
  2024-10-31 12:39     ` Adhemerval Zanella Netto
  0 siblings, 1 reply; 53+ messages in thread
From: DJ Delorie @ 2024-10-29 18:28 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/benchtests/Makefile b/benchtests/Makefile
>    exp2m1f \
>    expf \
>    expm1 \
> +  expm1f \
>    floor \
>    floorf \
>    fmax \

Ok.

> diff --git a/benchtests/expm1f-inputs b/benchtests/expm1f-inputs
> +## args: float
> +## ret: float
> +## includes: math.h
> +## name: workload-random
> +# Random inputs in [a=-14.495465,b=88.722832]
> +# where a is the smallest number such that expm1f does not round to -1
> +# and b is the smallest number such that expm1 rounds to +Inf (to nearest)

Ok.  I don't see why round-to--1 is excluded but round-to-Inf isn't, but
that doesn't diminish the value of the benchtest.

> +0x1.3810cp+6
> . . .
> +0x1.a299a8p+3

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 05/17] benchtests: Add log10f benchmark
  2024-10-25 18:21 ` [PATCH 05/17] benchtests: Add log10f benchmark Adhemerval Zanella
@ 2024-10-29 18:32   ` DJ Delorie
  0 siblings, 0 replies; 53+ messages in thread
From: DJ Delorie @ 2024-10-29 18:32 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> The inputs are random numbers in the form x*2^e where x is random
> in [0x1p-1,0x1p+0] and e in [-126,127].

I.e. we're generating the mantissa and exponent separately, which should
give us a better representation of "random input".  Ok.

> diff --git a/benchtests/Makefile b/benchtests/Makefile
>    llrintf \
>    log \
>    log10 \
> +  log10f \
>    log1p \
>    log2 \
>    log2f \

Ok.

> diff --git a/benchtests/log10f-inputs b/benchtests/log10f-inputs
> +## args: float
> +## ret: float
> +## includes: math.h
> +# Random inputs x*2^e where x is random in [0x1p-1,0x1p+0] and e in [-126,127]
> +## name: workload-random
> +0x1.da16e6p-106
> . . .
> +0x1.0dbf68p+17

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 06/17] benchtests: Add log2p1f benchmark
  2024-10-25 18:21 ` [PATCH 06/17] benchtests: Add log2p1f benchmark Adhemerval Zanella
@ 2024-10-29 18:57   ` DJ Delorie
  2024-10-31 12:42     ` Adhemerval Zanella Netto
  0 siblings, 1 reply; 53+ messages in thread
From: DJ Delorie @ 2024-10-29 18:57 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/benchtests/Makefile b/benchtests/Makefile
>    log1p \
>    log2 \
>    log2f \
> +  log2p1f \
>    logb \
>    logbf \
>    logf \

Ok.

> diff --git a/benchtests/log2p1f-inputs b/benchtests/log2p1f-inputs
> +## args: float
> +## ret: float
> +## includes: math.h
> +## name: workload-spec2017.wrf
> +0x1.fe4c3p-1
> . . .
> +0x1p+0

I noticed that 0x1p+0 is included MANY times in this list.  The original
list did too.  I wonder if that's warranted, but I assume (hope) it was
discussed back then.

Ok though.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 07/17] benchtests: Add log1p benchmark
  2024-10-25 18:21 ` [PATCH 07/17] benchtests: Add log1p benchmark Adhemerval Zanella
@ 2024-10-29 19:02   ` DJ Delorie
  0 siblings, 0 replies; 53+ messages in thread
From: DJ Delorie @ 2024-10-29 19:02 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/benchtests/Makefile b/benchtests/Makefile
> index 92c0cf5e7d..052d496989 100644
> --- a/benchtests/Makefile
> +++ b/benchtests/Makefile
> @@ -73,6 +73,7 @@ bench-math := \
>    log10 \
>    log10f \
>    log1p \
> +  log1pf \
>    log2 \
>    log2f \
>    log2p1f \

Ok.

> diff --git a/benchtests/log1pf-inputs b/benchtests/log1pf-inputs
> +## args: float
> +## ret: float
> +## includes: math.h
> +# Random inputs x*2^e where x is random in [1/2,1] and e in [-29,127]
> +## name: workload-random
> +0x1.c78e3p+14
> . . .
> +0x1.0a67c8p-9

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 08/17] benchtests: Add log10p1f benchmark
  2024-10-25 18:21 ` [PATCH 08/17] benchtests: Add log10p1f benchmark Adhemerval Zanella
@ 2024-10-29 19:03   ` DJ Delorie
  0 siblings, 0 replies; 53+ messages in thread
From: DJ Delorie @ 2024-10-29 19:03 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/benchtests/Makefile b/benchtests/Makefile
>    log \
>    log10 \
>    log10f \
> +  log10p1f \
>    log1p \
>    log1pf \
>    log2 \

Ok.

> diff --git a/benchtests/log10p1f-inputs b/benchtests/log10p1f-inputs
> +## args: float
> +## ret: float
> +## includes: math.h
> +## name: workload-spec2017.wrf
> +0x1.fe4c3p-1
> . . .
> +0x1p+0

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 09/17] math: Use exp10m1f from CORE-MATH
  2024-10-25 18:21 ` [PATCH 09/17] math: Use exp10m1f from CORE-MATH Adhemerval Zanella
@ 2024-10-29 21:09   ` DJ Delorie
  2024-10-31 13:20     ` Adhemerval Zanella Netto
  2024-11-06 10:29   ` Florian Weimer
  1 sibling, 1 reply; 53+ messages in thread
From: DJ Delorie @ 2024-10-29 21:09 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


A few questions but I suspect they're easily answered.  LGTM with
reasonable answers.  I'll elide the same questions in the other patches
in this series with the assumption that the same answers apply ;-)

Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/SHARED-FILES b/SHARED-FILES
> +sysdeps/ieee754/flt-32/s_exp10m1f.c
> +  (file src/binary32/exp10m1/exp10m1f.c in CORE_MATH)

I notice this file references the CORE MATH project (is it CORE_MATH or
CORE-MATH?  The file is inconsistent) but doesn't provide an URL to the
project; such a link would be appreciated in a future patch :-)

> diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
> index 8c333fcd29..00832393f6 100644
> --- a/sysdeps/aarch64/libm-test-ulps
> +++ b/sysdeps/aarch64/libm-test-ulps
> @@ -1083,22 +1083,18 @@ ldouble: 3
>  
>  Function: "exp10m1":
>  double: 4
> -float: 2
>  ldouble: 3

Does this mean "we're not testing it any more" or "we expect zero ULPs
and verify that" ?  I don't see any ": 0" in any of the ulps files so I
assume the latter.

>  Function: "exp10m1_downward":
>  double: 3
> -float: 3
>  ldouble: 6
>  
>  Function: "exp10m1_towardzero":
>  double: 2
> -float: 3
>  ldouble: 6
>  
>  Function: "exp10m1_upward":
>  double: 5
> -float: 3
>  ldouble: 6
>  
>  Function: "exp2":
> diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps
> index d1665b9b72..ad4ae4c632 100644
> --- a/sysdeps/arc/fpu/libm-test-ulps
> +++ b/sysdeps/arc/fpu/libm-test-ulps
> @@ -789,7 +789,6 @@ float: 1
>  
>  Function: "exp10m1":
>  double: 4
> -float: 2
>  
>  Function: "exp10m1_downward":
>  double: 3

The other roundings still have ULPs?

> diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
> index e768024eb5..4cecea6919 100644
> --- a/sysdeps/arc/nofpu/libm-test-ulps
> +++ b/sysdeps/arc/nofpu/libm-test-ulps
> @@ -194,7 +194,6 @@ float: 1
>  
>  Function: "exp10m1":
>  double: 3
> -float: 2
>  
>  Function: "exp2":
>  double: 1

Likewise here.

> diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
> diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
> diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
> diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps

Ok.

> diff --git a/sysdeps/ieee754/flt-32/s_exp10m1f.c b/sysdeps/ieee754/flt-32/s_exp10m1f.c
> new file mode 100644
> index 0000000000..610f269b01
> --- /dev/null
> +++ b/sysdeps/ieee754/flt-32/s_exp10m1f.c
> @@ -0,0 +1,225 @@
> +/* Implementation of the exp10m1 function for binary32.
> +
> +Copyright (c) 2022-2024 Alexei Sibidanov. Paul Zimmermann.
> +
> +The original version of this file was copied from the CORE-MATH
> +project (file src/binary32/exp10m1/exp10m1f.c, revision d680516).
> +
> +Permission is hereby granted, free of charge, to any person obtaining a copy
> +of this software and associated documentation files (the "Software"), to deal
> +in the Software without restriction, including without limitation the rights
> +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> +copies of the Software, and to permit persons to whom the Software is
> +furnished to do so, subject to the following conditions:
> +
> +The above copyright notice and this permission notice shall be included in all
> +copies or substantial portions of the Software.
> +
> +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> +SOFTWARE.
> + */
> +
> +#include <math.h>
> +#include "math_config.h"
> +#include <libm-alias-float.h>

Ok.

> +float
> +__exp10m1f (float x)
> +{
> +  const double iln10h = 0x1.a934f09p+1 * 16;
> +  const double iln10l = 0x1.e68dc57f2496p-29 * 16;
> +  double z = x;
> +  uint32_t ux = asuint (x);
> +  uint32_t ax = ux & (~0u >> 1);
> +  if (__glibc_unlikely (ux > 0xc0f0d2f1u))
> +    { /* x < -7.52575 */
> +      if (ax > (0xffu << 23))
> +	return x + x; /* nan */
> +      return (ux == 0xff800000) ? -0x1p+0 : -0x1p+0 + 0x1p-26f;
> +    }

Ok.

> +  else if (__glibc_unlikely (ax > 0x421a209au))
> +    { /* x > 38.5318 */
> +      if (ax >= asuint (INFINITY))
> +	return x + x; /* +Inf or NaN */
> +      return __math_oflowf (0);
> +    }

Ok.

> +  else if (__glibc_unlikely (ax < 0x3d89c604u))
> +    { /* |x| < 0.1549/log(10) */
> +      double z2 = z * z, r;
> +      if (__glibc_unlikely (ax < 0x3d1622fbu))
> +	{ /* |x| < 8.44e-2/log(10)  */
> +	  if (__glibc_unlikely (ax < 0x3c8b76a3u))
> +	    { /* |x| < 3.92e-2/log(10)  */
> +	      if (__glibc_unlikely (ax < 0x3bcced04u))
> +		{ /* |x| < 1.44e-2/log(10) */
> +		  if (__glibc_unlikely (ax < 0x3acf33ebu))
> +		    { /* |x| < 3.64e-3/log(10 */
> +		      if (__glibc_unlikely (ax < 0x395a966bu))
> +			{ /* |x| < 4.8e-4/log(10 */
> +			  if (__glibc_unlikely (ax < 0x36fe4a4bu))
> +			    { /* |x| < 1.745e-5/log(10) */
> +			      if (__glibc_unlikely (ax < 0x32407f39u))
> +				{ /* |x| < 2.58e-8/log(10) */
> +				  if (__glibc_unlikely (ax < 0x245e5bd9u))
> +				    { /* |x| < 4.82164e-17 */
> +				      r = 0x1.26bb1bbb55516p+1;
> +				    }
> +				  else
> +				    {
> +				      if (__glibc_unlikely (ux == 0x2c994b7bu))
> +					return 0x1.60f974p-37f - 0x1p-90f;
> +				      r = 0x1.26bb1bbb55516p+1
> +					  + z * 0x1.53524c73cea69p+1;
> +				    }
> +				}
> +			      else
> +				{
> +				  if (__glibc_unlikely (ux == 0xb6fa215bu))
> +				    return -0x1.1ff87ep-16 + 0x1p-68;
> +				  r = 0x1.26bb1bbb55516p+1
> +				      + z * (0x1.53524c73ea62fp+1
> +					     + z * 0x1.0470591de2c75p+1);
> +				}
> +			    }
> +			  else
> +			    {
> +			      static const double cp[] =
> +				{
> +				  0x1.26bb1bbb55515p+1, 0x1.53524c73cea69p+1,
> +				  0x1.0470595038cc2p+1, 0x1.2bd7609fe1561p+0
> +			        };
> +			      r = (cp[0] + z * cp[1])
> +				  + z2 * (cp[2] + z * cp[3]);
> +			    }
> +			}
> +		      else
> +			{
> +			  static const double cp[] =
> +			    {
> +			      0x1.26bb1bbb55516p+1, 0x1.53524c73ce6dbp+1,
> +			      0x1.0470591de3024p+1, 0x1.2bd76b79060e6p+0,
> +			      0x1.1429ffd3a963dp-1
> +			    };
> +			  r = (cp[0] + z * cp[1])
> +			      + z2 * (cp[2] + z * (cp[3] + z * cp[4]));
> +			}
> +		    }
> +		  else
> +		    {
> +		      static const double cp[] =
> +			{
> +			  0x1.26bb1bbb55516p+1, 0x1.53524c73cea67p+1,
> +			  0x1.0470591dc2953p+1, 0x1.2bd760a004d64p+0,
> +			  0x1.142a85da6f072p-1, 0x1.a7ed70725b00ep-3
> +			};
> +		      r = (cp[0] + z * cp[1]) + z2
> +			    * ((cp[2] + z * cp[3])
> +			       + z2 * (cp[4] + z * cp[5]));
> +		    }
> +		}
> +	      else
> +		{
> +		  static const double cp[] =
> +		    {
> +		      0x1.26bb1bbb55516p+1, 0x1.53524c73ceadep+1,
> +		      0x1.0470591de2bb4p+1, 0x1.2bd76099a9d33p+0,
> +		      0x1.1429ffd829b0bp-1, 0x1.a7f2a6a0f7dc8p-3,
> +		      0x1.16e4dfbce0f56p-4
> +		    };
> +		  r = (cp[0] + z * cp[1])
> +		      + z2 * ((cp[2] + z * cp[3])
> +			      + z2 * (cp[4] + z * (cp[5] + z * cp[6])));
> +		}
> +	    }
> +	  else
> +	    {
> +	      static const double cp[] =
> +		{
> +		  0x1.26bb1bbb55515p+1, 0x1.53524c73cea6ap+1,
> +		  0x1.0470591de476p+1,  0x1.2bd7609fd4ee2p+0,
> +		  0x1.1429ff70a9b48p-1, 0x1.a7ed71259ba5bp-3,
> +		  0x1.16f3004fb3ac1p-4, 0x1.4116b0388aa9fp-6
> +		};
> +	      r = ((cp[0] + z * cp[1]) + z2 * (cp[2] + z * cp[3]))
> +		  + (z2 * z2) * ((cp[4] + z * cp[5]) + z2 * (cp[6]
> +							     + z * cp[7]));
> +	    }
> +	}
> +      else
> +	{
> +	  static const double cp[] =
> +	    {
> +	      0x1.26bb1bbb55515p+1, 0x1.53524c73cea42p+1, 0x1.0470591de2d1dp+1,
> +	      0x1.2bd760a010a53p+0, 0x1.1429ffd16170cp-1, 0x1.a7ed6b2a0d97fp-3,
> +	      0x1.16e4e37fa51e4p-4, 0x1.4147fe4c1676fp-6, 0x1.4897c4b3e329ap-8
> +	    };
> +	  r = ((cp[0] + z * cp[1]) + z2 * (cp[2] + z * cp[3]))
> +	      + (z2 * z2) * ((cp[4] + z * cp[5])
> +			     + z2 * (cp[6] + z * (cp[7] + z * cp[8])));
> +	}
> +      r *= z;
> +      return r;
> +    }

I'm not a fan of having 99% of the code be in a hugely nested "else"
clause, but I assume the upstream code is the same way.  Better would be
to keep each block of code near its conditional by inverting the
conditionals, assuming performance isn't affected by it.

Not a blocker though, just hard to understand.

> +  else
> +    {
> +      /* -7.52575 < x < -0.1549/log(10) or 0.1549/log(10) < x < 38.5318  */
> +      static const double tb[] =
> +	{
> +	  0x1p+0, 0x1.0b5586cf9890fp+0, 0x1.172b83c7d517bp+0,
> +	  0x1.2387a6e756238p+0, 0x1.306fe0a31b715p+0, 0x1.3dea64c123422p+0,
> +	  0x1.4bfdad5362a27p+0, 0x1.5ab07dd485429p+0, 0x1.6a09e667f3bcdp+0,
> +	  0x1.7a11473eb0187p+0, 0x1.8ace5422aa0dap+0, 0x1.9c49182a3f09p+0,
> +	  0x1.ae89f995ad3adp+0, 0x1.c199bdd85529cp+0, 0x1.d5818dcfba487p+0,
> +	  0x1.ea4afa2a490dap+0
> +	};
> +      static const double c[] =
> +	{
> +	  0x1.62e42fefa398bp-5,  0x1.ebfbdff84555ap-11, 0x1.c6b08d4ad86d3p-17,
> +	  0x1.3b2ad1b1716a2p-23, 0x1.5d7472718ce9dp-30, 0x1.4a1d7f457ac56p-37
> +	};
> +
> +      if (__glibc_unlikely ((ux << 11) == 0))
> +	{
> +	  uint32_t k = (ux >> 21) - 0x1fc;
> +	  if (k <= 0xb)
> +	    {
> +	      if (k == 0)
> +		return 10.0f - 1.0f;
> +	      if (k == 4)
> +		return 100.0f - 1.0f;
> +	      if (k == 6)
> +		return 1000.0f - 1.0f;
> +	      if (k == 8)
> +		return 10000.0f - 1.0f;
> +	      if (k == 9)
> +		return 100000.0f - 1.0f;
> +	      if (k == 10)
> +		return 1000000.0f - 1.0f;
> +	      if (k == 11)
> +		return 10000000.0f - 1.0f;
> +	    }
> +	}

Ok.

> +      double a = iln10h * z;
> +      double ia = floor (a);
> +      double h = (a - ia) + iln10l * z;
> +      int64_t i = ia;
> +      int64_t j = i & 0xf;
> +      int64_t e = i - j;
> +      e >>= 4;
> +      double s = tb[j];
> +      s *= asdouble ((e + 0x3ffull) << 52);
> +      double h2 = h * h;
> +      double c0 = c[0] + h * c[1];
> +      double c2 = c[2] + h * c[3];
> +      double c4 = c[4] + h * c[5];
> +      c0 += h2 * (c2 + h2 * c4);
> +      double w = s * h;
> +      return (s - 1.0) + w * c0;
> +    }
> +}
> +libm_alias_float (__exp10m1, exp10m1)

Ok.

> diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
> diff --git a/sysdeps/m68k/m680x0/fpu/libm-test-ulps b/sysdeps/m68k/m680x0/fpu/libm-test-ulps
> diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
> diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
> diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
> diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
> diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps

Ok.

> index 4adad138b0..2271e1ee6c 100644
> --- a/sysdeps/riscv/nofpu/libm-test-ulps
> +++ b/sysdeps/riscv/nofpu/libm-test-ulps
> @@ -974,7 +974,6 @@ ldouble: 3
>  
>  Function: "exp10m1":
>  double: 2
> -float: 1
>  ldouble: 1
>  
>  Function: "exp2":

The others are missing?

> diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
> diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
> diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
> diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 10/17] math: Use exp2m1f from CORE-MATH
  2024-10-25 18:21 ` [PATCH 10/17] math: Use exp2m1f " Adhemerval Zanella
@ 2024-10-29 21:24   ` DJ Delorie
  0 siblings, 0 replies; 53+ messages in thread
From: DJ Delorie @ 2024-10-29 21:24 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/SHARED-FILES b/SHARED-FILES
> +sysdeps/ieee754/flt-32/s_exp2m1f.c
> +  (file src/binary32/exp2m1/exp2m1f.c in CORE_MATH)
> +  - The code was adapted to use glibc code style and internal
> +    functions to handle errno, overflow, and underflow.

Ok.

> diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
> diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps

Ok.

> diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
>  
>  Function: "exp2m1":
>  double: 2
> -float: 2
>  
>  Function: "expm1":
>  double: 1

Ok?

> diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
> diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
> diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
> diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps

Ok.

> diff --git a/sysdeps/ieee754/flt-32/s_exp2m1f.c b/sysdeps/ieee754/flt-32/s_exp2m1f.c

> +/* Correctly-rounded base-2 exponent function biased by 1 for binary32 value.
> +
> +Copyright (c) 2022-2024 Alexei Sibidanov.
> +
> +The original version of this file was copied from the CORE-MATH
> +project (file src/binary32/exp2m1/exp2m1f.c, revision bc385c2).
> +
> +Permission is hereby granted, free of charge, to any person obtaining a copy
> +of this software and associated documentation files (the "Software"), to deal
> +in the Software without restriction, including without limitation the rights
> +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> +copies of the Software, and to permit persons to whom the Software is
> +furnished to do so, subject to the following conditions:
> +
> +The above copyright notice and this permission notice shall be included in all
> +copies or substantial portions of the Software.
> +
> +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> +SOFTWARE.
> +*/
> +
> +#include <fenv.h>
> +#include <math.h>
> +#include "math_config.h"
> +#include <libm-alias-float.h>
> +#include <math-narrow-eval.h>
> +#include <float.h>

Ok.

> +float
> +__exp2m1f (float x)
> +{
> +  double z = x;
> +  uint32_t ux = asuint (x);
> +  uint32_t ax = ux & (~0u >> 1);
> +  if (__glibc_unlikely (ux >= 0xc1c80000u))
> +    { /* x <= -25 */
> +      if (ax > (0xffu << 23))
> +	return x + x; /* nan */
> +      return (ux == 0xff800000) ? -0x1p+0 : -0x1p+0 + 0x1p-26f;
> +    }

Ok.

> +  else if (__glibc_unlikely (ax >= 0x43000000u))
> +    { /* x >= 128 */
> +      if (ax >= asuint (INFINITY))
> +	return x + x; /* +Inf or NaN */
> +      /* exp2m1 (MAX_EXP) should not overflow when rounding towards zero
> +         or towards -Inf.  We round FLT_MAX + 2^103 which is in the middle
> +         between FLT_MAX and 2^128 (the next number with unbounded range).  */
> +      float ret = math_narrow_eval (FLT_MAX + 0x1p103f);
> +      if (x == FLT_MAX_EXP && ret == FLT_MAX)
> +        return ret;
> +      return __math_oflowf (0);
> +    }

Ok.

> +  else if (__glibc_unlikely (ax < 0x3df95f1fu))
> +    { /* |x| < 8.44e-2/log(2) */
> +      double z2 = z * z, r;
> +      if (__glibc_unlikely (ax < 0x3d67a4ccu))
> +	{ /* |x| < 3.92e-2/log(2) */
> +	  if (__glibc_unlikely (ax < 0x3caa2feeu))
> +	    { /* |x| < 1.44e-2/log(2) */
> +	      if (__glibc_unlikely (ax < 0x3bac1405u))
> +		{ /* |x| < 3.64e-3/log(2) */
> +		  if (__glibc_unlikely (ax < 0x3a358876u))
> +		    { /* |x| < 4.8e-4/log(2) */
> +		      if (__glibc_unlikely (ax < 0x37d32ef6u))
> +			{ /* |x| < 1.745e-5/log(2) */
> +			  if (__glibc_unlikely (ax < 0x331fdd82u))
> +			    { /* |x| < 2.58e-8/log(2) */
> +			      if (__glibc_unlikely (ax < 0x2538aa3bu))
> +				/* |x| < 1.60171e-16 */
> +				r = 0x1.62e42fefa39efp-1;
> +			      else
> +				r = 0x1.62e42fefa39fp-1
> +				  + z * 0x1.ebfbdff82c58fp-3;
> +			    }
> +			  else
> +			    {
> +			      if (__glibc_unlikely (ux == 0xb3d85005u))
> +				return -0x1.2bdf76p-24 - 0x1.8p-77;
> +			      if (__glibc_unlikely (ux == 0x3338428du))
> +				return 0x1.fee08ap-26 + 0x1p-80;
> +			      static const double c[] =
> +				{
> +				  0x1.62e42fefa39efp-1, 0x1.ebfbdff8548fdp-3,
> +				  0x1.c6b08d704a06dp-5
> +				};
> +			      r = c[0] + z * (c[1] + z * c[2]);
> +			    }
> +			}
> +		      else
> +			{
> +			  if (__glibc_unlikely (ux == 0x388bca4fu))
> +			    return 0x1.839702p-15 - 0x1.8p-68;
> +			  static const double c[] =
> +			    {
> +			      0x1.62e42fefa39efp-1, 0x1.ebfbdff82c58fp-3,
> +			      0x1.c6b08dc82b347p-5, 0x1.3b2ab6fbad172p-7
> +			    };
> +			  r = (c[0] + z * c[1]) + z2 * (c[2] + z * c[3]);
> +			}
> +		    }
> +		  else
> +		    {
> +		      static const double c[] =
> +			{
> +			  0x1.62e42fefa39efp-1, 0x1.ebfbdff82c068p-3,
> +			  0x1.c6b08d704a6dcp-5, 0x1.3b2ac262c3eedp-7,
> +			  0x1.5d87fe7af779ap-10
> +			};
> +		      r = (c[0] + z * c[1])
> +			  + z2 * (c[2] + z * (c[3] + z * c[4]));
> +		    }
> +		}
> +	      else
> +		{
> +		  static const double c[] =
> +		    {
> +		      0x1.62e42fefa39fp-1,   0x1.ebfbdff82c58dp-3,
> +		      0x1.c6b08d7011d13p-5,  0x1.3b2ab6fbd267dp-7,
> +		      0x1.5d88a81cea49ep-10, 0x1.430912ea9b963p-13
> +		    };
> +		  r = (c[0] + z * c[1])
> +		      + z2 * ((c[2] + z * c[3]) + z2 * (c[4] + z * c[5]));
> +		}
> +	    }
> +	  else
> +	    {
> +	      static const double c[] =
> +		{
> +		  0x1.62e42fefa39efp-1,  0x1.ebfbdff82c639p-3,
> +		  0x1.c6b08d7049f1cp-5,  0x1.3b2ab6f5243bdp-7,
> +		  0x1.5d87fe80a9e6cp-10, 0x1.430d0b9257fa8p-13,
> +		  0x1.ffcbfc4cf0952p-17
> +		};
> +	      r = (c[0] + z * c[1])
> +		  + z2 * ((c[2] + z * c[3])
> +			  + z2 * (c[4] + z * (c[5] + z * c[6])));
> +	    }
> +	}
> +      else
> +	{
> +	  static const double c[] =
> +	    {
> +	      0x1.62e42fefa39efp-1,  0x1.ebfbdff82c591p-3,
> +	      0x1.c6b08d704cf6bp-5,  0x1.3b2ab6fba00cep-7,
> +	      0x1.5d87fdfdaadb4p-10, 0x1.4309137333066p-13,
> +	      0x1.ffe5e90daf7ddp-17, 0x1.62c0220eed731p-20
> +	    };
> +	  r = ((c[0] + z * c[1]) + z2 * (c[2] + z * c[3]))
> +	      + (z2 * z2) * ((c[4] + z * c[5]) + z2 * (c[6] + z * c[7]));
> +	}
> +      r *= z;
> +      return r;
> +    }

Ok.

> +  else
> +    {
> +      static const double c[] =
> +	{
> +	  0x1.62e42fefa398bp-5,  0x1.ebfbdff84555ap-11,
> +	  0x1.c6b08d4ad86d3p-17, 0x1.3b2ad1b1716a2p-23,
> +	  0x1.5d7472718ce9dp-30, 0x1.4a1d7f457ac56p-37
> +	};
> +      static const double tb[] =
> +	{
> +	  0x1p+0,               0x1.0b5586cf9890fp+0,  0x1.172b83c7d517bp+0,
> +	  0x1.2387a6e756238p+0, 0x1.306fe0a31b715p+0,  0x1.3dea64c123422p+0,
> +	  0x1.4bfdad5362a27p+0, 0x1.5ab07dd485429p+0,  0x1.6a09e667f3bcdp+0,
> +	  0x1.7a11473eb0187p+0, 0x1.8ace5422aa0dap+0,  0x1.9c49182a3f09p+0,
> +	  0x1.ae89f995ad3adp+0, 0x1.c199bdd85529cp+0,  0x1.d5818dcfba487p+0,
> +	  0x1.ea4afa2a490dap+0
> +	};
> +      double a = 16.0 * z;
> +      double ia = floor (a);
> +      double h = a - ia;
> +      double h2 = h * h;
> +      int64_t i = ia, j = i & 0xf, e = i - j;
> +      e >>= 4;
> +      double s = tb[j];
> +      s *= asdouble ((e + 0x3ffull) << 52);
> +      double c0 = c[0] + h * c[1];
> +      double c2 = c[2] + h * c[3];
> +      double c4 = c[4] + h * c[5];
> +      c0 += h2 * (c2 + h2 * c4);
> +      double w = s * h;
> +      return (s - 1.0) + w * c0;
> +    }
> +}
> +libm_alias_float (__exp2m1, exp2m1)

Ok.

> diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
> diff --git a/sysdeps/m68k/m680x0/fpu/libm-test-ulps b/sysdeps/m68k/m680x0/fpu/libm-test-ulps
> diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
> diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
> diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
> diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps

Ok.

> diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
> index 2271e1ee6c..11f891988e 100644
> --- a/sysdeps/riscv/nofpu/libm-test-ulps
> +++ b/sysdeps/riscv/nofpu/libm-test-ulps
> @@ -995,7 +995,6 @@ ldouble: 2
>  
>  Function: "exp2m1":
>  double: 1
> -float: 1
>  ldouble: 1
>  
>  Function: "exp_downward":

Ok?

> diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
> diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
> diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
> diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 11/17] math: Use expm1f from CORE-MATH
  2024-10-25 18:21 ` [PATCH 11/17] math: Use expm1f " Adhemerval Zanella
@ 2024-10-30 19:27   ` DJ Delorie
  2024-10-31 14:35     ` Adhemerval Zanella Netto
  0 siblings, 1 reply; 53+ messages in thread
From: DJ Delorie @ 2024-10-30 19:27 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/SHARED-FILES b/SHARED-FILES
> +sysdeps/ieee754/flt-32/s_expm1f.c
> +  (file src/binary32/expm1/expm1f.c in CORE_MATH)
> +  - The code was adapted to use glibc code style and internal
> +    functions to handle errno, overflow, and underflow.

Ok.

> diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
>  Function: Imaginary part of "csin":
> +float: 1
>  ldouble: 1

I assume this is because csin uses expm1 internally.

>  Function: Real part of "csin_downward":
> @@ -1163,7 +1164,6 @@ float: 1
>  
>  Function: "expm1":
>  double: 1
> -float: 1
>  ldouble: 2

Ok.

> diff --git a/sysdeps/alpha/fpu/libm-test-ulps b/sysdeps/alpha/fpu/libm-test-ulps
> diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps

Ok.

> diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
>  
>  Function: "expm1":
>  double: 1
> -float: 1
>  

I assume the rest were :0 anyway... ok.

> diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps

Ok.

> diff --git a/sysdeps/csky/fpu/libm-test-ulps b/sysdeps/csky/fpu/libm-test-ulps
> diff --git a/sysdeps/csky/nofpu/libm-test-ulps b/sysdeps/csky/nofpu/libm-test-ulps
> diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
> diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps

Ok.

> diff --git a/sysdeps/i386/fpu/s_expm1f.S b/sysdeps/i386/fpu/s_expm1f.S
> deleted file mode 100644

Ok.

> diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
> index 9afb63bc0f..6d9d49d153 100644
> --- a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
> +++ b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
> @@ -1237,19 +1237,16 @@ ldouble: 3
>  
>  Function: "expm1_downward":
>  double: 1
> -float: 1
>  float128: 2
>  ldouble: 4
>  
>  Function: "expm1_towardzero":
>  double: 1
> -float: 1
>  float128: 4
>  ldouble: 4
>  
>  Function: "expm1_upward":
>  double: 1
> -float: 1
>  float128: 3
>  ldouble: 4

Ok.

> diff --git a/sysdeps/ieee754/flt-32/s_expm1f.c b/sysdeps/ieee754/flt-32/s_expm1f.c
> index 35f7b5214a..edd7c9acf8 100644
> --- a/sysdeps/ieee754/flt-32/s_expm1f.c
> +++ b/sysdeps/ieee754/flt-32/s_expm1f.c
> @@ -1,132 +1,124 @@
> -/* s_expm1f.c -- float version of s_expm1.c.
> - */
> +/* Correctly-rounded natural exponent function biased by 1 for binary32 value.
>  
> -/*
> - * ====================================================
> - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> - *
> - * Developed at SunPro, a Sun Microsystems, Inc. business.
> - * Permission to use, copy, modify, and distribute this
> - * software is freely granted, provided that this notice
> - * is preserved.
> - * ====================================================
> - */
> +Copyright (c) 2022-2024 Alexei Sibidanov.
> +
> +This file is part of the CORE-MATH project
> +project (file src/binary32/expm1/expm1f.c, revision bc385c2).
> +
> +Permission is hereby granted, free of charge, to any person obtaining a copy
> +of this software and associated documentation files (the "Software"), to deal
> +in the Software without restriction, including without limitation the rights
> +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> +copies of the Software, and to permit persons to whom the Software is
> +furnished to do so, subject to the following conditions:
> +
> +The above copyright notice and this permission notice shall be included in all
> +copies or substantial portions of the Software.
> +
> +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> +SOFTWARE.
> +*/
>  
> -#include <errno.h>
> -#include <float.h>
>  #include <math.h>
> -#include <math-barriers.h>
> -#include <math_private.h>
>  #include <math-underflow.h>
>  #include <libm-alias-float.h>
> -
> -static const float huge = 1.0e+30;
> -static const float tiny = 1.0e-30;

Ok.

> -static const float
> -one		= 1.0,
> -o_threshold	= 8.8721679688e+01,/* 0x42b17180 */
> -ln2_hi		= 6.9313812256e-01,/* 0x3f317180 */
> -ln2_lo		= 9.0580006145e-06,/* 0x3717f7d1 */
> -invln2		= 1.4426950216e+00,/* 0x3fb8aa3b */
> -	/* scaled coefficients related to expm1 */
> -Q1  =  -3.3333335072e-02, /* 0xbd088889 */
> -Q2  =   1.5873016091e-03, /* 0x3ad00d01 */
> -Q3  =  -7.9365076090e-05, /* 0xb8a670cd */
> -Q4  =   4.0082177293e-06, /* 0x36867e54 */
> -Q5  =  -2.0109921195e-07; /* 0xb457edbb */
> +#include "math_config.h"

Ok.

>  float
> -__expm1f(float x)
> +__expm1f (float x)
>  {

Ok.

> -	float y,hi,lo,c,t,e,hxs,hfx,r1;
> -	int32_t k,xsb;
> -	uint32_t hx;
> -
> -	GET_FLOAT_WORD(hx,x);
> -	xsb = hx&0x80000000;		/* sign bit of x */
> -	if(xsb==0) y=x; else y= -x;	/* y = |x| */
> -	hx &= 0x7fffffff;		/* high word of |x| */
> -
> -    /* filter out huge and non-finite argument */
> -	if(hx >= 0x4195b844) {			/* if |x|>=27*ln2 */
> -	    if(hx >= 0x42b17218) {		/* if |x|>=88.721... */
> -		if(hx>0x7f800000)
> -		    return x+x;		 /* NaN */
> -		if(hx==0x7f800000)
> -		    return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */
> -		if(x > o_threshold) {
> -		  __set_errno (ERANGE);
> -		  return huge*huge; /* overflow */
> -		}
> -	    }
> -	    if(xsb!=0) { /* x < -27*ln2, return -1.0 with inexact */
> -		math_force_eval(x+tiny);/* raise inexact */
> -		return tiny-one;	/* return -1 */
> -	    }
> -	}
> -
> -    /* argument reduction */
> -	if(hx > 0x3eb17218) {		/* if  |x| > 0.5 ln2 */
> -	    if(hx < 0x3F851592) {	/* and |x| < 1.5 ln2 */
> -		if(xsb==0)
> -		    {hi = x - ln2_hi; lo =  ln2_lo;  k =  1;}
> -		else
> -		    {hi = x + ln2_hi; lo = -ln2_lo;  k = -1;}
> -	    } else {
> -		k  = invln2*x+((xsb==0)?(float)0.5:(float)-0.5);
> -		t  = k;
> -		hi = x - t*ln2_hi;	/* t*ln2_hi is exact here */
> -		lo = t*ln2_lo;
> -	    }
> -	    x  = hi - lo;
> -	    c  = (hi-x)-lo;
> -	}
> -	else if(hx < 0x33000000) {	/* when |x|<2**-25, return x */
> -	    math_check_force_underflow (x);
> -	    t = huge+x;	/* return x with inexact flags when x!=0 */
> -	    return x - (t-(huge+x));

Ok.

> +  static const double c[] =
> +    {
> +      1, 0x1.62e42fef4c4e7p-6, 0x1.ebfd1b232f475p-13, 0x1.c6b19384ecd93p-20
> +    };
> +  static const double ch[] =
> +    {
> +      0x1.62e42fefa39efp-6,  0x1.ebfbdff82c58fp-13, 0x1.c6b08d702e0edp-20,
> +      0x1.3b2ab6fb92e5ep-27, 0x1.5d886e6d54203p-35, 0x1.430976b8ce6efp-43
> +    };
> +  static const double td[] =
> +    {
> +      0x1p+0,               0x1.059b0d3158574p+0, 0x1.0b5586cf9890fp+0,
> +      0x1.11301d0125b51p+0, 0x1.172b83c7d517bp+0, 0x1.1d4873168b9aap+0,
> +      0x1.2387a6e756238p+0, 0x1.29e9df51fdee1p+0, 0x1.306fe0a31b715p+0,
> +      0x1.371a7373aa9cbp+0, 0x1.3dea64c123422p+0, 0x1.44e086061892dp+0,
> +      0x1.4bfdad5362a27p+0, 0x1.5342b569d4f82p+0, 0x1.5ab07dd485429p+0,
> +      0x1.6247eb03a5585p+0, 0x1.6a09e667f3bcdp+0, 0x1.71f75e8ec5f74p+0,
> +      0x1.7a11473eb0187p+0, 0x1.82589994cce13p+0, 0x1.8ace5422aa0dbp+0,
> +      0x1.93737b0cdc5e5p+0, 0x1.9c49182a3f09p+0,  0x1.a5503b23e255dp+0,
> +      0x1.ae89f995ad3adp+0, 0x1.b7f76f2fb5e47p+0, 0x1.c199bdd85529cp+0,
> +      0x1.cb720dcef9069p+0, 0x1.d5818dcfba487p+0, 0x1.dfc97337b9b5fp+0,
> +      0x1.ea4afa2a490dap+0, 0x1.f50765b6e454p+0
> +    };
> +  const double iln2 = 0x1.71547652b82fep+5;
> +  const double big = 0x1.8p52;
> +  double z = x;
> +  uint32_t ux = asuint (x);
> +  uint32_t ax = ux << 1;
> +  if (__glibc_likely (ax < 0x7c400000u))
> +    { /* |x| < 0.15625  */
> +      if (__glibc_unlikely (ax < 0x676a09e8u))
> +	{ /* |x| < 0x1.6a09e8p-24 */
> +	  if (__glibc_unlikely (ax == 0x0u))
> +	    return x; /* x = +-0 */
> +	  return fmaf (fabsf (x), 0x1p-25f, x);
>  	}

Ok.

> -	else k = 0;
> -
> -    /* x is now in primary range */
> -	hfx = (float)0.5*x;
> -	hxs = x*hfx;
> -	r1 = one+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5))));
> -	t  = (float)3.0-r1*hfx;
> -	e  = hxs*((r1-t)/((float)6.0 - x*t));
> -	if(k==0) return x - (x*e-hxs);		/* c is 0 */
> -	else {
> -	    e  = (x*(e-c)-c);
> -	    e -= hxs;
> -	    if(k== -1) return (float)0.5*(x-e)-(float)0.5;
> -	    if(k==1) {
> -		if(x < (float)-0.25) return -(float)2.0*(e-(x+(float)0.5));
> -		else	      return  one+(float)2.0*(x-e);
> -	    }
> -	    if (k <= -2 || k>56) {   /* suffice to return exp(x)-1 */
> -		int32_t i;
> -		y = one-(e-x);
> -		GET_FLOAT_WORD(i,y);
> -		SET_FLOAT_WORD(y,i+(k<<23));	/* add k to y's exponent */
> -		return y-one;
> -	    }
> -	    t = one;
> -	    if(k<23) {
> -		int32_t i;
> -		SET_FLOAT_WORD(t,0x3f800000 - (0x1000000>>k)); /* t=1-2^-k */
> -		y = t-(e-x);
> -		GET_FLOAT_WORD(i,y);
> -		SET_FLOAT_WORD(y,i+(k<<23));	/* add k to y's exponent */
> -	   } else {
> -		int32_t i;
> -		SET_FLOAT_WORD(t,((0x7f-k)<<23));	/* 2^-k */
> -		y = x-(e+t);
> -		y += one;
> -		GET_FLOAT_WORD(i,y);
> -		SET_FLOAT_WORD(y,i+(k<<23));	/* add k to y's exponent */
> -	    }

Ok.

> +      static const double b[] =
> +	{
> +	  0x1.fffffffffffc2p-2,  0x1.55555555555fep-3,  0x1.555555559767fp-5,
> +	  0x1.1111111098dc1p-7,  0x1.6c16bca988aa9p-10, 0x1.a01a07658483fp-13,
> +	  0x1.a05b04d2c3503p-16, 0x1.71de3a960b5e3p-19
> +	};
> +      double z2 = z * z, z4 = z2 * z2;
> +      double r = z + z2
> +	* ((b[0] + z * b[1]) + z2 * (b[2] + z * b[3])
> +	   + z4 * ((b[4] + z * b[5]) + z2 * (b[6] + z * b[7])));
> +      return r;
> +    }
> +  if (__glibc_unlikely (ax >= 0x8562e430u))
> +    { /* |x| > 88.72 */
> +      if (ax > (0xffu << 24))
> +	return x + x; /* nan */
> +      if (__glibc_unlikely (ux >> 31))
> +	{ /* x < 0 */
> +	  if (ax == (0xffu << 24))
> +	    return -1.0f;
> +	  return -1.0f + 0x1p-26f;
>  	}
> -	return y;
> +      if (ax == (0xffu << 24))
> +	return INFINITY;
> +      return __math_oflowf (0);
> +    }

Ok.

> +  double a = iln2 * z;
> +  double ia = roundeven (a);
> +  double h = a - ia;
> +  double h2 = h * h;
> +  uint64_t u = asuint64 (ia + big);
> +  double c2 = c[2] + h * c[3], c0 = c[0] + h * c[1];
> +  const uint64_t *tdl = (uint64_t *) ((void *) td);
> +  double sv = asdouble (tdl[u & 0x1f] + ((u >> 5) << 52));
> +  double r = (c0 + h2 * c2) * sv - 1.0;
> +  float ub = r, lb = r - sv * 0x1.3b3p-33;
> +  if (__glibc_unlikely (ub != lb))
> +    {
> +      if (__glibc_unlikely (ux > 0xc18aa123u)) /* x < -17.32 */
> +	return -1.0f + 0x1p-26f;
> +      const double iln2h = 0x1.7154765p+5;
> +      const double iln2l = 0x1.5c17f0bbbe88p-26;
> +      double s = sv;
> +      h = (iln2h * z - ia) + iln2l * z;
> +      h2 = h * h;
> +      double w = s * h;
> +      r = (s - 1) + w
> +	* ((ch[0] + h * ch[1])
> +	   + h2 * ((ch[2] + h * ch[3]) + h2 * (ch[4] + h * ch[5])));
> +      ub = r;
> +    }
> +  return ub;
>  }
>  libm_alias_float (__expm1, expm1)

Ok.

> diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
> diff --git a/sysdeps/microblaze/libm-test-ulps b/sysdeps/microblaze/libm-test-ulps
> diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
> diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
> diff --git a/sysdeps/nios2/libm-test-ulps b/sysdeps/nios2/libm-test-ulps
> diff --git a/sysdeps/or1k/fpu/libm-test-ulps b/sysdeps/or1k/fpu/libm-test-ulps
> diff --git a/sysdeps/or1k/nofpu/libm-test-ulps b/sysdeps/or1k/nofpu/libm-test-ulps
> diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
> diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
> diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
> diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
> diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
> diff --git a/sysdeps/sh/libm-test-ulps b/sysdeps/sh/libm-test-ulps
> diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
> diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 13/17] math: Use log2p1f from CORE-MATH
  2024-10-25 18:21 ` [PATCH 13/17] math: Use log2p1f " Adhemerval Zanella
@ 2024-10-30 19:36   ` DJ Delorie
  2024-10-31 14:37     ` Adhemerval Zanella Netto
  0 siblings, 1 reply; 53+ messages in thread
From: DJ Delorie @ 2024-10-30 19:36 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


One space error nees correcting.

LGTM with that correction.
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/SHARED-FILES b/SHARED-FILES
> +sysdeps/ieee754/flt-32/s_log2p1f.c
> +  (file src/binary32/log2p1/log2p1f.c in CORE_MATH)
> +  - The code was adapted to use glibc code style and internal
> +    functions to handle errno, overflow, and underflow.

Ok.

> diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
> diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps
> diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
> diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
> diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
> diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
> diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps

Ok.

> diff --git a/sysdeps/ieee754/flt-32/s_log2p1f.c b/sysdeps/ieee754/flt-32/s_log2p1f.c

> +/* Correctly-rounded biased argument natural logarithm function for binary32
> +   value.
> +
> +Copyright (c) 2022-2024 Alexei Sibidanov.

The summary should be limited to one line, with the copyright on the
second.  However, as these are imported files, I think this is OK.

> +This file is part of the CORE-MATH project
> +project (file src/binary32/log2p1/log2p1f.c revision bc385c2).
> +
> +Permission is hereby granted, free of charge, to any person obtaining a copy
> +of this software and associated documentation files (the "Software"), to deal
> +in the Software without restriction, including without limitation the rights
> +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> +copies of the Software, and to permit persons to whom the Software is
> +furnished to do so, subject to the following conditions:
> +
> +The above copyright notice and this permission notice shall be included in all
> +copies or substantial portions of the Software.
> +
> +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> +SOFTWARE.
> +*/
> +
> +#include <errno.h>
> +#include <math.h>
> +#include <math-underflow.h>
> +#include <libm-alias-float.h>
> +#include "math_config.h"

Ok.

> +float
> +__log2p1f (float x)
> +{
> +  static const double ix[] =
> +    {
> +      0x1p+0,           0x1.fc07f01fcp-1, 0x1.f81f81f82p-1,
> +      0x1.f44659e4ap-1, 0x1.f07c1f07cp-1, 0x1.ecc07b302p-1,
> +      0x1.e9131abfp-1,  0x1.e573ac902p-1, 0x1.e1e1e1e1ep-1,
> +      0x1.de5d6e3f8p-1, 0x1.dae6076bap-1, 0x1.d77b654b8p-1,
> +      0x1.d41d41d42p-1, 0x1.d0cb58f6ep-1, 0x1.cd8568904p-1,
> +      0x1.ca4b3055ep-1, 0x1.c71c71c72p-1, 0x1.c3f8f01c4p-1,
> +      0x1.c0e070382p-1, 0x1.bdd2b8994p-1, 0x1.bacf914c2p-1,
> +      0x1.b7d6c3ddap-1, 0x1.b4e81b4e8p-1, 0x1.b2036406cp-1,
> +      0x1.af286bca2p-1, 0x1.ac5701ac6p-1, 0x1.a98ef606ap-1,
> +      0x1.a6d01a6dp-1,  0x1.a41a41a42p-1, 0x1.a16d3f97ap-1,
> +      0x1.9ec8e951p-1,  0x1.9c2d14ee4p-1, 0x1.99999999ap-1,
> +      0x1.970e4f80cp-1, 0x1.948b0fcd6p-1, 0x1.920fb49dp-1,
> +      0x1.8f9c18f9cp-1, 0x1.8d3018d3p-1,  0x1.8acb90f6cp-1,
> +      0x1.886e5f0acp-1, 0x1.861861862p-1, 0x1.83c977ab2p-1,
> +      0x1.818181818p-1, 0x1.7f405fd02p-1, 0x1.7d05f417ep-1,
> +      0x1.7ad2208ep-1,  0x1.78a4c8178p-1, 0x1.767dce434p-1,
> +      0x1.745d1745ep-1, 0x1.724287f46p-1, 0x1.702e05c0cp-1,
> +      0x1.6e1f76b44p-1, 0x1.6c16c16c2p-1, 0x1.6a13cd154p-1,
> +      0x1.681681682p-1, 0x1.661ec6a52p-1, 0x1.642c8590cp-1,
> +      0x1.623fa7702p-1, 0x1.605816058p-1, 0x1.5e75bb8dp-1,
> +      0x1.5c9882b94p-1, 0x1.5ac056b02p-1, 0x1.58ed23082p-1,
> +      0x1.571ed3c5p-1,  0x1.555555556p-1, 0x1.5390948f4p-1,
> +      0x1.51d07eae2p-1, 0x1.501501502p-1, 0x1.4e5e0a73p-1,
> +      0x1.4cab88726p-1, 0x1.4afd6a052p-1, 0x1.49539e3b2p-1,
> +      0x1.47ae147aep-1, 0x1.460cbc7f6p-1, 0x1.446f86562p-1,
> +      0x1.42d6625d6p-1, 0x1.414141414p-1, 0x1.3fb013fbp-1,
> +      0x1.3e22cbce4p-1, 0x1.3c995a47cp-1, 0x1.3b13b13b2p-1,
> +      0x1.3991c2c18p-1, 0x1.381381382p-1, 0x1.3698df3dep-1,
> +      0x1.3521cfb2cp-1, 0x1.33ae45b58p-1, 0x1.323e34a2cp-1,
> +      0x1.30d19013p-1,  0x1.2f684bda2p-1, 0x1.2e025c04cp-1,
> +      0x1.2c9fb4d82p-1, 0x1.2b404ad02p-1, 0x1.29e4129e4p-1,
> +      0x1.288b01288p-1, 0x1.27350b882p-1, 0x1.25e22708p-1,
> +      0x1.24924924ap-1, 0x1.23456789ap-1, 0x1.21fb78122p-1,
> +      0x1.20b470c68p-1, 0x1.1f7047dc2p-1, 0x1.1e2ef3b4p-1,
> +      0x1.1cf06ada2p-1, 0x1.1bb4a4046p-1, 0x1.1a7b9611ap-1,
> +      0x1.19453808cp-1, 0x1.181181182p-1, 0x1.16e068942p-1,
> +      0x1.15b1e5f76p-1, 0x1.1485f0e0ap-1, 0x1.135c81136p-1,
> +      0x1.12358e75ep-1, 0x1.111111112p-1, 0x1.0fef010fep-1,
> +      0x1.0ecf56be6p-1, 0x1.0db20a89p-1,  0x1.0c9714fbcp-1,
> +      0x1.0b7e6ec26p-1, 0x1.0a6810a68p-1, 0x1.0953f3902p-1,
> +      0x1.084210842p-1, 0x1.073260a48p-1, 0x1.0624dd2f2p-1,
> +      0x1.05197f7d8p-1, 0x1.041041042p-1, 0x1.03091b52p-1,
> +      0x1.020408102p-1, 0x1.01010101p-1,  0x1p-1
> +    };

Ok.

> +  static const double lix[] = {
> +      0x0p+0,               -0x1.6fe50b6f1eafap-7, -0x1.6e79685c160d5p-6,
> +     -0x1.11cd1d51955bap-5, -0x1.6bad37591e03p-5,  -0x1.c4dfab908ddb5p-5,
> +     -0x1.0eb389fab4795p-4, -0x1.3aa2fdd26ae99p-4, -0x1.663f6faca846bp-4,
> +     -0x1.918a16e4cb157p-4, -0x1.bc84240a78a13p-4, -0x1.e72ec1181cfb1p-4,
> +     -0x1.08c588cd964e4p-3, -0x1.1dcd19759f2e3p-3, -0x1.32ae9e27627c6p-3,
> +     -0x1.476a9f989a58ap-3, -0x1.5c01a39fa6533p-3, -0x1.70742d4eed455p-3,
> +     -0x1.84c2bd02d6434p-3, -0x1.98edd077e9f0ap-3, -0x1.acf5e2db31eeap-3,
> +     -0x1.c0db6cddaa82dp-3, -0x1.d49ee4c33121ap-3, -0x1.e840be751d775p-3,
> +     -0x1.fbc16b9003e0bp-3, -0x1.0790adbae3fcp-2,  -0x1.11307dad465b5p-2,
> +     -0x1.1ac05b2924cc5p-2, -0x1.24407ab0cc41p-2,  -0x1.2db10fc4ea424p-2,
> +     -0x1.37124cea58697p-2, -0x1.406463b1d455dp-2, -0x1.49a784bcbaa37p-2,
> +     -0x1.52dbdfc4f341dp-2, -0x1.5c01a39ff2c9bp-2, -0x1.6518fe46abaa5p-2,
> +     -0x1.6e221cd9d6933p-2, -0x1.771d2ba7f5791p-2, -0x1.800a56315ee2ap-2,
> +     -0x1.88e9c72df8611p-2, -0x1.91bba891d495fp-2, -0x1.9a8023920fa4dp-2,
> +     -0x1.a33760a7fbca6p-2, -0x1.abe18797d2effp-2, -0x1.b47ebf734b923p-2,
> +     -0x1.bd0f2e9eb2b84p-2, -0x1.c592fad2be1aap-2, -0x1.ce0a4923cf5e6p-2,
> +     -0x1.d6753e02f4ebcp-2, -0x1.ded3fd445afp-2,   -0x1.e726aa1e558fep-2,
> +     -0x1.ef6d67325ba38p-2, -0x1.f7a8568c8aea6p-2, -0x1.ffd799a81be87p-2,
> +     0x1.f804ae8d33c4p-2,    0x1.efec61b04af4ep-2,  0x1.e7df5fe572606p-2,
> +     0x1.dfdd89d5b0009p-2,   0x1.d7e6c0abbd924p-2,  0x1.cffae611a74d6p-2,
> +     0x1.c819dc2d8578cp-2,   0x1.c043859e5bdbcp-2,  0x1.b877c57b47c04p-2,
> +     0x1.b0b67f4f29a66p-2,   0x1.a8ff97183ed07p-2,  0x1.a152f14293c74p-2,
> +     0x1.99b072a9289cap-2,   0x1.921800927e284p-2,  0x1.8a8980ac4113p-2,
> +     0x1.8304d90c2859dp-2,   0x1.7b89f02cbd49ap-2,  0x1.7418aceb84ab1p-2,
> +     0x1.6cb0f68656c95p-2,   0x1.6552b49993dc2p-2,  0x1.5dfdcf1eacd7bp-2,
> +     0x1.56b22e6b97c18p-2,   0x1.4f6fbb2ce6943p-2,  0x1.48365e6957b42p-2,
> +     0x1.4106017c0dbcfp-2,   0x1.39de8e15727d9p-2,  0x1.32bfee37489bcp-2,
> +     0x1.2baa0c34989c3p-2,   0x1.249cd2b177fd5p-2,  0x1.1d982c9d50468p-2,
> +     0x1.169c0536677acp-2,   0x1.0fa848045f67bp-2,  0x1.08bce0d9a7c6p-2,
> +     0x1.01d9bbcf66a2cp-2,   0x1.f5fd8a90e2d85p-3,  0x1.e857d3d3af1e5p-3,
> +     0x1.dac22d3ec5f4ep-3,   0x1.cd3c712db459ap-3,  0x1.bfc67a7ff3c22p-3,
> +     0x1.b2602497678f4p-3,   0x1.a5094b555a1f8p-3,  0x1.97c1cb136b96fp-3,
> +     0x1.8a8980ac8652dp-3,   0x1.7d60496c83f66p-3,  0x1.7046031c7cdafp-3,
> +     0x1.633a8bf460335p-3,   0x1.563dc2a08b102p-3,  0x1.494f863bbc1dep-3,
> +     0x1.3c6fb6507a37ep-3,   0x1.2f9e32d5257ecp-3,  0x1.22dadc2a627efp-3,
> +     0x1.1625931802e49p-3,   0x1.097e38cef9519p-3,  0x1.f9c95dc138295p-4,
> +     0x1.e0b1ae90505f6p-4,   0x1.c7b528b5fcffap-4,  0x1.aed391abb17a1p-4,
> +     0x1.960caf9bd35eap-4,   0x1.7d60496e3edebp-4,  0x1.64ce26bf2108ep-4,
> +     0x1.4c560fe5b573bp-4,   0x1.33f7cde24adfbp-4,  0x1.1bb32a5ed9353p-4,
> +     0x1.0387efbd3006ep-4,   0x1.d6ebd1f1d0955p-5,  0x1.a6f9c37a8beabp-5,
> +     0x1.77394c9d6762cp-5,   0x1.47aa07358e1a4p-5,  0x1.184b8e4d490efp-5,
> +     0x1.d23afc4d95c78p-6,   0x1.743ee8678a7cbp-6,  0x1.16a21e243bf78p-6,
> +     0x1.72c7ba20c907ep-7,   0x1.720d9c0536e17p-8,  0x0p+0
> +  };

Ok.

> +  double z = x;
> +  uint32_t ux = asuint (x);
> +  uint32_t ax = ux & (~0u >> 1);
> +  if (__glibc_unlikely (ux >= 0x17fu << 23))
> +    { /* x <= -1 */
> +      if (ux == (0x17fu << 23))
> +	return __math_divzerof (1);
> +      if (ux > (0x1ffu << 23))
> +	return x + x;		   /* nan */
> +      return __math_invalidf (x);
> +    }

Ok.

> +  else if (__glibc_unlikely (ax >= (0xff << 23)))
> +    { /* +inf, nan  */
> +      if (ax > (0xff << 23))
> +	return x + x; /* nan  */
> +      return INFINITY;
> +    }

Ok.

> +  else if (__glibc_likely (ax < 0x3cb7aa26u))
> +    { /* |x| < 0x1.6f544cp-6  */
> +      double z2 = z * z, z4 = z2 * z2;
> +      if ( __glibc_likely(ax < 0x3b9d9d34u))

Needs space between 'y' and '('

> +	{ /* |x| < 0x1.3b3a68p-8 */
> +	  if (__glibc_likely (ax < 0x39638a7eu))
> +	    { /* |x| < 0x1.c714fcp-13 */
> +	      if (__glibc_likely (ax < 0x329c5639u))
> +		{ /* |x| < 0x1.38ac72p-26 */
> +		  static const double c[] =
> +		    {
> +		      0x1.71547652b82fep+0, -0x1.71547652b82ffp-1
> +		    };
> +		  return z * (c[0] + z * c[1]);
> +		}
> +	      else
> +		{
> +		  if (__glibc_unlikely (ux == 0x32ff7045u))
> +		    return 0x1.70851ap-25f - 0x1.8p-80f;
> +		  if (__glibc_unlikely (ux == 0xb395efbbu))
> +		    return -0x1.b0a00ap-24f + 0x1p-76f;
> +		  if (__glibc_unlikely (ux == 0x35a14df7u))
> +		    return 0x1.d16d2p-20f + 0x1p-72f;
> +		  if (__glibc_unlikely (ux == 0x3841cb81u))
> +		    return 0x1.17949ep-14f + 0x1p-67f;
> +		  static const double c[] =
> +		    {
> +		      0x1.71547652b82fep+0, -0x1.71547652b82fdp-1,
> +		      0x1.ec709ead0c9a7p-2, -0x1.7154773c1cb29p-2
> +		    };
> +		  return z * ((c[0] + z * c[1]) + z2 * (c[2] + z * c[3]));
> +		}
> +	    }
> +	  else

Ok.

> +	    {
> +	      if (__glibc_unlikely (ux == 0xbac9363du))
> +		return -0x1.2282aap-9f + 0x1p-61f;
> +	      static const double c[] =
> +	       	{
> +		  0x1.71547652b82fep+0, -0x1.71547652b83p-1,
> +		  0x1.ec709dc28f51bp-2, -0x1.7154765157748p-2,
> +		  0x1.2778a510a3682p-2, -0x1.ec745df1551fcp-3
> +		};
> +	      return z
> +		     * ((c[0] + z * c[1]) + z2 * (c[2] + z * c[3])
> +			+ z4 * ((c[4] + z * c[5])));
> +	    }
> +	}
> +      else

Ok.

> +	{
> +	  static const double c[] =
> +	    {
> +	      0x1.71547652b82fep+0, -0x1.71547652b82fbp-1,
> +	      0x1.ec709dc3b6a73p-2, -0x1.71547652dc09p-2,
> +	      0x1.2776c1a88901p-2,  -0x1.ec7095bd4d208p-3,
> +	      0x1.a66bec7fc8f7p-3,  -0x1.71a900fc3f3f9p-3
> +	    };
> +	  return z
> +		 * ((c[0] + z * c[1]) + z2 * (c[2] + z * c[3])
> +		    + z4 * ((c[4] + z * c[5]) + z2 * (c[6] + z * c[7])));
> +	}
> +    }

Ok.

> +  else
> +    { /* |x| >= 0x1.6f544cp-6 */
> +      float h, l;
> +      /* With gcc 6.3.0, if we return 0x1.e90026p+4f + 0x1.fp-21
> +	 in the second exceptional case, with rounding up it yields
> +	 0x1.e90026p+4 which is incorrect, thus we use this workaround. See
> +	 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112367. */
> +      if (__glibc_unlikely (ux == 0x52928e33u))
> +	{
> +	  h = 0x1.318ffap+5f;
> +	  l = 0x1.fp-20f;
> +	  return h + l;
> +	}
> +      if (__glibc_unlikely (ux == 0x4ebd09e3u))
> +	{
> +	  h = 0x1.e90026p+4f;
> +	  l = 0x1.fp-21;
> +	  return h + l;
> +	}

Ok.

> +      uint64_t tp = asuint64 (z + 1.0);
> +      uint64_t m = tp & (~(uint64_t) 0 >> 12);
> +      int e = (tp >> 52) - 0x3ff;
> +      int j = (m + ((int64_t) 1 << (52 - 8))) >> (52 - 7), k = j > 53;
> +      e += k;
> +      double xd = asdouble (m | (uint64_t) 0x3ff << 52);
> +      z = fma (xd, ix[j], -1.0);
> +      static const double c[] =
> +	{
> +	  0x1.71547652b82fep+0, -0x1.71547652b82ffp-1, 0x1.ec709dc32988bp-2,
> +	  -0x1.715476521ec2bp-2, 0x1.277801a1ad904p-2, -0x1.ec731704d6a88p-3
> +       	};
> +      double z2 = z * z;
> +      double c0 = c[0] + z * c[1];
> +      double c2 = c[2] + z * c[3];
> +      double c4 = c[4] + z * c[5];
> +      c0 += z2 * (c2 + z2 * c4);
> +      return (z * c0 - lix[j]) + e;
> +    }
> +}
> +libm_alias_float (__log2p1, log2p1)

Ok.

> diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
> diff --git a/sysdeps/m68k/m680x0/fpu/libm-test-ulps b/sysdeps/m68k/m680x0/fpu/libm-test-ulps
> diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
> diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
> diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
> diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
> diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
> diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
> diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
> diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
> diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 15/17] math: Use log10p1f from CORE-MATH
  2024-10-25 18:21 ` [PATCH 15/17] math: Use log10p1f " Adhemerval Zanella
@ 2024-10-30 19:43   ` DJ Delorie
  0 siblings, 0 replies; 53+ messages in thread
From: DJ Delorie @ 2024-10-30 19:43 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
> diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps
> diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
> diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
> diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
> diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
> diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps

Ok.

> diff --git a/sysdeps/ieee754/flt-32/s_log10p1f.c b/sysdeps/ieee754/flt-32/s_log10p1f.c

> +/* Correctly-rounded biased argument base-10 logarithm function for binary32 value.
> +
> +Copyright (c) 2022-2023 Alexei Sibidanov.
> +
> +This file is part of the CORE-MATH project
> +project (file src/binary32/log10p1/log10p1f.c revision bc385c2).
> +
> +Permission is hereby granted, free of charge, to any person obtaining a copy
> +of this software and associated documentation files (the "Software"), to deal
> +in the Software without restriction, including without limitation the rights
> +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> +copies of the Software, and to permit persons to whom the Software is
> +furnished to do so, subject to the following conditions:
> +
> +The above copyright notice and this permission notice shall be included in all
> +copies or substantial portions of the Software.
> +
> +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> +SOFTWARE.
> +*/
> +
> +#include <stdint.h>
> +#include <errno.h>
> +#include <fenv.h>
> +#include <libm-alias-float.h>
> +#include "math_config.h"

Ok.

> +static __attribute__ ((noinline)) float
> +as_special (float x)
> +{
> +  uint32_t ux = asuint (x);
> +  if (ux == 0x7f800000u)
> +    return x; /* +inf */
> +  uint32_t ax = ux << 1;
> +  if (ax == 0x17fu << 24)
> +    /* x+1 = 0.0 */
> +    return __math_divzerof (1);
> +  if (ax > 0xff000000u)
> +    return x + x; /* nan */
> +  return  __math_invalidf (x);
> +}

Ok.

> +float
> +__log10p1f (float x)
> +{
> +  static const double tr[] =
> +    {
> +      0x1p+0,         0x1.f81f82p-1,  0x1.f07c1fp-1,  0x1.e9131acp-1,
> +      0x1.e1e1e1ep-1, 0x1.dae6077p-1, 0x1.d41d41dp-1, 0x1.cd85689p-1,
> +      0x1.c71c71cp-1, 0x1.c0e0704p-1, 0x1.bacf915p-1, 0x1.b4e81b5p-1,
> +      0x1.af286bdp-1, 0x1.a98ef6p-1,  0x1.a41a41ap-1, 0x1.9ec8e95p-1,
> +      0x1.999999ap-1, 0x1.948b0fdp-1, 0x1.8f9c19p-1,  0x1.8acb90fp-1,
> +      0x1.8618618p-1, 0x1.8181818p-1, 0x1.7d05f41p-1, 0x1.78a4c81p-1,
> +      0x1.745d174p-1, 0x1.702e05cp-1, 0x1.6c16c17p-1, 0x1.6816817p-1,
> +      0x1.642c859p-1, 0x1.605816p-1,  0x1.5c9882cp-1, 0x1.58ed231p-1,
> +      0x1.5555555p-1, 0x1.51d07ebp-1, 0x1.4e5e0a7p-1, 0x1.4afd6ap-1,
> +      0x1.47ae148p-1, 0x1.446f865p-1, 0x1.4141414p-1, 0x1.3e22cbdp-1,
> +      0x1.3b13b14p-1, 0x1.3813814p-1, 0x1.3521cfbp-1, 0x1.323e34ap-1,
> +      0x1.2f684bep-1, 0x1.2c9fb4ep-1, 0x1.29e412ap-1, 0x1.27350b9p-1,
> +      0x1.2492492p-1, 0x1.21fb781p-1, 0x1.1f7047ep-1, 0x1.1cf06aep-1,
> +      0x1.1a7b961p-1, 0x1.1811812p-1, 0x1.15b1e5fp-1, 0x1.135c811p-1,
> +      0x1.1111111p-1, 0x1.0ecf56cp-1, 0x1.0c9715p-1,  0x1.0a6810ap-1,
> +      0x1.0842108p-1, 0x1.0624dd3p-1, 0x1.041041p-1,  0x1.0204081p-1,
> +      0.5
> +    };
> +  static const double tl[] =
> +    {
> +      0x1.562ec497ef351p-43, 0x1.b9476892ea99cp-8, 0x1.b5e909c959eecp-7,
> +      0x1.45f4f59ec84fp-6,   0x1.af5f92cbcf2aap-6, 0x1.0ba01a6069052p-5,
> +      0x1.3ed119b99dd41p-5,  0x1.714834298a088p-5, 0x1.a30a9d98309c1p-5,
> +      0x1.d41d51266b9d9p-5,  0x1.02428c0f62dfcp-4, 0x1.1a23444eea521p-4,
> +      0x1.31b30543f2597p-4,  0x1.48f3ed39bd5e7p-4, 0x1.5fe8049a0bd06p-4,
> +      0x1.769140a6a78eap-4,  0x1.8cf1836c96595p-4, 0x1.a30a9d5551a84p-4,
> +      0x1.b8de4d1ee5b21p-4,  0x1.ce6e4202c7bc9p-4, 0x1.e3bc1accaa6eap-4,
> +      0x1.f8c9683b584b7p-4,  0x1.06cbd68ca86ep-3,  0x1.11142f19de3a2p-3,
> +      0x1.1b3e71fa795fp-3,   0x1.254b4d37a3354p-3, 0x1.2f3b6912cab79p-3,
> +      0x1.390f6831144f7p-3,  0x1.42c7e7fffb21ap-3, 0x1.4c65808c779aep-3,
> +      0x1.55e8c507508c7p-3,  0x1.5f52445deb049p-3, 0x1.68a288c3efe72p-3,
> +      0x1.71da17bdef98bp-3,  0x1.7af9736089c4bp-3, 0x1.84011952a11ebp-3,
> +      0x1.8cf1837a7d6d1p-3,  0x1.95cb2891e3048p-3, 0x1.9e8e7b0f85651p-3,
> +      0x1.a73beaa5d9dfep-3,  0x1.afd3e39454544p-3, 0x1.b856cf060c662p-3,
> +      0x1.c0c5134de0c6dp-3,  0x1.c91f1371bb611p-3, 0x1.d1652ffcd2bc5p-3,
> +      0x1.d997c6f634ae6p-3,  0x1.e1b733ab8fbadp-3, 0x1.e9c3ceadab4c8p-3,
> +      0x1.f1bdeec438f77p-3,  0x1.f9a5e7a5f906fp-3, 0x1.00be05ac02564p-2,
> +      0x1.04a054d81990cp-2,  0x1.087a083594e33p-2, 0x1.0c4b457098b4fp-2,
> +      0x1.101431aa1f48ap-2,  0x1.13d4f08b98411p-2, 0x1.178da53edaecbp-2,
> +      0x1.1b3e71e9f9391p-2,  0x1.1ee777defd526p-2, 0x1.2288d7b48d874p-2,
> +      0x1.2622b0f52dad8p-2,  0x1.29b522a4c594cp-2, 0x1.2d404b0e305b9p-2,
> +      0x1.30c4478f3f21dp-2,  0x1.34413509f6f4dp-2
> +    };
> +  static const union
> +  {
> +    float f;
> +    uint32_t u;
> +  } st[] =
> +  {
> +    { 0x0p+0 },        { 0x1.2p+3 },      { 0x1.8cp+6 },
> +    { 0x1.f38p+9 },    { 0x1.3878p+13 },  { 0x1.869fp+16 },
> +    { 0x1.e847ep+19 }, { 0x1.312cfep+23 }
> +  };

Ok.

> +  double z = x;
> +  uint32_t ux = asuint (x);
> +  if (__glibc_unlikely (ux >= 0x17fu << 23)) /* x <= -1 */
> +    return as_special (x);
> +  uint32_t ax = ux & (~0u >> 1);
> +  if (__glibc_unlikely (ax == 0))
> +    return copysign (0, x);
> +  if (__glibc_unlikely (ax >= (0xff << 23))) /* +inf, nan */
> +    return as_special (x);
> +  int ie = ux;
> +  ie >>= 23;
> +  unsigned int je = ie - 126;
> +  je = (je * 0x9a209a8) >> 29;
> +  if (__glibc_unlikely (ux == st[je].u))
> +    return je;

Ok.

> +  uint64_t tz = asuint64 (z + 1.0);
> +  uint64_t m = tz & (~(uint64_t) 0 >> 12);
> +  int32_t e = (tz >> 52) - 1023, j = ((m + ((int64_t) 1 << 45)) >> 46);
> +  tz = m | ((uint64_t) 0x3ff << 52);
> +  double ix = tr[j], l = tl[j];
> +  double off = e * 0x1.34413509f79ffp-2 + l;
> +  double v = asdouble (tz) * ix - 1;
> +
> +  static const double h[] =
> +    {
> +      0x1.bcb7b150bf6d8p-2, -0x1.bcb7b1738c07ep-3,
> +      0x1.287de19e795c5p-3, -0x1.bca44edc44bc4p-4
> +    };

Ok.

> +  double v2 = v * v;
> +  double f = (h[0] + v * h[1]) + v2 * (h[2] + v * h[3]);
> +  double r = off + v * f;
> +  float ub = r;
> +  float lb = r + 0x1.5cp-42;
> +  if (__glibc_unlikely (ub != lb))
> +    {
> +      if (__glibc_unlikely (ax < 0x3d32743eu))
> +	{ /* 0x1.64e87cp-5f */
> +	  if (__glibc_unlikely (ux == 0xa6aba8afu))
> +	    return -0x1.2a33bcp-51f + 0x1p-76f;
> +	  if (__glibc_unlikely (ux == 0xaf39b9a7u))
> +	    return -0x1.42a342p-34f + 0x1p-59f;
> +	  if (__glibc_unlikely (ux == 0x399a7c00u))
> +	    return 0x1.0c53cap-13f + 0x1p-38f;
> +	  z /= 2.0 + z;
> +	  double z2 = z * z, z4 = z2 * z2;
> +	  static const double c[] =
> +	    { 
> +	      0x1.bcb7b1526e50fp-1, 0x1.287a76370129dp-2,
> +	      0x1.63c62378fa3dbp-3, 0x1.fca4139a42374p-4
> +	    };
> +	  float ret = z * ((c[0] + z2 * c[1]) + z4 * (c[2] + z2 * c[3]));
> +	  if (x != 0.0f && ret == 0.0)
> +	    __set_errno (ERANGE);
> +	  return ret;
> +	}

Ok.

> +      if (__glibc_unlikely (ux == 0x7956ba5eu))
> +	return 0x1.16bebap+5f + 0x1p-20f;
> +      if (__glibc_unlikely (ux == 0xbd86ffb9u))
> +	return -0x1.e53536p-6f + 0x1p-31f;
> +      static const double c[] =
> +       	{
> +	  0x1.bcb7b1526e50ep-2,  -0x1.bcb7b1526e53dp-3, 0x1.287a7636f3fa2p-3,
> +	  -0x1.bcb7b146a14b3p-4,  0x1.63c627d5219cbp-4, -0x1.2880736c8762dp-4,
> +	  0x1.fc1ecf913961ap-5
> +	};
> +      f = v
> +	  * ((c[0] + v * c[1])
> +	     + v2 * ((c[2] + v * c[3]) + v2 * (c[4] + v * c[5] + v2 * c[6])));
> +      f += l - tl[0];
> +      double el = e * 0x1.34413509f79ffp-2;
> +      r = el + f;
> +      ub = r;
> +    }
> +  return ub;
> +}
> +libm_alias_float (__log10p1, log10p1)

Ok.

> diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
> diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
> diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
> diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
> diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
> diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
> diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
> diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
> diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
> diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 16/17] x86_64: Add exp10m1f with FMA
  2024-10-25 18:21 ` [PATCH 16/17] x86_64: Add exp10m1f with FMA Adhemerval Zanella
  2024-10-26 18:38   ` Noah Goldstein
@ 2024-10-30 20:06   ` DJ Delorie
  1 sibling, 0 replies; 53+ messages in thread
From: DJ Delorie @ 2024-10-30 20:06 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/sysdeps/ieee754/flt-32/s_exp10m1f.c b/sysdeps/ieee754/flt-32/s_exp10m1f.c
> +#ifndef __exp10m1f
>  libm_alias_float (__exp10m1, exp10m1)
> +#endif

Ok.

> diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile

>  CFLAGS-s_sin-fma.c = -mfma -mavx2
>  CFLAGS-s_tan-fma.c = -mfma -mavx2
>  CFLAGS-s_sincos-fma.c = -mfma -mavx2
> +CFLAGS-s_exp10m1f-fma.c = -mfma -mavx2

Ok.

>    s_ceilf-sse4_1 \
>    s_cosf-fma \
>    s_cosf-sse2 \
> +  s_exp10m1f-fma \

Ok.

> diff --git a/sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c b/sysdeps/x86_64/fpu/multiarch/s_exp10m1f-fma.c
> new file mode 100644

> +#define __exp10m1f __exp10m1f_fma
> +#define SECTION __attribute__ ((section (".text.fma")))
> +
> +#include <sysdeps/ieee754/flt-32/s_exp10m1f.c>

Ok.

> diff --git a/sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c b/sysdeps/x86_64/fpu/multiarch/s_exp10m1f.c
> new file mode 100644

> +/* Multiple versions of exp10m1.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +
> +extern float __redirect_exp10m1f (float);
> +
> +# define SYMBOL_NAME exp10m1f
> +# include "ifunc-fma.h"
> +
> +libc_ifunc_redirected (__redirect_exp10m1f, __exp10m1f, IFUNC_SELECTOR ());
> +libm_alias_float (__exp10m1, exp10m1)
> +
> +# define __exp10m1f __exp10m1f_sse2
> +#endif
> +#include <sysdeps/ieee754/flt-32/s_exp10m1f.c>

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 17/17] x86_64: Add exp2m1f with FMA
  2024-10-25 18:21 ` [PATCH 17/17] x86_64: Add exp2m1f " Adhemerval Zanella
  2024-10-25 19:10   ` Joseph Myers
  2024-10-26 18:34   ` Noah Goldstein
@ 2024-10-30 20:09   ` DJ Delorie
  2 siblings, 0 replies; 53+ messages in thread
From: DJ Delorie @ 2024-10-30 20:09 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/sysdeps/ieee754/flt-32/s_exp2m1f.c b/sysdeps/ieee754/flt-32/s_exp2m1f.c
> +#ifndef __exp2m1f
>  libm_alias_float (__exp2m1, exp2m1)
> +#endif

Ok.

> diff --git a/sysdeps/x86_64/fpu/multiarch/Makefile b/sysdeps/x86_64/fpu/multiarch/Makefile
>  CFLAGS-s_tan-fma.c = -mfma -mavx2
>  CFLAGS-s_sincos-fma.c = -mfma -mavx2
>  CFLAGS-s_exp10m1f-fma.c = -mfma -mavx2
> +CFLAGS-s_exp2m1f-fma.c = -mfma -mavx2

Ok.

>    s_cosf-fma \
>    s_cosf-sse2 \
>    s_exp10m1f-fma \
> +  s_exp2m1f-fma \

Ok.

> diff --git a/sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c b/sysdeps/x86_64/fpu/multiarch/s_exp2m1f-fma.c
> new file mode 100644
> +#define __exp2m1f __exp2m1f_fma
> +#define SECTION __attribute__ ((section (".text.fma")))
> +
> +#include <sysdeps/ieee754/flt-32/s_exp2m1f.c>

Ok.

> diff --git a/sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c b/sysdeps/x86_64/fpu/multiarch/s_exp2m1f.c
> new file mode 100644

> +/* Multiple versions of exp2m1.
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <sysdeps/x86/isa-level.h>
> +#if MINIMUM_X86_ISA_LEVEL < AVX2_X86_ISA_LEVEL
> +# include <libm-alias-float.h>
> +
> +extern float __redirect_exp2m1f (float);
> +
> +# define SYMBOL_NAME exp2m1f
> +# include "ifunc-fma.h"
> +
> +libc_ifunc_redirected (__redirect_exp2m1f, __exp2m1f, IFUNC_SELECTOR ());
> +libm_alias_float (__exp2m1, exp2m1)
> +
> +# define __exp2m1f __exp2m1f_sse2
> +#endif
> +#include <sysdeps/ieee754/flt-32/s_exp2m1f.c>

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 01/17] math: Add e_gammaf_r to glibc code and style
  2024-10-29  2:58   ` DJ Delorie
@ 2024-10-31 12:18     ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 53+ messages in thread
From: Adhemerval Zanella Netto @ 2024-10-31 12:18 UTC (permalink / raw)
  To: DJ Delorie; +Cc: libc-alpha, Paul.Zimmermann, sibid



On 28/10/24 23:58, DJ Delorie wrote:
> 
> A few comments that were reformatted but lack two spaces after '.'
> 
> Otherwise LGTM
> Reviewed-by: DJ Delorie <dj@redhat.com>
> 
> FYI I would have lined up the '0x' in all those tables (i.e. put a space
> before all positive ones), but that's just me ;-)

I will fix it, it is more readable indeed.

> 
> Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
>> diff --git a/sysdeps/ieee754/flt-32/e_gammaf_r.c b/sysdeps/ieee754/flt-32/e_gammaf_r.c
>> -
>> -typedef union {float f; uint32_t u;} b32u32_u;
>> -typedef union {double f; uint64_t u;} b64u64_u;
>> +#include "math_config.h"
> 
> Ok
> 
>>  
>>    /* List of exceptional cases. Each entry contains the 32-bit encoding u of x,
>>       a binary32 approximation f of gamma(x), and a correction term df.  */
>> -  static const struct {uint32_t u; float f, df;} tb[] = {
>> -    {0x27de86a9u, 0x1.268266p+47f, 0x1p22f},      // x = 0x1.bd0d52p-48
>> -    {0x27e05475u, 0x1.242422p+47f, 0x1p22f},      // x = 0x1.c0a8eap-48
>> -    {0xb63befb3u, -0x1.5cb6e4p+18f, 0x1p-7f},     // x = -0x1.77df66p-19
>> -    {0x3c7bb570u, 0x1.021d9p+6f, 0x1p-19f},       // x = 0x1.f76aep-7
>> -    {0x41e886d1u, 0x1.33136ap+98f, 0x1p73f},      // x = 0x1.d10da2p+4
>> -    {0xc067d177u, 0x1.f6850cp-3f, 0x1p-28f},      // x = -0x1.cfa2eep+1
>> -    {0xbd99da31u, -0x1.befe66p+3, -0x1p-22f},     // x = -0x1.33b462p-4
>> -    {0xbf54c45au, -0x1.a6b4ecp+2, +0x1p-23f},     // x = -0x1.a988b4p-1
>> -    {0x41ee77feu, 0x1.d3631cp+101, -0x1p-76f},    // x = 0x1.dceffcp+4
>> -    {0x3f843a64u, 0x1.f6c638p-1, 0x1p-26f},       // x = 0x1.0874c8p+0
>> +  static const struct
>> +  {
>> +    uint32_t u;
>> +    float f, df;
>> +  } tb[] = {
>> +    { 0x27de86a9u, 0x1.268266p+47f, 0x1p22f },	 /* x = 0x1.bd0d52p-48 */
>> +    { 0x27e05475u, 0x1.242422p+47f, 0x1p22f },	 /* x = 0x1.c0a8eap-48 */
>> +    { 0xb63befb3u, -0x1.5cb6e4p+18f, 0x1p-7f },	 /* x = -0x1.77df66p-19 */
>> +    { 0x3c7bb570u, 0x1.021d9p+6f, 0x1p-19f },	 /* x = 0x1.f76aep-7 */
>> +    { 0x41e886d1u, 0x1.33136ap+98f, 0x1p73f },	 /* x = 0x1.d10da2p+4 */
>> +    { 0xc067d177u, 0x1.f6850cp-3f, 0x1p-28f },	 /* x = -0x1.cfa2eep+1 */
>> +    { 0xbd99da31u, -0x1.befe66p+3, -0x1p-22f },	 /* x = -0x1.33b462p-4 */
>> +    { 0xbf54c45au, -0x1.a6b4ecp+2, +0x1p-23f },	 /* x = -0x1.a988b4p-1 */
>> +    { 0x41ee77feu, 0x1.d3631cp+101, -0x1p-76f }, /* x = 0x1.dceffcp+4 */
>> +    { 0x3f843a64u, 0x1.f6c638p-1, 0x1p-26f },	 /* x = 0x1.0874c8p+0 */
>>    };
> 
> Format change, ok.
> 
>> -  b32u32_u t = {.f = x};
>> -  uint32_t ax = t.u<<1;
>> -  if(__builtin_expect(ax>=(0xffu<<24), 0)){ /* x=NaN or +/-Inf */
>> -    if(ax==(0xffu<<24)){ /* x=+/-Inf */
>> -      if(t.u>>31){ /* x=-Inf */
>> -        return x / x; /* will raise the "Invalid operation" exception */
>> -      }
>> -      return x; /* x=+Inf */
>> +  uint32_t t = asuint (x);
>> +  uint32_t ax = t << 1;
>> +  if (__glibc_unlikely (ax >= (0xffu << 24)))
>> +    { /* x=NaN or +/-Inf */
>> +      if (ax == (0xffu << 24))
>> +	{ /* x=+/-Inf */
>> +	  if (t >> 31) /* x=-Inf */
>> +	    return __math_invalidf (x);
>> +	  return x; /* x=+Inf */
>> +	}
>> +      return x + x; /* x=NaN, where x+x ensures the "Invalid operation"
>> +		       exception is set if x is sNaN */
>>      }
>> -    return x + x; /* x=NaN, where x+x ensures the "Invalid operation"
>> -                     exception is set if x is sNaN */
>> -  }
> 
> Ok.
> 
>>    double z = x;
>> -  if(__builtin_expect(ax<0x6d000000u, 0)){ /* |x| < 0x1p-18 */
>> -    volatile double d = (0x1.fa658c23b1578p-1 - 0x1.d0a118f324b63p-1*z)*z - 0x1.2788cfc6fb619p-1;
>> -    double f = 1.0/z + d;
>> -    float r = f;
>> -    b64u64_u rt = {.f = f};
>> -    if(((rt.u+2)&0xfffffff) < 4){
>> -      for(unsigned i=0;i<sizeof(tb)/sizeof(tb[0]);i++)
>> -	if(t.u==tb[i].u) return tb[i].f + tb[i].df;
>> +  if (__glibc_unlikely (ax < 0x6d000000u))
>> +    { /* |x| < 0x1p-18 */
>> +      volatile double d = (0x1.fa658c23b1578p-1 - 0x1.d0a118f324b63p-1 * z)
>> +	* z - 0x1.2788cfc6fb619p-1;
>> +      double f = 1.0 / z + d;
>> +      float r = f;
>> +      uint64_t rt = asuint64 (f);
>> +      if (((rt + 2) & 0xfffffff) < 4)
>> +	{
>> +	  for (unsigned i = 0; i < sizeof (tb) / sizeof (tb[0]); i++)
>> +	    if (t == tb[i].u)
>> +	      return tb[i].f + tb[i].df;
>> +	}
> 
> Ok.
> 
>> +      return r;
>> +    }
>> +  float fx = floorf (x);
>> +  if (__glibc_unlikely (x >= 0x1.18522p+5f))
>> +    {
>> +      /* Overflow case. The original CORE-MATH code returns 0x1p127f *
> 
> Two spaces after period.

Ack.

> 
>> +	 0x1p127f, but apparently some compilers replace this by +Inf.  */
>> +      return math_narrow_eval (x * 0x1p127f);
>>      }
>> -    return r;
>> -  }
>> -  float fx = __builtin_floorf(x);
>> -  if(__builtin_expect(x >= 0x1.18522p+5f, 0)){
>> -    /* Overflow case. The original CORE-MATH code returns 0x1p127f * 0x1p127f,
>> -       but apparently some compilers replace this by +Inf.  */
>> -    return math_narrow_eval (x * 0x1p127f);
>> -  }
> 
> Ok.
> 
>>    /* compute k only after the overflow check, otherwise the case to integer
>>       might overflow */
>>    int k = fx;
>> -  if(__builtin_expect(fx==x, 0)){ /* x is integer */
>> -    if(x == 0.0f){
>> -      return 1.0f/x;
>> +  if (__glibc_unlikely (fx == x))
>> +    { /* x is integer */
>> +      if (x == 0.0f)
>> +	return 1.0f / x;
>> +      if (x < 0.0f)
>> +	return __math_invalidf (0.0f);
>>      }
>> -    if(x < 0.0f){
>> -      return 0.0f / 0.0f; /* should raise the "Invalid operation" exception */
> 
> Ok.
> 
>> +      double t0 = 1, x0 = 1;
>> +      for (int i = 1; i < k; i++, x0 += 1.0)
>> +	t0 *= x0;
>> +      return t0;
>> +  if (__glibc_unlikely (x < -42.0f))
>> +    { /* negative non-integer */
>> +      /* For x < -42, x non-integer, |gamma(x)| < 2^-151.  */
>> +      static const float sgn[2] = { 0x1p-127f, -0x1p-127f };
>> +      /* Underflows always happens */
>> +      return math_narrow_eval (0x1p-127f * sgn[k & 1]);
>>      }
>> -    double t0 = 1, x0 = 1;
>> -    for(int i=1; i<k; i++, x0 += 1.0) t0 *= x0;
>> -    return t0;
>> -  }
>> -  if(__builtin_expect(x<-42.0f, 0)){ /* negative non-integer */
>> -    /* For x < -42, x non-integer, |gamma(x)| < 2^-151.  */
>> -    static const float sgn[2] = {0x1p-127f, -0x1p-127f};
>> -    /* Underflows always happens */
>> -    return math_narrow_eval (0x1p-127f * sgn[k&1]);
>> -  }
> 
> Ok.
> 
>> -  /* The array c[] stores a degree-15 polynomial approximation for gamma(x).  */
>> +  /* The array c[] stores a degree-15 polynomial approximation for gamma(x). */
> 
> Two spaces after a period.

Ack.

> 
>>    static const double c[] =
>> -    {0x1.c9a76be577123p+0, 0x1.8f2754ddcf90dp+0, 0x1.0d1191949419bp+0, 0x1.e1f42cf0ae4a1p-2,
>> -     0x1.82b358a3ab638p-3, 0x1.e1f2b30cd907bp-5, 0x1.240f6d4071bd8p-6, 0x1.1522c9f3cd012p-8,
>> -     0x1.1fd0051a0525bp-10, 0x1.9808a8b96c37ep-13, 0x1.b3f78e01152b5p-15, 0x1.49c85a7e1fd04p-18,
>> -     0x1.471ca49184475p-19, -0x1.368f0b7ed9e36p-23, 0x1.882222f9049efp-23, -0x1.a69ed2042842cp-25};
>> +    {
>> +      0x1.c9a76be577123p+0,  0x1.8f2754ddcf90dp+0,   0x1.0d1191949419bp+0,
>> +      0x1.e1f42cf0ae4a1p-2,  0x1.82b358a3ab638p-3,   0x1.e1f2b30cd907bp-5,
>> +      0x1.240f6d4071bd8p-6,  0x1.1522c9f3cd012p-8,   0x1.1fd0051a0525bp-10,
>> +      0x1.9808a8b96c37ep-13, 0x1.b3f78e01152b5p-15,  0x1.49c85a7e1fd04p-18,
>> +      0x1.471ca49184475p-19, -0x1.368f0b7ed9e36p-23, 0x1.882222f9049efp-23,
>> +      -0x1.a69ed2042842cp-25
>> +   };
> 
> Ok.
> 
>> -  double m = z - 0x1.7p+1, i = __builtin_roundeven(m), step = __builtin_copysign(1.0,i);
>> -  double d = m - i, d2 = d*d, d4 = d2*d2, d8 = d4*d4;
>> -  double f = (c[0] + d*c[1]) + d2*(c[2] + d*c[3]) + d4*((c[4] + d*c[5]) + d2*(c[6] + d*c[7]))
>> -    + d8*((c[8] + d*c[9]) + d2*(c[10] + d*c[11]) + d4*((c[12] + d*c[13]) + d2*(c[14] + d*c[15])));
>> -  int jm = __builtin_fabs(i);
>> +  double m = z - 0x1.7p+1;
>> +  double i = roundeven (m);
>> +  double step = copysign (1.0, i);
>> +  double d = m - i, d2 = d * d, d4 = d2 * d2, d8 = d4 * d4;
>> +  double f = (c[0] + d * c[1]) + d2 * (c[2] + d * c[3])
>> +	     + d4 * ((c[4] + d * c[5]) + d2 * (c[6] + d * c[7]))
>> +	     + d8 * ((c[8] + d * c[9]) + d2 * (c[10] + d * c[11])
>> +		     + d4 * ((c[12] + d * c[13]) + d2 * (c[14] + d * c[15])));
>> +  int jm = fabs (i);
> 
> Ok.
> 
>>    double w = 1;
>> -  if(jm){
>> -    z -= 0.5 + step*0.5;
>> -    w = z;
>> -    for(int j=jm-1; j; j--) {z -= step; w *= z;}
>> -  }
>> -  if(i<=-0.5) w = 1/w;
>> +  if (jm)
>> +    {
>> +      z -= 0.5 + step * 0.5;
>> +      w = z;
>> +      for (int j = jm - 1; j; j--)
>> +	{
>> +	  z -= step;
>> +	  w *= z;
>> +	}
>> +    }
>> +  if (i <= -0.5)
>> +    w = 1 / w;
> 
> Ok.
> 
>>    f *= w;
>> -  b64u64_u rt = {.f = f};
>> +  uint64_t rt = asuint64 (f);
> 
> Ok.
> 
>>    float r = f;
>>    /* Deal with exceptional cases.  */
>> -  if(__builtin_expect(((rt.u+2)&0xfffffff) < 8, 0)){
>> -    for(unsigned j=0;j<sizeof(tb)/sizeof(tb[0]);j++) {
>> -      if(t.u==tb[j].u) return tb[j].f + tb[j].df;
>> +  if (__glibc_unlikely (((rt + 2) & 0xfffffff) < 8))
>> +    {
>> +      for (unsigned j = 0; j < sizeof (tb) / sizeof (tb[0]); j++)
>> +	if (t == tb[j].u)
>> +	  return tb[j].f + tb[j].df;
>>      }
>> -  }
>>    return r;
>>  }
> 
>> diff --git a/sysdeps/m68k/m680x0/fpu/math_errf.c b/sysdeps/m68k/m680x0/fpu/math_errf.c
>> deleted file mode 100644
>> index 1cc8931700..0000000000
>> --- a/sysdeps/m68k/m680x0/fpu/math_errf.c
>> +++ /dev/null
>> @@ -1 +0,0 @@
>> -/* Not needed.  */
> 
> Ok.
> 


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 04/17] benchtests: Add expm1f benchmark
  2024-10-29 18:28   ` DJ Delorie
@ 2024-10-31 12:39     ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 53+ messages in thread
From: Adhemerval Zanella Netto @ 2024-10-31 12:39 UTC (permalink / raw)
  To: DJ Delorie; +Cc: libc-alpha, Paul.Zimmermann, sibid



On 29/10/24 15:28, DJ Delorie wrote:
> 
> LGTM
> Reviewed-by: DJ Delorie <dj@redhat.com>
> 
> Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
>> diff --git a/benchtests/Makefile b/benchtests/Makefile
>>    exp2m1f \
>>    expf \
>>    expm1 \
>> +  expm1f \
>>    floor \
>>    floorf \
>>    fmax \
> 
> Ok.
> 
>> diff --git a/benchtests/expm1f-inputs b/benchtests/expm1f-inputs
>> +## args: float
>> +## ret: float
>> +## includes: math.h
>> +## name: workload-random
>> +# Random inputs in [a=-14.495465,b=88.722832]
>> +# where a is the smallest number such that expm1f does not round to -1
>> +# and b is the smallest number such that expm1 rounds to +Inf (to nearest)
> 
> Ok.  I don't see why round-to--1 is excluded but round-to-Inf isn't, but
> that doesn't diminish the value of the benchtest.

In fact it should 'does *not*' rounds to +Inf, since the whole idea of
benchtests is to check for expected usage case.  I will fix.

> 
>> +0x1.3810cp+6
>> . . .
>> +0x1.a299a8p+3
> 
> Ok.
> 


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 06/17] benchtests: Add log2p1f benchmark
  2024-10-29 18:57   ` DJ Delorie
@ 2024-10-31 12:42     ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 53+ messages in thread
From: Adhemerval Zanella Netto @ 2024-10-31 12:42 UTC (permalink / raw)
  To: DJ Delorie; +Cc: libc-alpha, Paul.Zimmermann, sibid



On 29/10/24 15:57, DJ Delorie wrote:
> 
> LGTM
> Reviewed-by: DJ Delorie <dj@redhat.com>
> 
> Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
>> diff --git a/benchtests/Makefile b/benchtests/Makefile
>>    log1p \
>>    log2 \
>>    log2f \
>> +  log2p1f \
>>    logb \
>>    logbf \
>>    logf \
> 
> Ok.
> 
>> diff --git a/benchtests/log2p1f-inputs b/benchtests/log2p1f-inputs
>> +## args: float
>> +## ret: float
>> +## includes: math.h
>> +## name: workload-spec2017.wrf
>> +0x1.fe4c3p-1
>> . . .
>> +0x1p+0
> 
> I noticed that 0x1p+0 is included MANY times in this list.  The original
> list did too.  I wonder if that's warranted, but I assume (hope) it was
> discussed back then.

Good question, I haven't double checked with a speccpu2017 trace but
I take that this was added in consideration for the original log2f
optimization work from Szabolcs.

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 09/17] math: Use exp10m1f from CORE-MATH
  2024-10-29 21:09   ` DJ Delorie
@ 2024-10-31 13:20     ` Adhemerval Zanella Netto
  2024-11-04 10:37       ` Paul Zimmermann
  0 siblings, 1 reply; 53+ messages in thread
From: Adhemerval Zanella Netto @ 2024-10-31 13:20 UTC (permalink / raw)
  To: DJ Delorie; +Cc: libc-alpha, Paul.Zimmermann, sibid



On 29/10/24 18:09, DJ Delorie wrote:
> 
> A few questions but I suspect they're easily answered.  LGTM with
> reasonable answers.  I'll elide the same questions in the other patches
> in this series with the assumption that the same answers apply ;-)
> 
> Reviewed-by: DJ Delorie <dj@redhat.com>
> 
> Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
>> diff --git a/SHARED-FILES b/SHARED-FILES
>> +sysdeps/ieee754/flt-32/s_exp10m1f.c
>> +  (file src/binary32/exp10m1/exp10m1f.c in CORE_MATH)
> 
> I notice this file references the CORE MATH project (is it CORE_MATH or
> CORE-MATH?  The file is inconsistent) but doesn't provide an URL to the
> project; such a link would be appreciated in a future patch :-)

It is CORE-MATH, I will fix it.  And I will send patch to add a proper
link to the project.

> 
>> diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
>> index 8c333fcd29..00832393f6 100644
>> --- a/sysdeps/aarch64/libm-test-ulps
>> +++ b/sysdeps/aarch64/libm-test-ulps
>> @@ -1083,22 +1083,18 @@ ldouble: 3
>>  
>>  Function: "exp10m1":
>>  double: 4
>> -float: 2
>>  ldouble: 3
> 
> Does this mean "we're not testing it any more" or "we expect zero ULPs
> and verify that" ?  I don't see any ": 0" in any of the ulps files so I
> assume the latter.

The former, we are expecting a correctly rounded implementation for the
inputs we test.

> 
>>  Function: "exp10m1_downward":
>>  double: 3
>> -float: 3
>>  ldouble: 6
>>  
>>  Function: "exp10m1_towardzero":
>>  double: 2
>> -float: 3
>>  ldouble: 6
>>  
>>  Function: "exp10m1_upward":
>>  double: 5
>> -float: 3
>>  ldouble: 6
>>  
>>  Function: "exp2":
>> diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps
>> index d1665b9b72..ad4ae4c632 100644
>> --- a/sysdeps/arc/fpu/libm-test-ulps
>> +++ b/sysdeps/arc/fpu/libm-test-ulps
>> @@ -789,7 +789,6 @@ float: 1
>>  
>>  Function: "exp10m1":
>>  double: 4
>> -float: 2
>>  
>>  Function: "exp10m1_downward":
>>  double: 3
> 
> The other roundings still have ULPs?

I should, since arc uses the generic implementation.  I missed these entries,
thank for spotting it.

> 
>> diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
>> index e768024eb5..4cecea6919 100644
>> --- a/sysdeps/arc/nofpu/libm-test-ulps
>> +++ b/sysdeps/arc/nofpu/libm-test-ulps
>> @@ -194,7 +194,6 @@ float: 1
>>  
>>  Function: "exp10m1":
>>  double: 3
>> -float: 2
>>  
>>  Function: "exp2":
>>  double: 1
> 
> Likewise here.

This is different because usually for soft-fp and for some hard-fp as well, 
only one rounding mode is support.  For such cases, there is no symbol_rounding
entries.

> 
>> diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
>> diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
>> diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
>> diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
> 
> Ok.
> 
>> diff --git a/sysdeps/ieee754/flt-32/s_exp10m1f.c b/sysdeps/ieee754/flt-32/s_exp10m1f.c
>> new file mode 100644
>> index 0000000000..610f269b01
>> --- /dev/null
>> +++ b/sysdeps/ieee754/flt-32/s_exp10m1f.c
>> @@ -0,0 +1,225 @@
>> +/* Implementation of the exp10m1 function for binary32.
>> +
>> +Copyright (c) 2022-2024 Alexei Sibidanov. Paul Zimmermann.
>> +
>> +The original version of this file was copied from the CORE-MATH
>> +project (file src/binary32/exp10m1/exp10m1f.c, revision d680516).
>> +
>> +Permission is hereby granted, free of charge, to any person obtaining a copy
>> +of this software and associated documentation files (the "Software"), to deal
>> +in the Software without restriction, including without limitation the rights
>> +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
>> +copies of the Software, and to permit persons to whom the Software is
>> +furnished to do so, subject to the following conditions:
>> +
>> +The above copyright notice and this permission notice shall be included in all
>> +copies or substantial portions of the Software.
>> +
>> +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
>> +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>> +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
>> +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
>> +SOFTWARE.
>> + */
>> +
>> +#include <math.h>
>> +#include "math_config.h"
>> +#include <libm-alias-float.h>
> 
> Ok.
> 
>> +float
>> +__exp10m1f (float x)
>> +{
>> +  const double iln10h = 0x1.a934f09p+1 * 16;
>> +  const double iln10l = 0x1.e68dc57f2496p-29 * 16;
>> +  double z = x;
>> +  uint32_t ux = asuint (x);
>> +  uint32_t ax = ux & (~0u >> 1);
>> +  if (__glibc_unlikely (ux > 0xc0f0d2f1u))
>> +    { /* x < -7.52575 */
>> +      if (ax > (0xffu << 23))
>> +	return x + x; /* nan */
>> +      return (ux == 0xff800000) ? -0x1p+0 : -0x1p+0 + 0x1p-26f;
>> +    }
> 
> Ok.
> 
>> +  else if (__glibc_unlikely (ax > 0x421a209au))
>> +    { /* x > 38.5318 */
>> +      if (ax >= asuint (INFINITY))
>> +	return x + x; /* +Inf or NaN */
>> +      return __math_oflowf (0);
>> +    }
> 
> Ok.
> 
>> +  else if (__glibc_unlikely (ax < 0x3d89c604u))
>> +    { /* |x| < 0.1549/log(10) */
>> +      double z2 = z * z, r;
>> +      if (__glibc_unlikely (ax < 0x3d1622fbu))
>> +	{ /* |x| < 8.44e-2/log(10)  */
>> +	  if (__glibc_unlikely (ax < 0x3c8b76a3u))
>> +	    { /* |x| < 3.92e-2/log(10)  */
>> +	      if (__glibc_unlikely (ax < 0x3bcced04u))
>> +		{ /* |x| < 1.44e-2/log(10) */
>> +		  if (__glibc_unlikely (ax < 0x3acf33ebu))
>> +		    { /* |x| < 3.64e-3/log(10 */
>> +		      if (__glibc_unlikely (ax < 0x395a966bu))
>> +			{ /* |x| < 4.8e-4/log(10 */
>> +			  if (__glibc_unlikely (ax < 0x36fe4a4bu))
>> +			    { /* |x| < 1.745e-5/log(10) */
>> +			      if (__glibc_unlikely (ax < 0x32407f39u))
>> +				{ /* |x| < 2.58e-8/log(10) */
>> +				  if (__glibc_unlikely (ax < 0x245e5bd9u))
>> +				    { /* |x| < 4.82164e-17 */
>> +				      r = 0x1.26bb1bbb55516p+1;
>> +				    }
>> +				  else
>> +				    {
>> +				      if (__glibc_unlikely (ux == 0x2c994b7bu))
>> +					return 0x1.60f974p-37f - 0x1p-90f;
>> +				      r = 0x1.26bb1bbb55516p+1
>> +					  + z * 0x1.53524c73cea69p+1;
>> +				    }
>> +				}
>> +			      else
>> +				{
>> +				  if (__glibc_unlikely (ux == 0xb6fa215bu))
>> +				    return -0x1.1ff87ep-16 + 0x1p-68;
>> +				  r = 0x1.26bb1bbb55516p+1
>> +				      + z * (0x1.53524c73ea62fp+1
>> +					     + z * 0x1.0470591de2c75p+1);
>> +				}
>> +			    }
>> +			  else
>> +			    {
>> +			      static const double cp[] =
>> +				{
>> +				  0x1.26bb1bbb55515p+1, 0x1.53524c73cea69p+1,
>> +				  0x1.0470595038cc2p+1, 0x1.2bd7609fe1561p+0
>> +			        };
>> +			      r = (cp[0] + z * cp[1])
>> +				  + z2 * (cp[2] + z * cp[3]);
>> +			    }
>> +			}
>> +		      else
>> +			{
>> +			  static const double cp[] =
>> +			    {
>> +			      0x1.26bb1bbb55516p+1, 0x1.53524c73ce6dbp+1,
>> +			      0x1.0470591de3024p+1, 0x1.2bd76b79060e6p+0,
>> +			      0x1.1429ffd3a963dp-1
>> +			    };
>> +			  r = (cp[0] + z * cp[1])
>> +			      + z2 * (cp[2] + z * (cp[3] + z * cp[4]));
>> +			}
>> +		    }
>> +		  else
>> +		    {
>> +		      static const double cp[] =
>> +			{
>> +			  0x1.26bb1bbb55516p+1, 0x1.53524c73cea67p+1,
>> +			  0x1.0470591dc2953p+1, 0x1.2bd760a004d64p+0,
>> +			  0x1.142a85da6f072p-1, 0x1.a7ed70725b00ep-3
>> +			};
>> +		      r = (cp[0] + z * cp[1]) + z2
>> +			    * ((cp[2] + z * cp[3])
>> +			       + z2 * (cp[4] + z * cp[5]));
>> +		    }
>> +		}
>> +	      else
>> +		{
>> +		  static const double cp[] =
>> +		    {
>> +		      0x1.26bb1bbb55516p+1, 0x1.53524c73ceadep+1,
>> +		      0x1.0470591de2bb4p+1, 0x1.2bd76099a9d33p+0,
>> +		      0x1.1429ffd829b0bp-1, 0x1.a7f2a6a0f7dc8p-3,
>> +		      0x1.16e4dfbce0f56p-4
>> +		    };
>> +		  r = (cp[0] + z * cp[1])
>> +		      + z2 * ((cp[2] + z * cp[3])
>> +			      + z2 * (cp[4] + z * (cp[5] + z * cp[6])));
>> +		}
>> +	    }
>> +	  else
>> +	    {
>> +	      static const double cp[] =
>> +		{
>> +		  0x1.26bb1bbb55515p+1, 0x1.53524c73cea6ap+1,
>> +		  0x1.0470591de476p+1,  0x1.2bd7609fd4ee2p+0,
>> +		  0x1.1429ff70a9b48p-1, 0x1.a7ed71259ba5bp-3,
>> +		  0x1.16f3004fb3ac1p-4, 0x1.4116b0388aa9fp-6
>> +		};
>> +	      r = ((cp[0] + z * cp[1]) + z2 * (cp[2] + z * cp[3]))
>> +		  + (z2 * z2) * ((cp[4] + z * cp[5]) + z2 * (cp[6]
>> +							     + z * cp[7]));
>> +	    }
>> +	}
>> +      else
>> +	{
>> +	  static const double cp[] =
>> +	    {
>> +	      0x1.26bb1bbb55515p+1, 0x1.53524c73cea42p+1, 0x1.0470591de2d1dp+1,
>> +	      0x1.2bd760a010a53p+0, 0x1.1429ffd16170cp-1, 0x1.a7ed6b2a0d97fp-3,
>> +	      0x1.16e4e37fa51e4p-4, 0x1.4147fe4c1676fp-6, 0x1.4897c4b3e329ap-8
>> +	    };
>> +	  r = ((cp[0] + z * cp[1]) + z2 * (cp[2] + z * cp[3]))
>> +	      + (z2 * z2) * ((cp[4] + z * cp[5])
>> +			     + z2 * (cp[6] + z * (cp[7] + z * cp[8])));
>> +	}
>> +      r *= z;
>> +      return r;
>> +    }
> 
> I'm not a fan of having 99% of the code be in a hugely nested "else"
> clause, but I assume the upstream code is the same way.  Better would be
> to keep each block of code near its conditional by inverting the
> conditionals, assuming performance isn't affected by it.
> 
> Not a blocker though, just hard to understand.

Me neither, but in this case I did not change the original code (just
use glibc code style).  I will check with Paul if a code restructuring
would be worth. 

> 
>> +  else
>> +    {
>> +      /* -7.52575 < x < -0.1549/log(10) or 0.1549/log(10) < x < 38.5318  */
>> +      static const double tb[] =
>> +	{
>> +	  0x1p+0, 0x1.0b5586cf9890fp+0, 0x1.172b83c7d517bp+0,
>> +	  0x1.2387a6e756238p+0, 0x1.306fe0a31b715p+0, 0x1.3dea64c123422p+0,
>> +	  0x1.4bfdad5362a27p+0, 0x1.5ab07dd485429p+0, 0x1.6a09e667f3bcdp+0,
>> +	  0x1.7a11473eb0187p+0, 0x1.8ace5422aa0dap+0, 0x1.9c49182a3f09p+0,
>> +	  0x1.ae89f995ad3adp+0, 0x1.c199bdd85529cp+0, 0x1.d5818dcfba487p+0,
>> +	  0x1.ea4afa2a490dap+0
>> +	};
>> +      static const double c[] =
>> +	{
>> +	  0x1.62e42fefa398bp-5,  0x1.ebfbdff84555ap-11, 0x1.c6b08d4ad86d3p-17,
>> +	  0x1.3b2ad1b1716a2p-23, 0x1.5d7472718ce9dp-30, 0x1.4a1d7f457ac56p-37
>> +	};
>> +
>> +      if (__glibc_unlikely ((ux << 11) == 0))
>> +	{
>> +	  uint32_t k = (ux >> 21) - 0x1fc;
>> +	  if (k <= 0xb)
>> +	    {
>> +	      if (k == 0)
>> +		return 10.0f - 1.0f;
>> +	      if (k == 4)
>> +		return 100.0f - 1.0f;
>> +	      if (k == 6)
>> +		return 1000.0f - 1.0f;
>> +	      if (k == 8)
>> +		return 10000.0f - 1.0f;
>> +	      if (k == 9)
>> +		return 100000.0f - 1.0f;
>> +	      if (k == 10)
>> +		return 1000000.0f - 1.0f;
>> +	      if (k == 11)
>> +		return 10000000.0f - 1.0f;
>> +	    }
>> +	}
> 
> Ok.
> 
>> +      double a = iln10h * z;
>> +      double ia = floor (a);
>> +      double h = (a - ia) + iln10l * z;
>> +      int64_t i = ia;
>> +      int64_t j = i & 0xf;
>> +      int64_t e = i - j;
>> +      e >>= 4;
>> +      double s = tb[j];
>> +      s *= asdouble ((e + 0x3ffull) << 52);
>> +      double h2 = h * h;
>> +      double c0 = c[0] + h * c[1];
>> +      double c2 = c[2] + h * c[3];
>> +      double c4 = c[4] + h * c[5];
>> +      c0 += h2 * (c2 + h2 * c4);
>> +      double w = s * h;
>> +      return (s - 1.0) + w * c0;
>> +    }
>> +}
>> +libm_alias_float (__exp10m1, exp10m1)
> 
> Ok.
> 
>> diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
>> diff --git a/sysdeps/m68k/m680x0/fpu/libm-test-ulps b/sysdeps/m68k/m680x0/fpu/libm-test-ulps
>> diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
>> diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
>> diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
>> diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
>> diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
> 
> Ok.
> 
>> index 4adad138b0..2271e1ee6c 100644
>> --- a/sysdeps/riscv/nofpu/libm-test-ulps
>> +++ b/sysdeps/riscv/nofpu/libm-test-ulps
>> @@ -974,7 +974,6 @@ ldouble: 3
>>  
>>  Function: "exp10m1":
>>  double: 2
>> -float: 1
>>  ldouble: 1
>>  
>>  Function: "exp2":
> 
> The others are missing?

Same case for arc-nofpu, riscv softfp only has support for one rounding.

> 
>> diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
>> diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
>> diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
>> diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
> 
> Ok.
> 


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 11/17] math: Use expm1f from CORE-MATH
  2024-10-30 19:27   ` DJ Delorie
@ 2024-10-31 14:35     ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 53+ messages in thread
From: Adhemerval Zanella Netto @ 2024-10-31 14:35 UTC (permalink / raw)
  To: DJ Delorie; +Cc: libc-alpha, Paul.Zimmermann, sibid



On 30/10/24 16:27, DJ Delorie wrote:
> 
> LGTM
> Reviewed-by: DJ Delorie <dj@redhat.com>
> 
> Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
>> diff --git a/SHARED-FILES b/SHARED-FILES
>> +sysdeps/ieee754/flt-32/s_expm1f.c
>> +  (file src/binary32/expm1/expm1f.c in CORE_MATH)
>> +  - The code was adapted to use glibc code style and internal
>> +    functions to handle errno, overflow, and underflow.
> 
> Ok.
> 
>> diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
>>  Function: Imaginary part of "csin":
>> +float: 1
>>  ldouble: 1
> 
> I assume this is because csin uses expm1 internally.

Yes, math/s_csin_template.c calls __ieee754_sinhf which in turn __expm1.  For
'0xcp-4 + 0x1.4p+0 * I' input, __expm1 is called with input of '0x1.4p+0'.

The correctly rounded value, which CORE-MATH returns, is 0x1.3ec38ep+1 while
current glibc one returns 0x1.3ec39p+1.

> 
>>  Function: Real part of "csin_downward":
>> @@ -1163,7 +1164,6 @@ float: 1
>>  
>>  Function: "expm1":
>>  double: 1
>> -float: 1
>>  ldouble: 2
> 
> Ok.
> 
>> diff --git a/sysdeps/alpha/fpu/libm-test-ulps b/sysdeps/alpha/fpu/libm-test-ulps
>> diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps
> 
> Ok.
> 
>> diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
>>  
>>  Function: "expm1":
>>  double: 1
>> -float: 1
>>  
> 
> I assume the rest were :0 anyway... ok.
> 
>> diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
> 
> Ok.
> 
>> diff --git a/sysdeps/csky/fpu/libm-test-ulps b/sysdeps/csky/fpu/libm-test-ulps
>> diff --git a/sysdeps/csky/nofpu/libm-test-ulps b/sysdeps/csky/nofpu/libm-test-ulps
>> diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
>> diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
> 
> Ok.
> 
>> diff --git a/sysdeps/i386/fpu/s_expm1f.S b/sysdeps/i386/fpu/s_expm1f.S
>> deleted file mode 100644
> 
> Ok.
> 
>> diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
>> index 9afb63bc0f..6d9d49d153 100644
>> --- a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
>> +++ b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
>> @@ -1237,19 +1237,16 @@ ldouble: 3
>>  
>>  Function: "expm1_downward":
>>  double: 1
>> -float: 1
>>  float128: 2
>>  ldouble: 4
>>  
>>  Function: "expm1_towardzero":
>>  double: 1
>> -float: 1
>>  float128: 4
>>  ldouble: 4
>>  
>>  Function: "expm1_upward":
>>  double: 1
>> -float: 1
>>  float128: 3
>>  ldouble: 4
> 
> Ok.
> 
>> diff --git a/sysdeps/ieee754/flt-32/s_expm1f.c b/sysdeps/ieee754/flt-32/s_expm1f.c
>> index 35f7b5214a..edd7c9acf8 100644
>> --- a/sysdeps/ieee754/flt-32/s_expm1f.c
>> +++ b/sysdeps/ieee754/flt-32/s_expm1f.c
>> @@ -1,132 +1,124 @@
>> -/* s_expm1f.c -- float version of s_expm1.c.
>> - */
>> +/* Correctly-rounded natural exponent function biased by 1 for binary32 value.
>>  
>> -/*
>> - * ====================================================
>> - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
>> - *
>> - * Developed at SunPro, a Sun Microsystems, Inc. business.
>> - * Permission to use, copy, modify, and distribute this
>> - * software is freely granted, provided that this notice
>> - * is preserved.
>> - * ====================================================
>> - */
>> +Copyright (c) 2022-2024 Alexei Sibidanov.
>> +
>> +This file is part of the CORE-MATH project
>> +project (file src/binary32/expm1/expm1f.c, revision bc385c2).
>> +
>> +Permission is hereby granted, free of charge, to any person obtaining a copy
>> +of this software and associated documentation files (the "Software"), to deal
>> +in the Software without restriction, including without limitation the rights
>> +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
>> +copies of the Software, and to permit persons to whom the Software is
>> +furnished to do so, subject to the following conditions:
>> +
>> +The above copyright notice and this permission notice shall be included in all
>> +copies or substantial portions of the Software.
>> +
>> +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
>> +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>> +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
>> +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
>> +SOFTWARE.
>> +*/
>>  
>> -#include <errno.h>
>> -#include <float.h>
>>  #include <math.h>
>> -#include <math-barriers.h>
>> -#include <math_private.h>
>>  #include <math-underflow.h>
>>  #include <libm-alias-float.h>
>> -
>> -static const float huge = 1.0e+30;
>> -static const float tiny = 1.0e-30;
> 
> Ok.
> 
>> -static const float
>> -one		= 1.0,
>> -o_threshold	= 8.8721679688e+01,/* 0x42b17180 */
>> -ln2_hi		= 6.9313812256e-01,/* 0x3f317180 */
>> -ln2_lo		= 9.0580006145e-06,/* 0x3717f7d1 */
>> -invln2		= 1.4426950216e+00,/* 0x3fb8aa3b */
>> -	/* scaled coefficients related to expm1 */
>> -Q1  =  -3.3333335072e-02, /* 0xbd088889 */
>> -Q2  =   1.5873016091e-03, /* 0x3ad00d01 */
>> -Q3  =  -7.9365076090e-05, /* 0xb8a670cd */
>> -Q4  =   4.0082177293e-06, /* 0x36867e54 */
>> -Q5  =  -2.0109921195e-07; /* 0xb457edbb */
>> +#include "math_config.h"
> 
> Ok.
> 
>>  float
>> -__expm1f(float x)
>> +__expm1f (float x)
>>  {
> 
> Ok.
> 
>> -	float y,hi,lo,c,t,e,hxs,hfx,r1;
>> -	int32_t k,xsb;
>> -	uint32_t hx;
>> -
>> -	GET_FLOAT_WORD(hx,x);
>> -	xsb = hx&0x80000000;		/* sign bit of x */
>> -	if(xsb==0) y=x; else y= -x;	/* y = |x| */
>> -	hx &= 0x7fffffff;		/* high word of |x| */
>> -
>> -    /* filter out huge and non-finite argument */
>> -	if(hx >= 0x4195b844) {			/* if |x|>=27*ln2 */
>> -	    if(hx >= 0x42b17218) {		/* if |x|>=88.721... */
>> -		if(hx>0x7f800000)
>> -		    return x+x;		 /* NaN */
>> -		if(hx==0x7f800000)
>> -		    return (xsb==0)? x:-1.0;/* exp(+-inf)={inf,-1} */
>> -		if(x > o_threshold) {
>> -		  __set_errno (ERANGE);
>> -		  return huge*huge; /* overflow */
>> -		}
>> -	    }
>> -	    if(xsb!=0) { /* x < -27*ln2, return -1.0 with inexact */
>> -		math_force_eval(x+tiny);/* raise inexact */
>> -		return tiny-one;	/* return -1 */
>> -	    }
>> -	}
>> -
>> -    /* argument reduction */
>> -	if(hx > 0x3eb17218) {		/* if  |x| > 0.5 ln2 */
>> -	    if(hx < 0x3F851592) {	/* and |x| < 1.5 ln2 */
>> -		if(xsb==0)
>> -		    {hi = x - ln2_hi; lo =  ln2_lo;  k =  1;}
>> -		else
>> -		    {hi = x + ln2_hi; lo = -ln2_lo;  k = -1;}
>> -	    } else {
>> -		k  = invln2*x+((xsb==0)?(float)0.5:(float)-0.5);
>> -		t  = k;
>> -		hi = x - t*ln2_hi;	/* t*ln2_hi is exact here */
>> -		lo = t*ln2_lo;
>> -	    }
>> -	    x  = hi - lo;
>> -	    c  = (hi-x)-lo;
>> -	}
>> -	else if(hx < 0x33000000) {	/* when |x|<2**-25, return x */
>> -	    math_check_force_underflow (x);
>> -	    t = huge+x;	/* return x with inexact flags when x!=0 */
>> -	    return x - (t-(huge+x));
> 
> Ok.
> 
>> +  static const double c[] =
>> +    {
>> +      1, 0x1.62e42fef4c4e7p-6, 0x1.ebfd1b232f475p-13, 0x1.c6b19384ecd93p-20
>> +    };
>> +  static const double ch[] =
>> +    {
>> +      0x1.62e42fefa39efp-6,  0x1.ebfbdff82c58fp-13, 0x1.c6b08d702e0edp-20,
>> +      0x1.3b2ab6fb92e5ep-27, 0x1.5d886e6d54203p-35, 0x1.430976b8ce6efp-43
>> +    };
>> +  static const double td[] =
>> +    {
>> +      0x1p+0,               0x1.059b0d3158574p+0, 0x1.0b5586cf9890fp+0,
>> +      0x1.11301d0125b51p+0, 0x1.172b83c7d517bp+0, 0x1.1d4873168b9aap+0,
>> +      0x1.2387a6e756238p+0, 0x1.29e9df51fdee1p+0, 0x1.306fe0a31b715p+0,
>> +      0x1.371a7373aa9cbp+0, 0x1.3dea64c123422p+0, 0x1.44e086061892dp+0,
>> +      0x1.4bfdad5362a27p+0, 0x1.5342b569d4f82p+0, 0x1.5ab07dd485429p+0,
>> +      0x1.6247eb03a5585p+0, 0x1.6a09e667f3bcdp+0, 0x1.71f75e8ec5f74p+0,
>> +      0x1.7a11473eb0187p+0, 0x1.82589994cce13p+0, 0x1.8ace5422aa0dbp+0,
>> +      0x1.93737b0cdc5e5p+0, 0x1.9c49182a3f09p+0,  0x1.a5503b23e255dp+0,
>> +      0x1.ae89f995ad3adp+0, 0x1.b7f76f2fb5e47p+0, 0x1.c199bdd85529cp+0,
>> +      0x1.cb720dcef9069p+0, 0x1.d5818dcfba487p+0, 0x1.dfc97337b9b5fp+0,
>> +      0x1.ea4afa2a490dap+0, 0x1.f50765b6e454p+0
>> +    };
>> +  const double iln2 = 0x1.71547652b82fep+5;
>> +  const double big = 0x1.8p52;
>> +  double z = x;
>> +  uint32_t ux = asuint (x);
>> +  uint32_t ax = ux << 1;
>> +  if (__glibc_likely (ax < 0x7c400000u))
>> +    { /* |x| < 0.15625  */
>> +      if (__glibc_unlikely (ax < 0x676a09e8u))
>> +	{ /* |x| < 0x1.6a09e8p-24 */
>> +	  if (__glibc_unlikely (ax == 0x0u))
>> +	    return x; /* x = +-0 */
>> +	  return fmaf (fabsf (x), 0x1p-25f, x);
>>  	}
> 
> Ok.
> 
>> -	else k = 0;
>> -
>> -    /* x is now in primary range */
>> -	hfx = (float)0.5*x;
>> -	hxs = x*hfx;
>> -	r1 = one+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5))));
>> -	t  = (float)3.0-r1*hfx;
>> -	e  = hxs*((r1-t)/((float)6.0 - x*t));
>> -	if(k==0) return x - (x*e-hxs);		/* c is 0 */
>> -	else {
>> -	    e  = (x*(e-c)-c);
>> -	    e -= hxs;
>> -	    if(k== -1) return (float)0.5*(x-e)-(float)0.5;
>> -	    if(k==1) {
>> -		if(x < (float)-0.25) return -(float)2.0*(e-(x+(float)0.5));
>> -		else	      return  one+(float)2.0*(x-e);
>> -	    }
>> -	    if (k <= -2 || k>56) {   /* suffice to return exp(x)-1 */
>> -		int32_t i;
>> -		y = one-(e-x);
>> -		GET_FLOAT_WORD(i,y);
>> -		SET_FLOAT_WORD(y,i+(k<<23));	/* add k to y's exponent */
>> -		return y-one;
>> -	    }
>> -	    t = one;
>> -	    if(k<23) {
>> -		int32_t i;
>> -		SET_FLOAT_WORD(t,0x3f800000 - (0x1000000>>k)); /* t=1-2^-k */
>> -		y = t-(e-x);
>> -		GET_FLOAT_WORD(i,y);
>> -		SET_FLOAT_WORD(y,i+(k<<23));	/* add k to y's exponent */
>> -	   } else {
>> -		int32_t i;
>> -		SET_FLOAT_WORD(t,((0x7f-k)<<23));	/* 2^-k */
>> -		y = x-(e+t);
>> -		y += one;
>> -		GET_FLOAT_WORD(i,y);
>> -		SET_FLOAT_WORD(y,i+(k<<23));	/* add k to y's exponent */
>> -	    }
> 
> Ok.
> 
>> +      static const double b[] =
>> +	{
>> +	  0x1.fffffffffffc2p-2,  0x1.55555555555fep-3,  0x1.555555559767fp-5,
>> +	  0x1.1111111098dc1p-7,  0x1.6c16bca988aa9p-10, 0x1.a01a07658483fp-13,
>> +	  0x1.a05b04d2c3503p-16, 0x1.71de3a960b5e3p-19
>> +	};
>> +      double z2 = z * z, z4 = z2 * z2;
>> +      double r = z + z2
>> +	* ((b[0] + z * b[1]) + z2 * (b[2] + z * b[3])
>> +	   + z4 * ((b[4] + z * b[5]) + z2 * (b[6] + z * b[7])));
>> +      return r;
>> +    }
>> +  if (__glibc_unlikely (ax >= 0x8562e430u))
>> +    { /* |x| > 88.72 */
>> +      if (ax > (0xffu << 24))
>> +	return x + x; /* nan */
>> +      if (__glibc_unlikely (ux >> 31))
>> +	{ /* x < 0 */
>> +	  if (ax == (0xffu << 24))
>> +	    return -1.0f;
>> +	  return -1.0f + 0x1p-26f;
>>  	}
>> -	return y;
>> +      if (ax == (0xffu << 24))
>> +	return INFINITY;
>> +      return __math_oflowf (0);
>> +    }
> 
> Ok.
> 
>> +  double a = iln2 * z;
>> +  double ia = roundeven (a);
>> +  double h = a - ia;
>> +  double h2 = h * h;
>> +  uint64_t u = asuint64 (ia + big);
>> +  double c2 = c[2] + h * c[3], c0 = c[0] + h * c[1];
>> +  const uint64_t *tdl = (uint64_t *) ((void *) td);
>> +  double sv = asdouble (tdl[u & 0x1f] + ((u >> 5) << 52));
>> +  double r = (c0 + h2 * c2) * sv - 1.0;
>> +  float ub = r, lb = r - sv * 0x1.3b3p-33;
>> +  if (__glibc_unlikely (ub != lb))
>> +    {
>> +      if (__glibc_unlikely (ux > 0xc18aa123u)) /* x < -17.32 */
>> +	return -1.0f + 0x1p-26f;
>> +      const double iln2h = 0x1.7154765p+5;
>> +      const double iln2l = 0x1.5c17f0bbbe88p-26;
>> +      double s = sv;
>> +      h = (iln2h * z - ia) + iln2l * z;
>> +      h2 = h * h;
>> +      double w = s * h;
>> +      r = (s - 1) + w
>> +	* ((ch[0] + h * ch[1])
>> +	   + h2 * ((ch[2] + h * ch[3]) + h2 * (ch[4] + h * ch[5])));
>> +      ub = r;
>> +    }
>> +  return ub;
>>  }
>>  libm_alias_float (__expm1, expm1)
> 
> Ok.
> 
>> diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
>> diff --git a/sysdeps/microblaze/libm-test-ulps b/sysdeps/microblaze/libm-test-ulps
>> diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
>> diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
>> diff --git a/sysdeps/nios2/libm-test-ulps b/sysdeps/nios2/libm-test-ulps
>> diff --git a/sysdeps/or1k/fpu/libm-test-ulps b/sysdeps/or1k/fpu/libm-test-ulps
>> diff --git a/sysdeps/or1k/nofpu/libm-test-ulps b/sysdeps/or1k/nofpu/libm-test-ulps
>> diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
>> diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
>> diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
>> diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
>> diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
>> diff --git a/sysdeps/sh/libm-test-ulps b/sysdeps/sh/libm-test-ulps
>> diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
>> diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
> 
> Ok.
> 


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 13/17] math: Use log2p1f from CORE-MATH
  2024-10-30 19:36   ` DJ Delorie
@ 2024-10-31 14:37     ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 53+ messages in thread
From: Adhemerval Zanella Netto @ 2024-10-31 14:37 UTC (permalink / raw)
  To: DJ Delorie; +Cc: libc-alpha, Paul.Zimmermann, sibid



On 30/10/24 16:36, DJ Delorie wrote:
> 
> One space error nees correcting.
> 
> LGTM with that correction.
> Reviewed-by: DJ Delorie <dj@redhat.com>
> 
> Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
>> diff --git a/SHARED-FILES b/SHARED-FILES
>> +sysdeps/ieee754/flt-32/s_log2p1f.c
>> +  (file src/binary32/log2p1/log2p1f.c in CORE_MATH)
>> +  - The code was adapted to use glibc code style and internal
>> +    functions to handle errno, overflow, and underflow.
> 
> Ok.
> 
>> diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
>> diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps
>> diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
>> diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
>> diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
>> diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps
>> diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps
> 
> Ok.
> 
>> diff --git a/sysdeps/ieee754/flt-32/s_log2p1f.c b/sysdeps/ieee754/flt-32/s_log2p1f.c
> 
>> +/* Correctly-rounded biased argument natural logarithm function for binary32
>> +   value.
>> +
>> +Copyright (c) 2022-2024 Alexei Sibidanov.
> 
> The summary should be limited to one line, with the copyright on the
> second.  However, as these are imported files, I think this is OK.
> 
>> +This file is part of the CORE-MATH project
>> +project (file src/binary32/log2p1/log2p1f.c revision bc385c2).
>> +
>> +Permission is hereby granted, free of charge, to any person obtaining a copy
>> +of this software and associated documentation files (the "Software"), to deal
>> +in the Software without restriction, including without limitation the rights
>> +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
>> +copies of the Software, and to permit persons to whom the Software is
>> +furnished to do so, subject to the following conditions:
>> +
>> +The above copyright notice and this permission notice shall be included in all
>> +copies or substantial portions of the Software.
>> +
>> +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
>> +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>> +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
>> +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
>> +SOFTWARE.
>> +*/
>> +
>> +#include <errno.h>
>> +#include <math.h>
>> +#include <math-underflow.h>
>> +#include <libm-alias-float.h>
>> +#include "math_config.h"
> 
> Ok.
> 
>> +float
>> +__log2p1f (float x)
>> +{
>> +  static const double ix[] =
>> +    {
>> +      0x1p+0,           0x1.fc07f01fcp-1, 0x1.f81f81f82p-1,
>> +      0x1.f44659e4ap-1, 0x1.f07c1f07cp-1, 0x1.ecc07b302p-1,
>> +      0x1.e9131abfp-1,  0x1.e573ac902p-1, 0x1.e1e1e1e1ep-1,
>> +      0x1.de5d6e3f8p-1, 0x1.dae6076bap-1, 0x1.d77b654b8p-1,
>> +      0x1.d41d41d42p-1, 0x1.d0cb58f6ep-1, 0x1.cd8568904p-1,
>> +      0x1.ca4b3055ep-1, 0x1.c71c71c72p-1, 0x1.c3f8f01c4p-1,
>> +      0x1.c0e070382p-1, 0x1.bdd2b8994p-1, 0x1.bacf914c2p-1,
>> +      0x1.b7d6c3ddap-1, 0x1.b4e81b4e8p-1, 0x1.b2036406cp-1,
>> +      0x1.af286bca2p-1, 0x1.ac5701ac6p-1, 0x1.a98ef606ap-1,
>> +      0x1.a6d01a6dp-1,  0x1.a41a41a42p-1, 0x1.a16d3f97ap-1,
>> +      0x1.9ec8e951p-1,  0x1.9c2d14ee4p-1, 0x1.99999999ap-1,
>> +      0x1.970e4f80cp-1, 0x1.948b0fcd6p-1, 0x1.920fb49dp-1,
>> +      0x1.8f9c18f9cp-1, 0x1.8d3018d3p-1,  0x1.8acb90f6cp-1,
>> +      0x1.886e5f0acp-1, 0x1.861861862p-1, 0x1.83c977ab2p-1,
>> +      0x1.818181818p-1, 0x1.7f405fd02p-1, 0x1.7d05f417ep-1,
>> +      0x1.7ad2208ep-1,  0x1.78a4c8178p-1, 0x1.767dce434p-1,
>> +      0x1.745d1745ep-1, 0x1.724287f46p-1, 0x1.702e05c0cp-1,
>> +      0x1.6e1f76b44p-1, 0x1.6c16c16c2p-1, 0x1.6a13cd154p-1,
>> +      0x1.681681682p-1, 0x1.661ec6a52p-1, 0x1.642c8590cp-1,
>> +      0x1.623fa7702p-1, 0x1.605816058p-1, 0x1.5e75bb8dp-1,
>> +      0x1.5c9882b94p-1, 0x1.5ac056b02p-1, 0x1.58ed23082p-1,
>> +      0x1.571ed3c5p-1,  0x1.555555556p-1, 0x1.5390948f4p-1,
>> +      0x1.51d07eae2p-1, 0x1.501501502p-1, 0x1.4e5e0a73p-1,
>> +      0x1.4cab88726p-1, 0x1.4afd6a052p-1, 0x1.49539e3b2p-1,
>> +      0x1.47ae147aep-1, 0x1.460cbc7f6p-1, 0x1.446f86562p-1,
>> +      0x1.42d6625d6p-1, 0x1.414141414p-1, 0x1.3fb013fbp-1,
>> +      0x1.3e22cbce4p-1, 0x1.3c995a47cp-1, 0x1.3b13b13b2p-1,
>> +      0x1.3991c2c18p-1, 0x1.381381382p-1, 0x1.3698df3dep-1,
>> +      0x1.3521cfb2cp-1, 0x1.33ae45b58p-1, 0x1.323e34a2cp-1,
>> +      0x1.30d19013p-1,  0x1.2f684bda2p-1, 0x1.2e025c04cp-1,
>> +      0x1.2c9fb4d82p-1, 0x1.2b404ad02p-1, 0x1.29e4129e4p-1,
>> +      0x1.288b01288p-1, 0x1.27350b882p-1, 0x1.25e22708p-1,
>> +      0x1.24924924ap-1, 0x1.23456789ap-1, 0x1.21fb78122p-1,
>> +      0x1.20b470c68p-1, 0x1.1f7047dc2p-1, 0x1.1e2ef3b4p-1,
>> +      0x1.1cf06ada2p-1, 0x1.1bb4a4046p-1, 0x1.1a7b9611ap-1,
>> +      0x1.19453808cp-1, 0x1.181181182p-1, 0x1.16e068942p-1,
>> +      0x1.15b1e5f76p-1, 0x1.1485f0e0ap-1, 0x1.135c81136p-1,
>> +      0x1.12358e75ep-1, 0x1.111111112p-1, 0x1.0fef010fep-1,
>> +      0x1.0ecf56be6p-1, 0x1.0db20a89p-1,  0x1.0c9714fbcp-1,
>> +      0x1.0b7e6ec26p-1, 0x1.0a6810a68p-1, 0x1.0953f3902p-1,
>> +      0x1.084210842p-1, 0x1.073260a48p-1, 0x1.0624dd2f2p-1,
>> +      0x1.05197f7d8p-1, 0x1.041041042p-1, 0x1.03091b52p-1,
>> +      0x1.020408102p-1, 0x1.01010101p-1,  0x1p-1
>> +    };
> 
> Ok.
> 
>> +  static const double lix[] = {
>> +      0x0p+0,               -0x1.6fe50b6f1eafap-7, -0x1.6e79685c160d5p-6,
>> +     -0x1.11cd1d51955bap-5, -0x1.6bad37591e03p-5,  -0x1.c4dfab908ddb5p-5,
>> +     -0x1.0eb389fab4795p-4, -0x1.3aa2fdd26ae99p-4, -0x1.663f6faca846bp-4,
>> +     -0x1.918a16e4cb157p-4, -0x1.bc84240a78a13p-4, -0x1.e72ec1181cfb1p-4,
>> +     -0x1.08c588cd964e4p-3, -0x1.1dcd19759f2e3p-3, -0x1.32ae9e27627c6p-3,
>> +     -0x1.476a9f989a58ap-3, -0x1.5c01a39fa6533p-3, -0x1.70742d4eed455p-3,
>> +     -0x1.84c2bd02d6434p-3, -0x1.98edd077e9f0ap-3, -0x1.acf5e2db31eeap-3,
>> +     -0x1.c0db6cddaa82dp-3, -0x1.d49ee4c33121ap-3, -0x1.e840be751d775p-3,
>> +     -0x1.fbc16b9003e0bp-3, -0x1.0790adbae3fcp-2,  -0x1.11307dad465b5p-2,
>> +     -0x1.1ac05b2924cc5p-2, -0x1.24407ab0cc41p-2,  -0x1.2db10fc4ea424p-2,
>> +     -0x1.37124cea58697p-2, -0x1.406463b1d455dp-2, -0x1.49a784bcbaa37p-2,
>> +     -0x1.52dbdfc4f341dp-2, -0x1.5c01a39ff2c9bp-2, -0x1.6518fe46abaa5p-2,
>> +     -0x1.6e221cd9d6933p-2, -0x1.771d2ba7f5791p-2, -0x1.800a56315ee2ap-2,
>> +     -0x1.88e9c72df8611p-2, -0x1.91bba891d495fp-2, -0x1.9a8023920fa4dp-2,
>> +     -0x1.a33760a7fbca6p-2, -0x1.abe18797d2effp-2, -0x1.b47ebf734b923p-2,
>> +     -0x1.bd0f2e9eb2b84p-2, -0x1.c592fad2be1aap-2, -0x1.ce0a4923cf5e6p-2,
>> +     -0x1.d6753e02f4ebcp-2, -0x1.ded3fd445afp-2,   -0x1.e726aa1e558fep-2,
>> +     -0x1.ef6d67325ba38p-2, -0x1.f7a8568c8aea6p-2, -0x1.ffd799a81be87p-2,
>> +     0x1.f804ae8d33c4p-2,    0x1.efec61b04af4ep-2,  0x1.e7df5fe572606p-2,
>> +     0x1.dfdd89d5b0009p-2,   0x1.d7e6c0abbd924p-2,  0x1.cffae611a74d6p-2,
>> +     0x1.c819dc2d8578cp-2,   0x1.c043859e5bdbcp-2,  0x1.b877c57b47c04p-2,
>> +     0x1.b0b67f4f29a66p-2,   0x1.a8ff97183ed07p-2,  0x1.a152f14293c74p-2,
>> +     0x1.99b072a9289cap-2,   0x1.921800927e284p-2,  0x1.8a8980ac4113p-2,
>> +     0x1.8304d90c2859dp-2,   0x1.7b89f02cbd49ap-2,  0x1.7418aceb84ab1p-2,
>> +     0x1.6cb0f68656c95p-2,   0x1.6552b49993dc2p-2,  0x1.5dfdcf1eacd7bp-2,
>> +     0x1.56b22e6b97c18p-2,   0x1.4f6fbb2ce6943p-2,  0x1.48365e6957b42p-2,
>> +     0x1.4106017c0dbcfp-2,   0x1.39de8e15727d9p-2,  0x1.32bfee37489bcp-2,
>> +     0x1.2baa0c34989c3p-2,   0x1.249cd2b177fd5p-2,  0x1.1d982c9d50468p-2,
>> +     0x1.169c0536677acp-2,   0x1.0fa848045f67bp-2,  0x1.08bce0d9a7c6p-2,
>> +     0x1.01d9bbcf66a2cp-2,   0x1.f5fd8a90e2d85p-3,  0x1.e857d3d3af1e5p-3,
>> +     0x1.dac22d3ec5f4ep-3,   0x1.cd3c712db459ap-3,  0x1.bfc67a7ff3c22p-3,
>> +     0x1.b2602497678f4p-3,   0x1.a5094b555a1f8p-3,  0x1.97c1cb136b96fp-3,
>> +     0x1.8a8980ac8652dp-3,   0x1.7d60496c83f66p-3,  0x1.7046031c7cdafp-3,
>> +     0x1.633a8bf460335p-3,   0x1.563dc2a08b102p-3,  0x1.494f863bbc1dep-3,
>> +     0x1.3c6fb6507a37ep-3,   0x1.2f9e32d5257ecp-3,  0x1.22dadc2a627efp-3,
>> +     0x1.1625931802e49p-3,   0x1.097e38cef9519p-3,  0x1.f9c95dc138295p-4,
>> +     0x1.e0b1ae90505f6p-4,   0x1.c7b528b5fcffap-4,  0x1.aed391abb17a1p-4,
>> +     0x1.960caf9bd35eap-4,   0x1.7d60496e3edebp-4,  0x1.64ce26bf2108ep-4,
>> +     0x1.4c560fe5b573bp-4,   0x1.33f7cde24adfbp-4,  0x1.1bb32a5ed9353p-4,
>> +     0x1.0387efbd3006ep-4,   0x1.d6ebd1f1d0955p-5,  0x1.a6f9c37a8beabp-5,
>> +     0x1.77394c9d6762cp-5,   0x1.47aa07358e1a4p-5,  0x1.184b8e4d490efp-5,
>> +     0x1.d23afc4d95c78p-6,   0x1.743ee8678a7cbp-6,  0x1.16a21e243bf78p-6,
>> +     0x1.72c7ba20c907ep-7,   0x1.720d9c0536e17p-8,  0x0p+0
>> +  };
> 
> Ok.
> 
>> +  double z = x;
>> +  uint32_t ux = asuint (x);
>> +  uint32_t ax = ux & (~0u >> 1);
>> +  if (__glibc_unlikely (ux >= 0x17fu << 23))
>> +    { /* x <= -1 */
>> +      if (ux == (0x17fu << 23))
>> +	return __math_divzerof (1);
>> +      if (ux > (0x1ffu << 23))
>> +	return x + x;		   /* nan */
>> +      return __math_invalidf (x);
>> +    }
> 
> Ok.
> 
>> +  else if (__glibc_unlikely (ax >= (0xff << 23)))
>> +    { /* +inf, nan  */
>> +      if (ax > (0xff << 23))
>> +	return x + x; /* nan  */
>> +      return INFINITY;
>> +    }
> 
> Ok.
> 
>> +  else if (__glibc_likely (ax < 0x3cb7aa26u))
>> +    { /* |x| < 0x1.6f544cp-6  */
>> +      double z2 = z * z, z4 = z2 * z2;
>> +      if ( __glibc_likely(ax < 0x3b9d9d34u))
> 
> Needs space between 'y' and '('

Ack.

> 
>> +	{ /* |x| < 0x1.3b3a68p-8 */
>> +	  if (__glibc_likely (ax < 0x39638a7eu))
>> +	    { /* |x| < 0x1.c714fcp-13 */
>> +	      if (__glibc_likely (ax < 0x329c5639u))
>> +		{ /* |x| < 0x1.38ac72p-26 */
>> +		  static const double c[] =
>> +		    {
>> +		      0x1.71547652b82fep+0, -0x1.71547652b82ffp-1
>> +		    };
>> +		  return z * (c[0] + z * c[1]);
>> +		}
>> +	      else
>> +		{
>> +		  if (__glibc_unlikely (ux == 0x32ff7045u))
>> +		    return 0x1.70851ap-25f - 0x1.8p-80f;
>> +		  if (__glibc_unlikely (ux == 0xb395efbbu))
>> +		    return -0x1.b0a00ap-24f + 0x1p-76f;
>> +		  if (__glibc_unlikely (ux == 0x35a14df7u))
>> +		    return 0x1.d16d2p-20f + 0x1p-72f;
>> +		  if (__glibc_unlikely (ux == 0x3841cb81u))
>> +		    return 0x1.17949ep-14f + 0x1p-67f;
>> +		  static const double c[] =
>> +		    {
>> +		      0x1.71547652b82fep+0, -0x1.71547652b82fdp-1,
>> +		      0x1.ec709ead0c9a7p-2, -0x1.7154773c1cb29p-2
>> +		    };
>> +		  return z * ((c[0] + z * c[1]) + z2 * (c[2] + z * c[3]));
>> +		}
>> +	    }
>> +	  else
> 
> Ok.
> 
>> +	    {
>> +	      if (__glibc_unlikely (ux == 0xbac9363du))
>> +		return -0x1.2282aap-9f + 0x1p-61f;
>> +	      static const double c[] =
>> +	       	{
>> +		  0x1.71547652b82fep+0, -0x1.71547652b83p-1,
>> +		  0x1.ec709dc28f51bp-2, -0x1.7154765157748p-2,
>> +		  0x1.2778a510a3682p-2, -0x1.ec745df1551fcp-3
>> +		};
>> +	      return z
>> +		     * ((c[0] + z * c[1]) + z2 * (c[2] + z * c[3])
>> +			+ z4 * ((c[4] + z * c[5])));
>> +	    }
>> +	}
>> +      else
> 
> Ok.
> 
>> +	{
>> +	  static const double c[] =
>> +	    {
>> +	      0x1.71547652b82fep+0, -0x1.71547652b82fbp-1,
>> +	      0x1.ec709dc3b6a73p-2, -0x1.71547652dc09p-2,
>> +	      0x1.2776c1a88901p-2,  -0x1.ec7095bd4d208p-3,
>> +	      0x1.a66bec7fc8f7p-3,  -0x1.71a900fc3f3f9p-3
>> +	    };
>> +	  return z
>> +		 * ((c[0] + z * c[1]) + z2 * (c[2] + z * c[3])
>> +		    + z4 * ((c[4] + z * c[5]) + z2 * (c[6] + z * c[7])));
>> +	}
>> +    }
> 
> Ok.
> 
>> +  else
>> +    { /* |x| >= 0x1.6f544cp-6 */
>> +      float h, l;
>> +      /* With gcc 6.3.0, if we return 0x1.e90026p+4f + 0x1.fp-21
>> +	 in the second exceptional case, with rounding up it yields
>> +	 0x1.e90026p+4 which is incorrect, thus we use this workaround. See
>> +	 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112367. */
>> +      if (__glibc_unlikely (ux == 0x52928e33u))
>> +	{
>> +	  h = 0x1.318ffap+5f;
>> +	  l = 0x1.fp-20f;
>> +	  return h + l;
>> +	}
>> +      if (__glibc_unlikely (ux == 0x4ebd09e3u))
>> +	{
>> +	  h = 0x1.e90026p+4f;
>> +	  l = 0x1.fp-21;
>> +	  return h + l;
>> +	}
> 
> Ok.
> 
>> +      uint64_t tp = asuint64 (z + 1.0);
>> +      uint64_t m = tp & (~(uint64_t) 0 >> 12);
>> +      int e = (tp >> 52) - 0x3ff;
>> +      int j = (m + ((int64_t) 1 << (52 - 8))) >> (52 - 7), k = j > 53;
>> +      e += k;
>> +      double xd = asdouble (m | (uint64_t) 0x3ff << 52);
>> +      z = fma (xd, ix[j], -1.0);
>> +      static const double c[] =
>> +	{
>> +	  0x1.71547652b82fep+0, -0x1.71547652b82ffp-1, 0x1.ec709dc32988bp-2,
>> +	  -0x1.715476521ec2bp-2, 0x1.277801a1ad904p-2, -0x1.ec731704d6a88p-3
>> +       	};
>> +      double z2 = z * z;
>> +      double c0 = c[0] + z * c[1];
>> +      double c2 = c[2] + z * c[3];
>> +      double c4 = c[4] + z * c[5];
>> +      c0 += z2 * (c2 + z2 * c4);
>> +      return (z * c0 - lix[j]) + e;
>> +    }
>> +}
>> +libm_alias_float (__log2p1, log2p1)
> 
> Ok.
> 
>> diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
>> diff --git a/sysdeps/m68k/m680x0/fpu/libm-test-ulps b/sysdeps/m68k/m680x0/fpu/libm-test-ulps
>> diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
>> diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
>> diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
>> diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
>> diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
>> diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
>> diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
>> diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
>> diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps
> 
> Ok.
> 


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 12/17] math: Use log10f from CORE-MATH
  2024-10-25 18:21 ` [PATCH 12/17] math: Use log10f " Adhemerval Zanella
@ 2024-10-31 20:42   ` DJ Delorie
  0 siblings, 0 replies; 53+ messages in thread
From: DJ Delorie @ 2024-10-31 20:42 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/sysdeps/i386/fpu/e_log10f.S b/sysdeps/i386/fpu/e_log10f.S
> deleted file mode 100644

Ok.

> diff --git a/sysdeps/ieee754/flt-32/e_log10f.c b/sysdeps/ieee754/flt-32/e_log10f.c

> -/* e_log10f.c -- float version of e_log10.c.
> - */
> -
> -/*
> - * ====================================================
> - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> - *
> - * Developed at SunPro, a Sun Microsystems, Inc. business.
> - * Permission to use, copy, modify, and distribute this
> - * software is freely granted, provided that this notice
> - * is preserved.
> - * ====================================================
> - */
> +/* Correctly-rounded radix-10 logarithm function for binary32 value.
> +
> +Copyright (c) 2022-2023 Alexei Sibidanov.
> +
> +This file is part of the CORE-MATH project
> +project (file src/binary32/expm1/expm1f.c, revision bc385c2).
> +
> +Permission is hereby granted, free of charge, to any person obtaining a copy
> +of this software and associated documentation files (the "Software"), to deal
> +in the Software without restriction, including without limitation the rights
> +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> +copies of the Software, and to permit persons to whom the Software is
> +furnished to do so, subject to the following conditions:
> +
> +The above copyright notice and this permission notice shall be included in all
> +copies or substantial portions of the Software.
> +
> +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> +SOFTWARE.
> +*/

Ok.

>  #include <math.h>
> -#include <math_private.h>
> -#include <fix-int-fp-convert-zero.h>
> +#include <stdint.h>
>  #include <libm-alias-finite.h>
> +#include "math_config.h"

Ok.

> -static const float
> -two25      =  3.3554432000e+07, /* 0x4c000000 */
> -ivln10     =  4.3429449201e-01, /* 0x3ede5bd9 */
> -log10_2hi  =  3.0102920532e-01, /* 0x3e9a2080 */
> -log10_2lo  =  7.9034151668e-07; /* 0x355427db */

> +static __attribute__ ((noinline)) float
> +as_special (float x)
> +{
> +  uint32_t ux = asuint (x);
> +  if (ux == 0x7f800000u)
> +    return x; /* +inf */
> +  uint32_t ax = ux << 1;
> +  if (ax == 0u)
> +    { /* -0.0 */
> +      __math_divzerof (1);
> +    }
> +  if (ax > 0xff000000u)
> +    return x + x; /* nan */
> +  return __math_invalidf (x);
> +}

Ok.

>  float
> -__ieee754_log10f(float x)
> +__ieee754_log10f (float x)

Ok.

>  {
> -	float y,z;
> -	int32_t i,k,hx;
> -
> -	GET_FLOAT_WORD(hx,x);
> -
> -	k=0;
> -	if (hx < 0x00800000) {			/* x < 2**-126  */
> -	    if (__builtin_expect((hx&0x7fffffff)==0, 0))
> -	      return -two25/fabsf (x);	/* log(+-0)=-inf  */
> -	    if (__builtin_expect(hx<0, 0))
> -		return (x-x)/(x-x);	/* log(-#) = NaN */
> -	    k -= 25; x *= two25; /* subnormal number, scale up x */
> -	    GET_FLOAT_WORD(hx,x);

> +  static const double tr[] =
> +    {
> +      0x1p+0,         0x1.f81f82p-1,  0x1.f07c1fp-1,  0x1.e9131acp-1,
> +      0x1.e1e1e1ep-1, 0x1.dae6077p-1, 0x1.d41d41dp-1, 0x1.cd85689p-1,
> +      0x1.c71c71cp-1, 0x1.c0e0704p-1, 0x1.bacf915p-1, 0x1.b4e81b5p-1,
> +      0x1.af286bdp-1, 0x1.a98ef6p-1,  0x1.a41a41ap-1, 0x1.9ec8e95p-1,
> +      0x1.999999ap-1, 0x1.948b0fdp-1, 0x1.8f9c19p-1,  0x1.8acb90fp-1,
> +      0x1.8618618p-1, 0x1.8181818p-1, 0x1.7d05f41p-1, 0x1.78a4c81p-1,
> +      0x1.745d174p-1, 0x1.702e05cp-1, 0x1.6c16c17p-1, 0x1.6816817p-1,
> +      0x1.642c859p-1, 0x1.605816p-1,  0x1.5c9882cp-1, 0x1.58ed231p-1,
> +      0x1.5555555p-1, 0x1.51d07ebp-1, 0x1.4e5e0a7p-1, 0x1.4afd6ap-1,
> +      0x1.47ae148p-1, 0x1.446f865p-1, 0x1.4141414p-1, 0x1.3e22cbdp-1,
> +      0x1.3b13b14p-1, 0x1.3813814p-1, 0x1.3521cfbp-1, 0x1.323e34ap-1,
> +      0x1.2f684bep-1, 0x1.2c9fb4ep-1, 0x1.29e412ap-1, 0x1.27350b9p-1,
> +      0x1.2492492p-1, 0x1.21fb781p-1, 0x1.1f7047ep-1, 0x1.1cf06aep-1,
> +      0x1.1a7b961p-1, 0x1.1811812p-1, 0x1.15b1e5fp-1, 0x1.135c811p-1,
> +      0x1.1111111p-1, 0x1.0ecf56cp-1, 0x1.0c9715p-1,  0x1.0a6810ap-1,
> +      0x1.0842108p-1, 0x1.0624dd3p-1, 0x1.041041p-1,  0x1.0204081p-1,
> +      0.5
> +    };
> +  static const double tl[] =
> +    {
> +      -0x1.d45fd6237ebe3p-47, 0x1.b947689311b6ep-8, 0x1.b5e909c96d7d5p-7,
> +      0x1.45f4f59ed2165p-6,   0x1.af5f92cbd8f1ep-6, 0x1.0ba01a606de8cp-5,
> +      0x1.3ed119b9a2b7bp-5,   0x1.714834298eec2p-5, 0x1.a30a9d98357fbp-5,
> +      0x1.d41d512670813p-5,   0x1.02428c0f65519p-4, 0x1.1a23444eecc3ep-4,
> +      0x1.31b30543f4cb4p-4,   0x1.48f3ed39bfd04p-4, 0x1.5fe8049a0e423p-4,
> +      0x1.769140a6aa008p-4,   0x1.8cf1836c98cb3p-4, 0x1.a30a9d55541a1p-4,
> +      0x1.b8de4d1ee823ep-4,   0x1.ce6e4202ca2e6p-4, 0x1.e3bc1accace07p-4,
> +      0x1.f8c9683b5abd4p-4,   0x1.06cbd68ca9a6ep-3, 0x1.11142f19df73p-3,
> +      0x1.1b3e71fa7a97fp-3,   0x1.254b4d37a46e3p-3, 0x1.2f3b6912cbf07p-3,
> +      0x1.390f683115886p-3,   0x1.42c7e7fffc5a8p-3, 0x1.4c65808c78d3cp-3,
> +      0x1.55e8c50751c55p-3,   0x1.5f52445dec3d8p-3, 0x1.68a288c3f12p-3,
> +      0x1.71da17bdf0d19p-3,   0x1.7af973608afd9p-3, 0x1.84011952a2579p-3,
> +      0x1.8cf1837a7ea6p-3,    0x1.95cb2891e43d6p-3, 0x1.9e8e7b0f869ep-3,
> +      0x1.a73beaa5db18dp-3,   0x1.afd3e394558d3p-3, 0x1.b856cf060d9f1p-3,
> +      0x1.c0c5134de1ffcp-3,   0x1.c91f1371bc99fp-3, 0x1.d1652ffcd3f53p-3,
> +      0x1.d997c6f635e75p-3,   0x1.e1b733ab90f3bp-3, 0x1.e9c3ceadac856p-3,
> +      0x1.f1bdeec43a305p-3,   0x1.f9a5e7a5fa3fep-3, 0x1.00be05ac02f2bp-2,
> +      0x1.04a054d81a2d4p-2,   0x1.087a0835957fbp-2, 0x1.0c4b457099517p-2,
> +      0x1.101431aa1fe51p-2,   0x1.13d4f08b98dd8p-2, 0x1.178da53edb892p-2,
> +      0x1.1b3e71e9f9d58p-2,   0x1.1ee777defdeedp-2, 0x1.2288d7b48e23bp-2,
> +      0x1.2622b0f52e49fp-2,   0x1.29b522a4c6314p-2, 0x1.2d404b0e30f8p-2,
> +      0x1.30c4478f3fbe5p-2,   0x1.34413509f7915p-2
> +    };
> +  static const union
> +  {
> +    float f;
> +    uint32_t u;
> +  } st[] =
> +  {
> +    { 0x1p+0 },        { 0x1.4p+3 },      { 0x1.9p+6 },       { 0x1.f4p+9 },
> +    { 0x1.388p+13 },   { 0x1.86ap+16 },   { 0x1.e848p+19 },   { 0x1.312dp+23 },
> +    { 0x1.7d784p+26 }, { 0x1.dcd65p+29 }, { 0x1.2a05f2p+33 }, { 0 },
> +    { 0 },             { 0 },             { 0 },              { 0 }
> +  };
> +  static const double b[] =
> +    { 
> +      0x1.bcb7b15c5a2f8p-2, -0x1.bcbb1dbb88ebap-3, 0x1.2871c39d521c6p-3
> +    };
> +  static const double c[] =
> +    {
> +      0x1.bcb7b1526e50ep-2,  -0x1.bcb7b1526e53dp-3, 0x1.287a7636f3fa2p-3,
> +      -0x1.bcb7b146a14b3p-4, 0x1.63c627d5219cbp-4,  -0x1.2880736c8762dp-4,
> +      0x1.fc1ecf913961ap-5
> +    };

Ok.

> +  uint32_t ux = asuint (x);
> +  if (__glibc_unlikely (ux < (1 << 23) || ux >= 0x7f800000u))
> +    {
> +      if (ux == 0 || ux >= 0x7f800000u)
> +	return as_special (x);
> +      /* subnormal */
> +      int n = __builtin_clz (ux) - 8;
> +      ux <<= n;
> +      ux -= n << 23;
> +    }

Ok.

> +  unsigned m = ux & ((1 << 23) - 1), j = (m + (1 << (23 - 7))) >> (23 - 6);
> +  double ix = tr[j], l = tl[j];
> +  int e = ((int) ux >> 23) - 127;
> +  unsigned je = e + 1;
> +  je = (je * 0x4d104d4) >> 28;
> +  if (__glibc_unlikely (ux == st[je].u))
> +    return je;

Ok.

> +  double tz = asdouble (((int64_t) m | ((int64_t) 1023 << 23)) << (52 - 23));
> +  double z = tz * ix - 1, z2 = z * z;
> +  double r
> +      = ((e * 0x1.34413509f79ffp-2 + l) + z * b[0]) + z2 * (b[1] + z * b[2]);
> +  float ub = r, lb = r + 0x1.b008p-34;
> +  if (__glibc_unlikely (ub != lb))
> +    {
> +      double f = z
> +		 * ((c[0] + z * c[1])
> +		    + z2
> +			  * ((c[2] + z * c[3])
> +			     + z2 * (c[4] + z * c[5] + z2 * c[6])));

Odd looking but OK.

> +      f -= 0x1.0cee0ed4ca7e9p-54 * e;
> +      f += l - tl[0];
> +      double el = e * 0x1.34413509f7ap-2;

Ok.

> +      r = el + f;
> +      ub = r;
> +      tz = r;
> +      if (__glibc_unlikely (!((asuint64 (tz) & ((1 << 28) - 1)))))
> +	{
> +	  double dr = (el - r) + f;
> +	  r += dr * 32;
> +	  ub = r;
>  	}
> -	if (__builtin_expect(hx >= 0x7f800000, 0)) return x+x;
> -	k += (hx>>23)-127;
> -	i  = ((uint32_t)k&0x80000000)>>31;
> -	hx = (hx&0x007fffff)|((0x7f-i)<<23);
> -	y  = (float)(k+i);
> -	if (FIX_INT_FP_CONVERT_ZERO && y == 0.0f)
> -	  y = 0.0f;
> -	SET_FLOAT_WORD(x,hx);
> -	z  = y*log10_2lo + ivln10*__ieee754_logf(x);
> -	return  z+y*log10_2hi;
> +    }
> +  return ub;
>  }
>  libm_alias_finite (__ieee754_log10f, __log10f)

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 14/17] math: Use log1pf from CORE-MATH
  2024-10-25 18:21 ` [PATCH 14/17] math: Use log1pf " Adhemerval Zanella
  2024-10-25 19:12   ` Joseph Myers
@ 2024-10-31 21:20   ` DJ Delorie
  1 sibling, 0 replies; 53+ messages in thread
From: DJ Delorie @ 2024-10-31 21:20 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul.Zimmermann, sibid


LGTM
Reviewed-by: DJ Delorie <dj@redhat.com>

Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/sysdeps/aarch64/libm-test-ulps b/sysdeps/aarch64/libm-test-ulps
> diff --git a/sysdeps/alpha/fpu/libm-test-ulps b/sysdeps/alpha/fpu/libm-test-ulps
> diff --git a/sysdeps/arc/fpu/libm-test-ulps b/sysdeps/arc/fpu/libm-test-ulps
> diff --git a/sysdeps/arc/nofpu/libm-test-ulps b/sysdeps/arc/nofpu/libm-test-ulps
> diff --git a/sysdeps/arm/libm-test-ulps b/sysdeps/arm/libm-test-ulps
> diff --git a/sysdeps/csky/fpu/libm-test-ulps b/sysdeps/csky/fpu/libm-test-ulps
> diff --git a/sysdeps/csky/nofpu/libm-test-ulps b/sysdeps/csky/nofpu/libm-test-ulps
> diff --git a/sysdeps/hppa/fpu/libm-test-ulps b/sysdeps/hppa/fpu/libm-test-ulps
> diff --git a/sysdeps/i386/fpu/libm-test-ulps b/sysdeps/i386/fpu/libm-test-ulps

Ok.

> diff --git a/sysdeps/i386/fpu/s_log1pf.S b/sysdeps/i386/fpu/s_log1pf.S
> deleted file mode 100644

Ok.

> diff --git a/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps b/sysdeps/i386/i686/fpu/multiarch/libm-test-ulps

Ok.

> diff --git a/sysdeps/ieee754/flt-32/s_log1pf.c b/sysdeps/ieee754/flt-32/s_log1pf.c

> -/* s_log1pf.c -- float version of s_log1p.c.
> - */
>  
> -/*
> - * ====================================================
> - * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> - *
> - * Developed at SunPro, a Sun Microsystems, Inc. business.
> - * Permission to use, copy, modify, and distribute this
> - * software is freely granted, provided that this notice
> - * is preserved.
> - * ====================================================
> - */
> -#include <float.h>
> -#include <math.h>
> -#include <math-barriers.h>
> -#include <math_private.h>
> -#include <math-underflow.h>
> -#include <libc-diag.h>
> -static const float
> -ln2_hi =   6.9313812256e-01,	/* 0x3f317180 */
> -ln2_lo =   9.0580006145e-06,	/* 0x3717f7d1 */
> -two25 =    3.355443200e+07,	/* 0x4c000000 */
> -Lp1 = 6.6666668653e-01,	/* 3F2AAAAB */
> -Lp2 = 4.0000000596e-01,	/* 3ECCCCCD */
> -Lp3 = 2.8571429849e-01, /* 3E924925 */
> -Lp4 = 2.2222198546e-01, /* 3E638E29 */
> -Lp5 = 1.8183572590e-01, /* 3E3A3325 */
> -Lp6 = 1.5313838422e-01, /* 3E1CD04F */
> -Lp7 = 1.4798198640e-01; /* 3E178897 */
> -static const float zero = 0.0;
> -float
> -__log1pf(float x)

Ok.

> +/* Correctly-rounded biased argument natural logarithm function for binary32
> +   value.
> +Copyright (c) 2023, 2024  Alexei Sibidanov.
> +This file is part of the CORE-MATH project
> +project (file src/binary32/log1p/log1pf.c revision bc385c2).
>  
> +Permission is hereby granted, free of charge, to any person obtaining a copy
> +of this software and associated documentation files (the "Software"), to deal
> +in the Software without restriction, including without limitation the rights
> +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> +copies of the Software, and to permit persons to whom the Software is
> +furnished to do so, subject to the following conditions:
>  
> +The above copyright notice and this permission notice shall be included in all
> +copies or substantial portions of the Software.
>  
> +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
> +SOFTWARE.
> +*/
> +
> +#include <math.h>
> +#include <stdint.h>
> +#include <errno.h>
> +#include <libm-alias-float.h>
> +#include "math_config.h"

Ok.

> +static __attribute__ ((noinline)) float
> +as_special (float x)
>  {
> -	float hfsq,f,c,s,z,R,u;
> -	int32_t k,hx,hu,ax;
> +  uint32_t t = asuint (x);
> +  if (t == 0xbf800000u)
> +    return __math_divzerof (1);
> +  if (t == 0x7f800000u)
> +    return x; /* +inf */
> +  uint32_t ax = t << 1;
> +  if (ax > 0xff000000u)
> +    return x + x; /* nan */
> +  return __math_invalidf (0.0f);
> +}
>  

Ok.

> -	GET_FLOAT_WORD(hx,x);
> -	ax = hx&0x7fffffff;

Ok.

> +float
> +__log1pf (float x)
> +{
> +  static const double x0[] =
> +    {
> +      0x1.f81f82p-1,  0x1.e9131acp-1, 0x1.dae6077p-1, 0x1.cd85689p-1,
> +      0x1.c0e0704p-1, 0x1.b4e81b5p-1, 0x1.a98ef6p-1,  0x1.9ec8e95p-1,
> +      0x1.948b0fdp-1, 0x1.8acb90fp-1, 0x1.8181818p-1, 0x1.78a4c81p-1,
> +      0x1.702e05cp-1, 0x1.6816817p-1, 0x1.605816p-1,  0x1.58ed231p-1,
> +      0x1.51d07ebp-1, 0x1.4afd6ap-1,  0x1.446f865p-1, 0x1.3e22cbdp-1,
> +      0x1.3813814p-1, 0x1.323e34ap-1, 0x1.2c9fb4ep-1, 0x1.27350b9p-1,
> +      0x1.21fb781p-1, 0x1.1cf06aep-1, 0x1.1811812p-1, 0x1.135c811p-1,
> +      0x1.0ecf56cp-1, 0x1.0a6810ap-1, 0x1.0624dd3p-1, 0x1.0204081p-1
> +    };
> +  static const double lixb[] =
> +    {
> +      0x1.fc0a8909b4218p-7, 0x1.77458f51aac89p-5, 0x1.341d793afb997p-4,
> +      0x1.a926d3a5ebd2ap-4, 0x1.0d77e7a8a823dp-3, 0x1.44d2b6c557102p-3,
> +      0x1.7ab89040accecp-3, 0x1.af3c94ecab3d6p-3, 0x1.e27076d54e6c9p-3,
> +      0x1.0a324e3888ad5p-2, 0x1.22941fc0c7357p-2, 0x1.3a64c56ae3fdbp-2,
> +      0x1.51aad874af21fp-2, 0x1.686c81d300eap-2,  0x1.7eaf83c7fa9b5p-2,
> +      0x1.947941aa610ecp-2, 0x1.a9cec9a3f023bp-2, 0x1.beb4d9ea4156ep-2,
> +      0x1.d32fe7f35e5c7p-2, 0x1.e7442617b817ap-2, 0x1.faf588dd5ed1p-2,
> +      0x1.0723e5c635c39p-1, 0x1.109f39d53c99p-1,  0x1.19ee6b38a4668p-1,
> +      0x1.23130d7f93c3bp-1, 0x1.2c0e9ec9b0b85p-1, 0x1.34e289cb35eccp-1,
> +      0x1.3d9026ad3d3f3p-1, 0x1.4618bc1eadbbbp-1, 0x1.4e7d8127dd8a9p-1,
> +      0x1.56bf9d5967092p-1, 0x1.5ee02a926936ep-1
> +    };
> +  static const double lix[] =
> +    {
> +      0x1.fc0a890fc03e4p-7, 0x1.77458f532dcfcp-5, 0x1.341d793bbd1d1p-4,
> +      0x1.a926d3a6ad563p-4, 0x1.0d77e7a908e59p-3, 0x1.44d2b6c5b7d1ep-3,
> +      0x1.7ab890410d909p-3, 0x1.af3c94ed0bff3p-3, 0x1.e27076d5af2e6p-3,
> +      0x1.0a324e38b90e3p-2, 0x1.22941fc0f7966p-2, 0x1.3a64c56b145eap-2,
> +      0x1.51aad874df82dp-2, 0x1.686c81d3314afp-2, 0x1.7eaf83c82afc3p-2,
> +      0x1.947941aa916fbp-2, 0x1.a9cec9a42084ap-2, 0x1.beb4d9ea71b7cp-2,
> +      0x1.d32fe7f38ebd5p-2, 0x1.e7442617e8788p-2, 0x1.faf588dd8f31fp-2,
> +      0x1.0723e5c64df4p-1,  0x1.109f39d554c97p-1, 0x1.19ee6b38bc96fp-1,
> +      0x1.23130d7fabf43p-1, 0x1.2c0e9ec9c8e8cp-1, 0x1.34e289cb4e1d3p-1,
> +      0x1.3d9026ad556fbp-1, 0x1.4618bc1ec5ec2p-1, 0x1.4e7d8127f5bb1p-1,
> +      0x1.56bf9d597f399p-1, 0x1.5ee02a9281675p-1
> +    };
> +  static const double b[] =
> +    {
> +      0x1p+0,
> +      -0x1p-1,
> +      0x1.5555555556f6bp-2,
> +      -0x1.00000000029b9p-2,
> +      0x1.9999988d176e4p-3,
> +      -0x1.55555418889a7p-3,
> +      0x1.24adeca50e2bcp-3,
> +      -0x1.001ba33bf57cfp-3
> +    };

Ok.

> -	k = 1;
> -	if (hx < 0x3ed413d7) {			/* x < 0.41422  */
> -	    if(ax>=0x3f800000) {		/* x <= -1.0 */
> -		if(x==(float)-1.0) return -two25/zero; /* log1p(-1)=-inf */
> -		else return (x-x)/(x-x);	/* log1p(x<-1)=NaN */
> -	    }
> -	    if(ax<0x31000000) {			/* |x| < 2**-29 */
> -		math_force_eval(two25+x);	/* raise inexact */
> -		if (ax<0x24800000)		/* |x| < 2**-54 */
> -		  {
> -		    math_check_force_underflow (x);
> -		    return x;
> -		  }
> -		else
> -		    return x - x*x*(float)0.5;
> -	    }
> -	    if(hx>0||hx<=((int32_t)0xbe95f61f)) {
> -		k=0;f=x;hu=1;}	/* -0.2929<x<0.41422 */

Ok.

> +  double z = x;
> +  uint32_t ux = asuint (x);
> +  uint32_t ax = ux & (~0u >> 1);
> +  if (__glibc_likely (ax < 0x3c880000))
> +    {
> +      if (__glibc_unlikely (ax < 0x33000000))
> +	{
> +	  if (!ax)
> +	    return x;
> +	  return fmaf (x, -x, x);
>  	}

Ok.

> -	if (hx >= 0x7f800000) return x+x;
> -	if(k!=0) {
> -	    if(hx<0x5a000000) {
> -		u  = (float)1.0+x;
> -		GET_FLOAT_WORD(hu,u);
> -		k  = (hu>>23)-127;
> -		/* correction term */
> -		c  = (k>0)? (float)1.0-(u-x):x-(u-(float)1.0);
> -		c /= u;
> -	    } else {
> -		u  = x;
> -		GET_FLOAT_WORD(hu,u);
> -		k  = (hu>>23)-127;
> -		c  = 0;
> -	    }
> -	    hu &= 0x007fffff;
> -	    if(hu<0x3504f7) {
> -		SET_FLOAT_WORD(u,hu|0x3f800000);/* normalize u */
> -	    } else {
> -		k += 1;
> -		SET_FLOAT_WORD(u,hu|0x3f000000);	/* normalize u/2 */
> -		hu = (0x00800000-hu)>>2;

Ok.

> +      double z2 = z * z, z4 = z2 * z2;
> +      double f = z2
> +		 * ((b[1] + z * b[2]) + z2 * (b[3] + z * b[4])
> +		    + z4 * ((b[5] + z * b[6]) + z2 * b[7]));
> +      double r = z + f;
> +      if (__glibc_unlikely ((asuint64 (r) & 0xfffffffll) == 0))
> +	r += 0x1p14 * (f + (z - r));
> +      return r;
> +    }

Ok.

> +  else
> +    {
> +      if (__glibc_unlikely (ux >= 0xbf800000u || ax >= 0x7f800000))
> +	return as_special (x);
> +      uint64_t tp = asuint64 (z + 1);
> +      int e = tp >> 52;
> +      uint64_t m52 = tp & (~(uint64_t) 0 >> 12);
> +      unsigned int j = (tp >> (52 - 5)) & 31;
> +      e -= 0x3ff;
> +      double xd = asdouble (m52 | ((uint64_t) 0x3ff << 52));
> +      z = xd * x0[j] - 1;
> +      static const double c[] =
> +	{
> +	  -0x1.3902c33434e7fp-43, 0x1.ffffffe1cbed5p-1, -0x1.ffffff7d1b014p-2,
> +	  0x1.5564e0ed3613ap-2, -0x1.0012232a00d4ap-2
> +	};
> +      const double ln2 = 0x1.62e42fefa39efp-1;
> +      double z2 = z * z,
> +	     r = (ln2 * e + lixb[j])
> +		 + z * ((c[1] + z * c[2]) + z2 * (c[3] + z * c[4]));
> +      float ub = r;
> +      float lb = r + 2.2e-11;

Ok.

> +      if (__glibc_unlikely (ub != lb))
> +	{
> +	  double z4 = z2 * z2,
> +		 f = z
> +		     * ((b[0] + z * b[1]) + z2 * (b[2] + z * b[3])
> +			+ z4 * ((b[4] + z * b[5]) + z2 * (b[6] + z * b[7])));
> +	  const double ln2l = 0x1.7f7d1cf79abcap-20, ln2h = 0x1.62e4p-1;
> +	  double Lh = ln2h * e;
> +	  double Ll = ln2l * e;
> +	  double rl = f + Ll + lix[j];
> +	  double tr = rl + Lh;
> +	  if (__glibc_unlikely ((asuint64 (tr) & 0xfffffffll) == 0))
> +	    {
> +	      if (x == -0x1.247ab0p-6)
> +		return -0x1.271f0ep-6f - 0x1p-31f;
> +	      if (x == -0x1.3a415ep-5)
> +		return -0x1.407112p-5f + 0x1p-30f;
> +	      if (x == 0x1.fb035ap-2)
> +		return 0x1.9bddc2p-2f + 0x1p-27f;
> +	      tr += 64 * (rl + (Lh - tr));
>  	    }

Ok.

> -	    f = u-(float)1.0;
> -	}
> -	hfsq=(float)0.5*f*f;
> -	if(hu==0) {	/* |f| < 2**-20 */
> -	    if(f==zero) {
> -		if(k==0) return zero;
> -		else {c += k*ln2_lo; return k*ln2_hi+c;}

> +	  else if (rl + (Lh - tr) == 0.0)
> +	    {
> +	      if (x == 0x1.b7fd86p-4)
> +		return 0x1.a1ece2p-4f + 0x1p-29f;
> +	      if (x == -0x1.3a415ep-5)
> +		return -0x1.407112p-5f + 0x1p-30f;
> +	      if (x == 0x1.43c7e2p-6)
> +		return 0x1.409f80p-6f + 0x1p-31f;

Ok.

>  	    }
> -	    R = hfsq*(1.0f-0.66666666666666666f*f);
> -	    if(k==0) return f-R; else
> -		     return k*ln2_hi-((R-(k*ln2_lo+c))-f);
> +	  ub = tr;

Ok.

>  	}
> -	s = f/((float)2.0+f);
> -	z = s*s;
> -	R = z*(Lp1+z*(Lp2+z*(Lp3+z*(Lp4+z*(Lp5+z*(Lp6+z*Lp7))))));
> -	if (k == 0)
> -	  return f - (hfsq - s * (hfsq + R));
> -	else
> -	  {
> -	    /* With GCC 7 when compiling with -Os the compiler warns
> -	       that c might be used uninitialized.  This can't be true
> -	       because k must be 0 for c to be uninitialized and we
> -	       handled that computation earlier without using c.  */
> -	    DIAG_PUSH_NEEDS_COMMENT;
> -	    DIAG_IGNORE_Os_NEEDS_COMMENT (7, "-Wmaybe-uninitialized");
> -	    return k * ln2_hi - ((hfsq - (s * (hfsq + R)
> -					  + (k * ln2_lo + c))) - f);
> -	    DIAG_POP_NEEDS_COMMENT;
> -	  }

Ok.

> +      return ub;
> +    }
>  }
> +libm_alias_float (__log1p, log1p)
> +strong_alias (__log1pf, __logp1f)
> +libm_alias_float (__logp1, logp1)

Ok

> diff --git a/sysdeps/ieee754/flt-32/w_log1pf.c b/sysdeps/ieee754/flt-32/w_log1pf.c
> new file mode 100644
> index 0000000000..1cc8931700
> --- /dev/null
> +++ b/sysdeps/ieee754/flt-32/w_log1pf.c
> @@ -0,0 +1 @@
> +/* Not needed.  */

Ok.

> diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
> diff --git a/sysdeps/m68k/coldfire/fpu/libm-test-ulps b/sysdeps/m68k/coldfire/fpu/libm-test-ulps

Ok.

> diff --git a/sysdeps/m68k/m680x0/fpu/w_log1pf.c b/sysdeps/m68k/m680x0/fpu/w_log1pf.c
> new file mode 100644
> index 0000000000..5f363cc66b
> --- /dev/null
> +++ b/sysdeps/m68k/m680x0/fpu/w_log1pf.c
> @@ -0,0 +1,20 @@
> +/* Wrapper for __log1p that handles setting errno.
> +   Copyright (C) 2015-2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <math-type-macros-float.h>
> +#include <w_log1p_template.c>

Ok.

> diff --git a/sysdeps/microblaze/libm-test-ulps b/sysdeps/microblaze/libm-test-ulps
> diff --git a/sysdeps/mips/mips32/libm-test-ulps b/sysdeps/mips/mips32/libm-test-ulps
> diff --git a/sysdeps/mips/mips64/libm-test-ulps b/sysdeps/mips/mips64/libm-test-ulps
> diff --git a/sysdeps/nios2/libm-test-ulps b/sysdeps/nios2/libm-test-ulps
> diff --git a/sysdeps/or1k/nofpu/libm-test-ulps b/sysdeps/or1k/nofpu/libm-test-ulps
> diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
> diff --git a/sysdeps/powerpc/nofpu/libm-test-ulps b/sysdeps/powerpc/nofpu/libm-test-ulps
> diff --git a/sysdeps/riscv/nofpu/libm-test-ulps b/sysdeps/riscv/nofpu/libm-test-ulps
> diff --git a/sysdeps/riscv/rvd/libm-test-ulps b/sysdeps/riscv/rvd/libm-test-ulps
> diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps
> diff --git a/sysdeps/sh/libm-test-ulps b/sysdeps/sh/libm-test-ulps
> diff --git a/sysdeps/sparc/fpu/libm-test-ulps b/sysdeps/sparc/fpu/libm-test-ulps
> diff --git a/sysdeps/x86_64/fpu/libm-test-ulps b/sysdeps/x86_64/fpu/libm-test-ulps

Ok.


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 09/17] math: Use exp10m1f from CORE-MATH
  2024-10-31 13:20     ` Adhemerval Zanella Netto
@ 2024-11-04 10:37       ` Paul Zimmermann
  2024-11-04 12:54         ` Adhemerval Zanella Netto
  0 siblings, 1 reply; 53+ messages in thread
From: Paul Zimmermann @ 2024-11-04 10:37 UTC (permalink / raw)
  To: Adhemerval Zanella Netto; +Cc: dj, libc-alpha, sibid

       Hi,

> >>  Function: "exp10m1":
> >>  double: 4
> >> -float: 2
> >>  ldouble: 3
> > 
> > Does this mean "we're not testing it any more" or "we expect zero ULPs
> > and verify that" ?  I don't see any ": 0" in any of the ulps files so I
> > assume the latter.
> 
> The former, we are expecting a correctly rounded implementation for the
> inputs we test.

I guess Adhemerval meant the latter: the CORE-MATH code should be correctly
rounded for all inputs (and all rounding modes).

Paul

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 09/17] math: Use exp10m1f from CORE-MATH
  2024-11-04 10:37       ` Paul Zimmermann
@ 2024-11-04 12:54         ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 53+ messages in thread
From: Adhemerval Zanella Netto @ 2024-11-04 12:54 UTC (permalink / raw)
  To: Paul Zimmermann; +Cc: dj, libc-alpha, sibid



On 04/11/24 07:37, Paul Zimmermann wrote:
>        Hi,
> 
>>>>  Function: "exp10m1":
>>>>  double: 4
>>>> -float: 2
>>>>  ldouble: 3
>>>
>>> Does this mean "we're not testing it any more" or "we expect zero ULPs
>>> and verify that" ?  I don't see any ": 0" in any of the ulps files so I
>>> assume the latter.
>>
>> The former, we are expecting a correctly rounded implementation for the
>> inputs we test.
> 
> I guess Adhemerval meant the latter: the CORE-MATH code should be correctly
> rounded for all inputs (and all rounding modes).
> 
> Paul

Yes, the latter.  An non-existent entry for the type means a correctly rounded
implementation.

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 09/17] math: Use exp10m1f from CORE-MATH
  2024-10-25 18:21 ` [PATCH 09/17] math: Use exp10m1f from CORE-MATH Adhemerval Zanella
  2024-10-29 21:09   ` DJ Delorie
@ 2024-11-06 10:29   ` Florian Weimer
  2024-11-06 11:07     ` Paul Zimmermann
  1 sibling, 1 reply; 53+ messages in thread
From: Florian Weimer @ 2024-11-06 10:29 UTC (permalink / raw)
  To: Adhemerval Zanella; +Cc: libc-alpha, Paul Zimmermann, Alexei Sibidanov

* Adhemerval Zanella:

> The CORE-MATH implementation is correctly rounded (for any rounding mode)
> and shows better performance compared to the generic exp10m1f.

When compiled with GCC 11, it's not correctly rounded on x86-64 (both
current AMD and Intel CPUs, with and without FMA):

Failure: Test: exp10m1_towardzero (-0x1.1p+4)                                   
Result:                                                                         
 is:         -1.00000000e+00  -0x1.000000p+0                                    
 should be:  -9.99999940e-01  -0x1.fffffep-1                                    
 difference:  5.96046447e-08   0x1.000000p-24                                   
 ulp       :  1.0000                                                            
 max.ulp   :  0.0000                                                            

I don't see this with GCC 14.

Any suggestions how to debug this further?

Thanks,
Florian


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 09/17] math: Use exp10m1f from CORE-MATH
  2024-11-06 10:29   ` Florian Weimer
@ 2024-11-06 11:07     ` Paul Zimmermann
  2024-11-06 13:45       ` Adhemerval Zanella Netto
  0 siblings, 1 reply; 53+ messages in thread
From: Paul Zimmermann @ 2024-11-06 11:07 UTC (permalink / raw)
  To: Florian Weimer; +Cc: adhemerval.zanella, libc-alpha, sibid

       Hi Florian,

there was a missing 'f' suffix:

--- a/sysdeps/ieee754/flt-32/s_exp10m1f.c
+++ b/sysdeps/ieee754/flt-32/s_exp10m1f.c
@@ -40,7 +40,7 @@ __exp10m1f (float x)
     { /* x < -7.52575 */
       if (ax > (0xffu << 23))
        return x + x; /* nan */
-      return (ux == 0xff800000) ? -0x1p+0 : -0x1p+0 + 0x1p-26f;
+      return (ux == 0xff800000) ? -0x1p+0f : -0x1p+0f + 0x1p-26f;
     }
   else if (__glibc_unlikely (ax > 0x421a209au))
     { /* x > 38.5318 */

The same patch should be applied to exp2m1f.

Paul

> From: Florian Weimer <fweimer@redhat.com>
> Cc: libc-alpha@sourceware.org,  Paul Zimmermann <Paul.Zimmermann@inria.fr>,
>   Alexei Sibidanov <sibid@uvic.ca>
> Date: Wed, 06 Nov 2024 11:29:04 +0100
> 
> * Adhemerval Zanella:
> 
> > The CORE-MATH implementation is correctly rounded (for any rounding mode)
> > and shows better performance compared to the generic exp10m1f.
> 
> When compiled with GCC 11, it's not correctly rounded on x86-64 (both
> current AMD and Intel CPUs, with and without FMA):
> 
> Failure: Test: exp10m1_towardzero (-0x1.1p+4)                                   
> Result:                                                                         
>  is:         -1.00000000e+00  -0x1.000000p+0                                    
>  should be:  -9.99999940e-01  -0x1.fffffep-1                                    
>  difference:  5.96046447e-08   0x1.000000p-24                                   
>  ulp       :  1.0000                                                            
>  max.ulp   :  0.0000                                                            
> 
> I don't see this with GCC 14.
> 
> Any suggestions how to debug this further?
> 
> Thanks,
> Florian
> 

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH 09/17] math: Use exp10m1f from CORE-MATH
  2024-11-06 11:07     ` Paul Zimmermann
@ 2024-11-06 13:45       ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 53+ messages in thread
From: Adhemerval Zanella Netto @ 2024-11-06 13:45 UTC (permalink / raw)
  To: Paul Zimmermann, Florian Weimer; +Cc: libc-alpha, sibid

Thanks, I was about to debug this further since I haven't seen this
with gcc 12, gcc 13 or gcc 14.

I will handle this, thanks again Paul.

On 06/11/24 08:07, Paul Zimmermann wrote:
>        Hi Florian,
> 
> there was a missing 'f' suffix:
> 
> --- a/sysdeps/ieee754/flt-32/s_exp10m1f.c
> +++ b/sysdeps/ieee754/flt-32/s_exp10m1f.c
> @@ -40,7 +40,7 @@ __exp10m1f (float x)
>      { /* x < -7.52575 */
>        if (ax > (0xffu << 23))
>         return x + x; /* nan */
> -      return (ux == 0xff800000) ? -0x1p+0 : -0x1p+0 + 0x1p-26f;
> +      return (ux == 0xff800000) ? -0x1p+0f : -0x1p+0f + 0x1p-26f;
>      }
>    else if (__glibc_unlikely (ax > 0x421a209au))
>      { /* x > 38.5318 */
> 
> The same patch should be applied to exp2m1f.
> 
> Paul
> 
>> From: Florian Weimer <fweimer@redhat.com>
>> Cc: libc-alpha@sourceware.org,  Paul Zimmermann <Paul.Zimmermann@inria.fr>,
>>   Alexei Sibidanov <sibid@uvic.ca>
>> Date: Wed, 06 Nov 2024 11:29:04 +0100
>>
>> * Adhemerval Zanella:
>>
>>> The CORE-MATH implementation is correctly rounded (for any rounding mode)
>>> and shows better performance compared to the generic exp10m1f.
>>
>> When compiled with GCC 11, it's not correctly rounded on x86-64 (both
>> current AMD and Intel CPUs, with and without FMA):
>>
>> Failure: Test: exp10m1_towardzero (-0x1.1p+4)                                   
>> Result:                                                                         
>>  is:         -1.00000000e+00  -0x1.000000p+0                                    
>>  should be:  -9.99999940e-01  -0x1.fffffep-1                                    
>>  difference:  5.96046447e-08   0x1.000000p-24                                   
>>  ulp       :  1.0000                                                            
>>  max.ulp   :  0.0000                                                            
>>
>> I don't see this with GCC 14.
>>
>> Any suggestions how to debug this further?
>>
>> Thanks,
>> Florian
>>


^ permalink raw reply	[flat|nested] 53+ messages in thread

end of thread, other threads:[~2024-11-06 13:45 UTC | newest]

Thread overview: 53+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-10-25 18:21 [PATCH 00/17] Add more CORE-MATH on libm Adhemerval Zanella
2024-10-25 18:21 ` [PATCH 01/17] math: Add e_gammaf_r to glibc code and style Adhemerval Zanella
2024-10-29  2:58   ` DJ Delorie
2024-10-31 12:18     ` Adhemerval Zanella Netto
2024-10-25 18:21 ` [PATCH 02/17] benchtests: Add exp10m1f benchmark Adhemerval Zanella
2024-10-29 18:16   ` DJ Delorie
2024-10-25 18:21 ` [PATCH 03/17] benchtests: Add exp2m1f benchmark Adhemerval Zanella
2024-10-29 18:18   ` DJ Delorie
2024-10-25 18:21 ` [PATCH 04/17] benchtests: Add expm1f benchmark Adhemerval Zanella
2024-10-29 18:28   ` DJ Delorie
2024-10-31 12:39     ` Adhemerval Zanella Netto
2024-10-25 18:21 ` [PATCH 05/17] benchtests: Add log10f benchmark Adhemerval Zanella
2024-10-29 18:32   ` DJ Delorie
2024-10-25 18:21 ` [PATCH 06/17] benchtests: Add log2p1f benchmark Adhemerval Zanella
2024-10-29 18:57   ` DJ Delorie
2024-10-31 12:42     ` Adhemerval Zanella Netto
2024-10-25 18:21 ` [PATCH 07/17] benchtests: Add log1p benchmark Adhemerval Zanella
2024-10-29 19:02   ` DJ Delorie
2024-10-25 18:21 ` [PATCH 08/17] benchtests: Add log10p1f benchmark Adhemerval Zanella
2024-10-29 19:03   ` DJ Delorie
2024-10-25 18:21 ` [PATCH 09/17] math: Use exp10m1f from CORE-MATH Adhemerval Zanella
2024-10-29 21:09   ` DJ Delorie
2024-10-31 13:20     ` Adhemerval Zanella Netto
2024-11-04 10:37       ` Paul Zimmermann
2024-11-04 12:54         ` Adhemerval Zanella Netto
2024-11-06 10:29   ` Florian Weimer
2024-11-06 11:07     ` Paul Zimmermann
2024-11-06 13:45       ` Adhemerval Zanella Netto
2024-10-25 18:21 ` [PATCH 10/17] math: Use exp2m1f " Adhemerval Zanella
2024-10-29 21:24   ` DJ Delorie
2024-10-25 18:21 ` [PATCH 11/17] math: Use expm1f " Adhemerval Zanella
2024-10-30 19:27   ` DJ Delorie
2024-10-31 14:35     ` Adhemerval Zanella Netto
2024-10-25 18:21 ` [PATCH 12/17] math: Use log10f " Adhemerval Zanella
2024-10-31 20:42   ` DJ Delorie
2024-10-25 18:21 ` [PATCH 13/17] math: Use log2p1f " Adhemerval Zanella
2024-10-30 19:36   ` DJ Delorie
2024-10-31 14:37     ` Adhemerval Zanella Netto
2024-10-25 18:21 ` [PATCH 14/17] math: Use log1pf " Adhemerval Zanella
2024-10-25 19:12   ` Joseph Myers
2024-10-25 20:07     ` Adhemerval Zanella Netto
2024-10-31 21:20   ` DJ Delorie
2024-10-25 18:21 ` [PATCH 15/17] math: Use log10p1f " Adhemerval Zanella
2024-10-30 19:43   ` DJ Delorie
2024-10-25 18:21 ` [PATCH 16/17] x86_64: Add exp10m1f with FMA Adhemerval Zanella
2024-10-26 18:38   ` Noah Goldstein
2024-10-30 20:06   ` DJ Delorie
2024-10-25 18:21 ` [PATCH 17/17] x86_64: Add exp2m1f " Adhemerval Zanella
2024-10-25 19:10   ` Joseph Myers
2024-10-26 18:34   ` Noah Goldstein
2024-10-30 20:09   ` DJ Delorie
2024-10-26 18:28 ` [PATCH 00/17] Add more CORE-MATH on libm Noah Goldstein
2024-10-28 12:09   ` Adhemerval Zanella Netto

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).