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