aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--SHARED-FILES4
-rw-r--r--sysdeps/aarch64/libm-test-ulps8
-rw-r--r--sysdeps/alpha/fpu/libm-test-ulps8
-rw-r--r--sysdeps/arc/fpu/libm-test-ulps8
-rw-r--r--sysdeps/arc/nofpu/libm-test-ulps1
-rw-r--r--sysdeps/arm/libm-test-ulps8
-rw-r--r--sysdeps/csky/fpu/libm-test-ulps8
-rw-r--r--sysdeps/csky/nofpu/libm-test-ulps8
-rw-r--r--sysdeps/hppa/fpu/libm-test-ulps8
-rw-r--r--sysdeps/i386/fpu/libm-test-ulps6
-rw-r--r--sysdeps/i386/fpu/s_log1pf.S66
-rw-r--r--sysdeps/i386/i686/fpu/multiarch/libm-test-ulps6
-rw-r--r--sysdeps/ieee754/flt-32/s_log1pf.c271
-rw-r--r--sysdeps/ieee754/flt-32/w_log1pf.c1
-rw-r--r--sysdeps/loongarch/lp64/libm-test-ulps8
-rw-r--r--sysdeps/m68k/coldfire/fpu/libm-test-ulps6
-rw-r--r--sysdeps/m68k/m680x0/fpu/w_log1pf.c20
-rw-r--r--sysdeps/microblaze/libm-test-ulps2
-rw-r--r--sysdeps/mips/mips32/libm-test-ulps8
-rw-r--r--sysdeps/mips/mips64/libm-test-ulps8
-rw-r--r--sysdeps/nios2/libm-test-ulps2
-rw-r--r--sysdeps/or1k/nofpu/libm-test-ulps8
-rw-r--r--sysdeps/powerpc/fpu/libm-test-ulps8
-rw-r--r--sysdeps/powerpc/nofpu/libm-test-ulps8
-rw-r--r--sysdeps/riscv/nofpu/libm-test-ulps8
-rw-r--r--sysdeps/riscv/rvd/libm-test-ulps8
-rw-r--r--sysdeps/s390/fpu/libm-test-ulps8
-rw-r--r--sysdeps/sh/libm-test-ulps4
-rw-r--r--sysdeps/sparc/fpu/libm-test-ulps8
-rw-r--r--sysdeps/x86_64/fpu/libm-test-ulps8
30 files changed, 193 insertions, 340 deletions
diff --git a/SHARED-FILES b/SHARED-FILES
index 58ea318..7fa54a5 100644
--- a/SHARED-FILES
+++ b/SHARED-FILES
@@ -260,3 +260,7 @@ 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.
+sysdeps/ieee754/flt-32/s_log1pf.c
+ (file src/binary32/log1p/log1pf.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 cb1c18c..5700c71 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 09185dd..212c52c 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 d2ec67b..f73aae2 100644
--- a/sysdeps/arc/fpu/libm-test-ulps
+++ b/sysdeps/arc/fpu/libm-test-ulps
@@ -981,19 +981,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
@@ -1029,19 +1025,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 fe74fb8..f6d1ef0 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 b6b1941..502680f 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 3f17778..a7b2bec 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 fdef935..4e4451a 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 9f89528..b56f512 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 d0bd633..63ef356 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 82a3f44..0000000
--- 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 a97722b..f6393db 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 555f0f8..d1686e7 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 0000000..1cc8931
--- /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 b59d682..846ddb4 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 ae05498..8130d49 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 0000000..5f363cc
--- /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 a84494b..328e315 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 f1d0543..2ba46a0 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 fecd998..f73f95c 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 33f714e..5240767 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 6862551..c7ae0f0 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 f775c56..48a3ea1 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 a732166..ec91048 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 739d04b..0189fc5 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 f6bb6e0..a0b4376 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 b444d44..658752c 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 fc4556e..8562796 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 c7f8531..4c4d8ff 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 de19bf2..ef9ef51 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