|
|
1.1 ! root 1: /* @(#)sin.c 4.1/4.2 10/31/84 CCI-CPG */ ! 2: ! 3: ! 4: /* ! 5: * Double-precision floating point sin/cos function. ! 6: * Calls modf. ! 7: * Pn coefficients are #3345 from Hart & etc.(18.79D). ! 8: * ! 9: * New version by Les Powers (3/26/85). ! 10: */ ! 11: ! 12: ! 13: static double twoopi = 0.63661977236758134308; ! 14: static double piotwo = 3.14159265358979323846264338327950288419716939937511/2.; ! 15: static double piotwols = .572118872610983179676266255859012e-17; ! 16: static double piofour = 3.14159265358979323846264338327950288419716939937511/4.; ! 17: static double threepio4 = 3.14159265358979323846264338327950288419716939937511*.75; ! 18: ! 19: ! 20: static double p0 = .15707963267948966188272e1; ! 21: static double p1 = -.64596409750624619108547e0; ! 22: static double p2 = .7969262624616543562977e-1; ! 23: static double p3 = -.468175413530264260121e-2; ! 24: static double p4 = .1604411847068220716e-3; ! 25: static double p5 = -.359884300720869272e-5; ! 26: static double p6 = .5692134872719023e-7; ! 27: static double p7 = -.66843217206396e-9; ! 28: static double p8 = .587061098171e-11; ! 29: ! 30: /* ! 31: * Sn coefficients are #3043 from Hart & etc.(17.48D). ! 32: * Cn coefficients are #3824 from Hart & etc.(19.45D). ! 33: * The coefficients are multiplied by the appropriate power ! 34: * of 4/pi using binary calculator with 40 digit arithmetic. ! 35: * The following statements in comments indicate the ! 36: * operations originally used to generate the coefficients. ! 37: * ! 38: * #define FP (4/3.14159265358979323846264338327950288419716939937511) ! 39: * #define FS FP*FP ! 40: * ! 41: * static double s0 = .785398163397448307014e0*FP; ! 42: * static double s1 = -.80745512188280530192e-1*FP*FS; ! 43: * static double s2 = .2490394570188736117e-2*FP*FS*FS; ! 44: * static double s3 = -.36576204158455695e-4*FP*FS*FS*FS; ! 45: * static double s4 = .313361621661904e-6*FP*FS*FS*FS*FS; ! 46: * static double s5 = -.1757149292755e-8*FP*FS*FS*FS*FS*FS; ! 47: * static double s6 = .6877100349e-11*FP*FS*FS*FS*FS*FS*FS; ! 48: * ! 49: * static double c0 = .99999999999999999996415e0; ! 50: * static double c1 = -.30842513753404245242414e0*FS; ! 51: * static double c2 = .1585434424381541089754e-1*FS*FS; ! 52: * static double c3 = -.32599188692668755044e-3*FS*FS*FS; ! 53: * static double c4 = .359086044588581953e-5*FS*FS*FS*FS; ! 54: * static double c5 = -.2461136382637005e-7*FS*FS*FS*FS*FS; ! 55: * static double c6 = .11500497024263e-9*FS*FS*FS*FS*FS*FS; ! 56: * static double c7 = -.38577620372e-12*FS*FS*FS*FS*FS*FS*FS; ! 57: */ ! 58: ! 59: static double s0 = .9999999999999999966874625291130031549274; ! 60: static double s1 = -.1666666666666661475150697663344387409506; ! 61: static double s2 = .0083333333333200019685518812023464185712; ! 62: static double s3 = -.0001984126982840175394529286095367983768; ! 63: static double s4 = .0000027557313298885682473645051747116530; ! 64: static double s5 = -.0000000250507058263681718011320436448899; ! 65: static double s6 = .0000000001589413523004632819499530093565; ! 66: ! 67: static double c0 = 0.99999999999999999996415; ! 68: static double c1 = -.4999999999999999928435829208978050890709; ! 69: static double c2 = .0416666666666664302573692446884954307432; ! 70: static double c3 = -.0013888888888858960434395194724966502603; ! 71: static double c4 = .0000248015872828994630247806807330993132; ! 72: static double c5 = -.0000002755731286569608222434728722627332; ! 73: static double c6 = .0000000020875555145677882874779379760684; ! 74: static double c7 = -.0000000000113521232057839395845871741059; ! 75: ! 76: ! 77: double ! 78: cos(arg) ! 79: double arg; ! 80: { ! 81: double sinus(); ! 82: double s; ! 83: union { ! 84: double d; ! 85: unsigned i; ! 86: } u; ! 87: if ( arg < 0 ) ! 88: arg = -arg; ! 89: u.d = arg; ! 90: if ( u.i < 0x40490fdb ) { /* arg < pi * 1/4 */ ! 91: s = arg * arg; ! 92: return(c0+s*(c1+s*(c2+s*(c3+s*(c4+s*(c5+s*(c6+s*c7))))))); ! 93: } ! 94: if ( u.i < 0x4116cbe3 ) { /* arg < pi * 3/4 */ ! 95: arg = (piotwo - arg)+piotwols; ! 96: s = arg * arg; ! 97: return(arg*(s0+s*(s1+s*(s2+s*(s3+s*(s4+s*(s5+s*s6))))))); ! 98: } ! 99: return(sinus(arg, 1)); ! 100: } ! 101: ! 102: double ! 103: sin(arg) ! 104: double arg; ! 105: { ! 106: double sinus(); ! 107: double s; ! 108: union { ! 109: double d; ! 110: unsigned i; ! 111: } u; ! 112: if ( arg < 0 ) ! 113: return( -sin(-arg) ); ! 114: u.d = arg; ! 115: if ( u.i < 0x40490fdb ) { /* arg < pi * 1/4 */ ! 116: s = arg * arg; ! 117: return(arg*(s0+s*(s1+s*(s2+s*(s3+s*(s4+s*(s5+s*s6))))))); ! 118: } ! 119: if ( u.i < 0x4116cbe3 ) { /* arg < pi * 3/4 */ ! 120: arg = (piotwo - arg)+piotwols; ! 121: s = arg * arg; ! 122: return(c0+s*(c1+s*(c2+s*(c3+s*(c4+s*(c5+s*(c6+s*c7))))))); ! 123: } ! 124: return(sinus(arg, 0)); ! 125: } ! 126: ! 127: static double ! 128: sinus(arg, quad) ! 129: double arg; ! 130: int quad; ! 131: { ! 132: double modf(); ! 133: double e, f; ! 134: double ysq; ! 135: double x,y; ! 136: int k; ! 137: double temp1, temp2; ! 138: ! 139: x = arg; ! 140: if(x < 0) { ! 141: x = -x; ! 142: quad = quad + 2; ! 143: } ! 144: x = x * twoopi; /*underflow?*/ ! 145: if (x > 32764){ ! 146: y = modf(x,&e); ! 147: e = e + quad; ! 148: modf(0.25 * e,&f); ! 149: quad = e - 4 * f; ! 150: }else{ ! 151: k = x; ! 152: y = x - k; ! 153: quad = (quad + k) & 03; ! 154: } ! 155: if (quad & 01) ! 156: y = 1-y; ! 157: if (quad > 1) ! 158: y = -y; ! 159: ! 160: ysq = y * y; ! 161: temp1 = ((((((((p8*ysq+p7)*ysq+p6)*ysq+p5)*ysq+p4)*ysq+ ! 162: p3)*ysq+p2)*ysq+p1)*ysq+p0); ! 163: return(temp1 * y); ! 164: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.