summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/msun/src/s_cbrtf.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/lib/msun/src/s_cbrtf.c b/lib/msun/src/s_cbrtf.c
index 4ed4351..882ed0a 100644
--- a/lib/msun/src/s_cbrtf.c
+++ b/lib/msun/src/s_cbrtf.c
@@ -1,5 +1,6 @@
/* s_cbrtf.c -- float version of s_cbrt.c.
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ * Debugged by Bruce D. Evans.
*/
/*
@@ -37,7 +38,7 @@ G = 3.5714286566e-01; /* 5/14 = 0x3eb6db6e */
float
cbrtf(float x)
{
- float r,s,t;
+ float r,s,t,w;
int32_t hx;
u_int32_t sign;
u_int32_t high;
@@ -64,6 +65,17 @@ cbrtf(float x)
s=C+r*t;
t*=G+F/(s+E+D/s);
+ /* chop t to 12 bits and make it larger than cbrt(x) */
+ GET_FLOAT_WORD(high,t);
+ SET_FLOAT_WORD(t,high+0x00001000);
+
+ /* one step Newton iteration to 24 bits with error less than 0.984 ulps */
+ s=t*t; /* t*t is exact */
+ r=x/s;
+ w=t+t;
+ r=(r-t)/(w+r); /* r-t is exact */
+ t=t+t*r;
+
/* retore the sign bit */
GET_FLOAT_WORD(high,t);
SET_FLOAT_WORD(t,high|sign);
OpenPOWER on IntegriCloud