* [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).