Module Name: src
Committed By: christos
Date: Wed Apr 3 01:51:02 UTC 2024
Modified Files:
src/lib/libm/src: s_cbrtl.c
Log Message:
reduce diff with FreeBSD
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/lib/libm/src/s_cbrtl.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libm/src/s_cbrtl.c
diff -u src/lib/libm/src/s_cbrtl.c:1.1 src/lib/libm/src/s_cbrtl.c:1.2
--- src/lib/libm/src/s_cbrtl.c:1.1 Tue Nov 19 14:24:34 2013
+++ src/lib/libm/src/s_cbrtl.c Tue Apr 2 21:51:01 2024
@@ -13,12 +13,9 @@
* written by Steven G. Kargl with input from Bruce D. Evans
* and David A. Schultz.
*/
-
#include <sys/cdefs.h>
-__RCSID("$NetBSD: s_cbrtl.c,v 1.1 2013/11/19 19:24:34 joerg Exp $");
-#if 0
-__FBSDID("$FreeBSD: head/lib/msun/src/s_cbrtl.c 238924 2012-07-30 21:58:28Z kargl $");
-#endif
+__RCSID("$NetBSD: s_cbrtl.c,v 1.2 2024/04/03 01:51:01 christos Exp $");
+
#include "namespace.h"
#include <machine/ieee.h>
@@ -30,44 +27,48 @@ __FBSDID("$FreeBSD: head/lib/msun/src/s_
#ifdef __HAVE_LONG_DOUBLE
__weak_alias(cbrtl, _cbrtl)
+#define BIAS (LDBL_MAX_EXP - 1)
+
static const unsigned
B1 = 709958130; /* B1 = (127-127.0/3-0.03306235651)*2**23 */
long double
cbrtl(long double x)
{
- union ieee_ext_u ux, vx;
+ union ieee_ext_u u, v;
long double r, s, t, w;
double dr, dt, dx;
float ft, fx;
uint32_t hx;
+ uint16_t expsign;
int k;
- ux.extu_ld = x;
-
+ u.extu_ld = x;
+ expsign = GET_EXPSIGN(&u);
+ k = expsign & 0x7fff;
/*
* If x = +-Inf, then cbrt(x) = +-Inf.
* If x = NaN, then cbrt(x) = NaN.
*/
- if (ux.extu_exp == EXT_EXP_INFNAN)
+ if (k == BIAS + LDBL_MAX_EXP)
return (x + x);
- if ((ux.extu_frach | ux.extu_fracl | ux.extu_exp) == 0)
- return (x);
- vx.extu_ld = 1;
- vx.extu_ext.ext_sign = ux.extu_ext.ext_sign;
- ux.extu_ext.ext_sign = 0;
- if (ux.extu_exp == 0) {
+ ENTERI();
+ if (k == 0) {
+ /* If x = +-0, then cbrt(x) = +-0. */
+ if ((u.extu_frach | u.extu_fracl) == 0)
+ RETURNI(x);
/* Adjust subnormal numbers. */
- ux.extu_ld *= 0x1.0p514;
- k = ux.extu_exp - EXT_EXP_BIAS - 514;
- } else {
- k = ux.extu_exp - EXT_EXP_BIAS;
- }
+ u.extu_ld *= 0x1.0p514;
+ k = u.extu_exp;
+ k -= BIAS + 514;
+ } else
+ k -= BIAS;
+ SET_EXPSIGN(&u, BIAS);
+ v.extu_ld = 1;
- ux.extu_exp = EXT_EXP_BIAS;
- x = ux.extu_ld;
+ x = u.extu_ld;
switch (k % 3) {
case 1:
case -2:
@@ -80,7 +81,7 @@ cbrtl(long double x)
k -= 2;
break;
}
- vx.extu_exp = EXT_EXP_BIAS + k / 3;
+ SET_EXPSIGN(&v, (expsign & 0x8000) | (BIAS + k / 3));
/*
* The following is the guts of s_cbrtf, with the handling of
@@ -136,10 +137,9 @@ cbrtl(long double x)
r=x/s; /* error <= 0.5 ulps; |r| < |t| */
w=t+t; /* t+t is exact */
r=(r-t)/(w+r); /* r-t is exact; w+r ~= 3*t */
- t=t+t*r; /* error <= 0.5 + 0.5/3 + epsilon */
+ t=t+t*r; /* error <= (0.5 + 0.5/3) * ulp */
- t *= vx.extu_ld;
- return t;
+ t *= v.extu_ld;
+ RETURNI(t);
}
-
#endif /* __HAVE_LONG_DOUBLE */