[Commit] nickle ChangeLog,1.139,1.140 math.5c,1.42,1.43

Keith Packard commit at keithp.com
Thu Dec 1 08:15:34 PST 2005


Committed by: keithp

Update of /local/src/CVS/nickle
In directory home.keithp.com:/tmp/cvs-serv15686

Modified Files:
	ChangeLog math.5c 
Log Message:
2005-12-01  Keith Packard  <keithp at keithp.com>

	* math.5c:
	cbrt must use more intermediate precision to hit the
	specified error bound


Index: ChangeLog
===================================================================
RCS file: /local/src/CVS/nickle/ChangeLog,v
retrieving revision 1.139
retrieving revision 1.140
diff -u -d -r1.139 -r1.140
--- ChangeLog	20 Nov 2005 08:49:33 -0000	1.139
+++ ChangeLog	1 Dec 2005 16:15:31 -0000	1.140
@@ -1,3 +1,9 @@
+2005-12-01  Keith Packard  <keithp at keithp.com>
+
+	* math.5c:
+	cbrt must use more intermediate precision to hit the
+	specified error bound
+
 2005-11-20  Bart Massey <bart at cs.pdx.edu>
 
         * process.5c:

Index: math.5c
===================================================================
RCS file: /local/src/CVS/nickle/math.5c,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -d -r1.42 -r1.43
--- math.5c	5 Jun 2005 01:03:42 -0000	1.42
+++ math.5c	1 Dec 2005 16:15:31 -0000	1.43
@@ -64,23 +64,22 @@
     {
 	real real_cbrt(real v)
 	{
-	    real	err;
 	    real	prev, cur;
-	    int	n;
-	    int	s;
-
-	    s = sign (v);
+	    
+	    int s = sign (v);
 	    v = imprecise (abs (v));
-	    err = 1/(2**(precision (v)+3));
-	    prev = imprecise (1 / (0.75 * 2**(floor (exponent(v)/3))), precision(v));
-	    for (;;)
-	    {
-		cur = 1/3 * (2 * prev + v / prev**2);
-		if (abs (cur - prev) < err)
-		    break;
+	    int result_bits = precision (v);
+	    int intermediate_bits = result_bits + 10;
+	    v = imprecise (v, intermediate_bits);
+	    real err = imprecise (1/(2**(result_bits+3)), intermediate_bits);
+
+	    cur = imprecise (1 / (0.75 * 2**(floor (exponent(v)/3))),
+			     intermediate_bits);
+	    do {
 		prev = cur;
-	    }
-	    return s * abs (cur);
+		cur = 1/3 * (2 * prev + v / prev**2);
+	    } while (abs (cur - prev) > err);
+	    return s * imprecise (abs (cur), result_bits);
 	}
 
 	if (is_rational (v))



More information about the Commit mailing list