|
|
1.1 ! root 1: /* @(#)log.c 4.1 12/25/82 */ ! 2: ! 3: /* ! 4: * log returns the natural logarithm of its floating ! 5: * point argument. ! 6: * ! 7: * New version by Les Powers (3/31/85). ! 8: */ ! 9: ! 10: ! 11: #include <errno.h> ! 12: #include <math.h> ! 13: #include "logd.h" ! 14: ! 15: ! 16: static double log2 = 0.693147180559945309e0; ! 17: static double recip_ln10 = 1./2.302585092994045684; ! 18: static double p1 = 1.; ! 19: static double p2 = -.5; ! 20: static double p3 = 1./3.; ! 21: static double p4 = -1./4.; ! 22: ! 23: int errno; ! 24: ! 25: ! 26: double ! 27: log(arg) ! 28: double arg; ! 29: { ! 30: double z; ! 31: union { ! 32: double d; ! 33: struct { ! 34: unsigned i0; ! 35: unsigned i1; ! 36: } i; ! 37: struct { ! 38: unsigned char b0; ! 39: unsigned char b1; ! 40: unsigned char b2; ! 41: unsigned char b3; ! 42: } b; ! 43: } f0,f1,a0; ! 44: register int ta1; ! 45: if (arg <= 0.) { ! 46: errno = EDOM; ! 47: return(-HUGE); ! 48: } ! 49: f1.d = arg; ! 50: f0.i.i0 = f1.i.i0 + f1.i.i0; ! 51: if ( f1.i.i0 >= 0x40800000 ) { ! 52: f1.i.i0 = (f1.i.i0 & 0x007fffff) | 0x40800000; ! 53: a0.i.i0 = f1.i.i0 & 0x40ff8000; ! 54: a0.i.i1 = 0; ! 55: f1.d = (f1.d - a0.d) * rp0[f0.b.b1]; ! 56: ta1 = f1.d; ! 57: z = (f1.d - ta1) * rp1[ta1]; ! 58: return( z*(p1+z*(p2+z*(p3+z*p4))) + ! 59: lp1[ta1] + lp0[f0.b.b1] + le[f0.b.b0] ); ! 60: } ! 61: else { ! 62: f1.i.i0 = (f1.i.i0 & 0x007fffff) | 0x40000000; ! 63: a0.i.i0 = (f1.i.i0 & 0x40ff8000) + 0x00008000; ! 64: a0.i.i1 = 0; ! 65: f1.d = (a0.d - f1.d) * rn0[f0.b.b1]; ! 66: ta1 = f1.d; ! 67: z = (ta1-f1.d) * rn1[ta1]; ! 68: return( z*(p1+z*(p2+z*(p3+z*p4))) + ! 69: ln1[ta1] + ln0[f0.b.b1] + le[f0.b.b0] ); ! 70: } ! 71: } ! 72: ! 73: double ! 74: log10(arg) ! 75: double arg; ! 76: { ! 77: return(log(arg)*recip_ln10); ! 78: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.