|
|
1.1 root 1: /*
2: * Copyright (c) 1985 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: *
17: * All recipients should regard themselves as participants in an ongoing
18: * research project and hence should feel obligated to report their
19: * experiences (good or bad) with these elementary function codes, using
20: * the sendbug(8) program, to the authors.
21: */
22:
23: #ifndef lint
24: static char sccsid[] = "@(#)cbrt.c 5.4 (Berkeley) 6/30/88";
25: #endif /* not lint */
26:
27: /* kahan's cube root (53 bits IEEE double precision)
28: * for IEEE machines only
29: * coded in C by K.C. Ng, 4/30/85
30: *
31: * Accuracy:
32: * better than 0.667 ulps according to an error analysis. Maximum
33: * error observed was 0.666 ulps in an 1,000,000 random arguments test.
34: *
35: * Warning: this code is semi machine dependent; the ordering of words in
36: * a floating point number must be known in advance. I assume that the
37: * long interger at the address of a floating point number will be the
38: * leading 32 bits of that floating point number (i.e., sign, exponent,
39: * and the 20 most significant bits).
40: * On a National machine, it has different ordering; therefore, this code
41: * must be compiled with flag -DNATIONAL.
42: */
43: #if !defined(vax)&&!defined(tahoe)
44:
45: static unsigned long B1 = 715094163, /* B1 = (682-0.03306235651)*2**20 */
46: B2 = 696219795; /* B2 = (664-0.03306235651)*2**20 */
47: static double
48: C= 19./35.,
49: D= -864./1225.,
50: E= 99./70.,
51: F= 45./28.,
52: G= 5./14.;
53:
54: double cbrt(x)
55: double x;
56: {
57: double r,s,t=0.0,w;
58: unsigned long *px = (unsigned long *) &x,
59: *pt = (unsigned long *) &t,
60: mexp,sign;
61:
62: #ifdef national /* ordering of words in a floating points number */
63: int n0=1,n1=0;
64: #else /* national */
65: int n0=0,n1=1;
66: #endif /* national */
67:
68: mexp=px[n0]&0x7ff00000;
69: if(mexp==0x7ff00000) return(x); /* cbrt(NaN,INF) is itself */
70: if(x==0.0) return(x); /* cbrt(0) is itself */
71:
72: sign=px[n0]&0x80000000; /* sign= sign(x) */
73: px[n0] ^= sign; /* x=|x| */
74:
75:
76: /* rough cbrt to 5 bits */
77: if(mexp==0) /* subnormal number */
78: {pt[n0]=0x43500000; /* set t= 2**54 */
79: t*=x; pt[n0]=pt[n0]/3+B2;
80: }
81: else
82: pt[n0]=px[n0]/3+B1;
83:
84:
85: /* new cbrt to 23 bits, may be implemented in single precision */
86: r=t*t/x;
87: s=C+r*t;
88: t*=G+F/(s+E+D/s);
89:
90: /* chopped to 20 bits and make it larger than cbrt(x) */
91: pt[n1]=0; pt[n0]+=0x00000001;
92:
93:
94: /* one step newton iteration to 53 bits with error less than 0.667 ulps */
95: s=t*t; /* t*t is exact */
96: r=x/s;
97: w=t+t;
98: r=(r-t)/(w+r); /* r-t is exact */
99: t=t+t*r;
100:
101:
102: /* retore the sign bit */
103: pt[n0] |= sign;
104: return(t);
105: }
106: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.