|
|
1.1 ! root 1: /* ! 2: * libm/cos.c ! 3: * Evaluate the cosine function. ! 4: */ ! 5: ! 6: #include <math.h> ! 7: ! 8: #if EMU87 ! 9: #include "emumath.h" ! 10: #endif ! 11: ! 12: /* ! 13: * (Hart 2923, 19.96) ! 14: */ ! 15: static readonly double sintab[] ={ ! 16: 0.523598775598298873071308e+00, ! 17: -0.239245962039350458667960e-01, ! 18: 0.327953194428661969081000e-03, ! 19: -0.214071976918198811800000e-05, ! 20: 0.815125650404748400000000e-08, ! 21: -0.203153509377510000000000e-10, ! 22: 0.355397103280000000000000e-13 ! 23: }; ! 24: ! 25: /* ! 26: * (Hart 3824, 19.45) ! 27: */ ! 28: static readonly double costab[] ={ ! 29: 0.99999999999999999996415, ! 30: -0.30842513753404245242414, ! 31: 0.01585434424381541089754, ! 32: -0.00032599188692668755044, ! 33: 0.00000359086044588581953, ! 34: -0.00000002461136382637005, ! 35: 0.00000000011500497024263, ! 36: -0.00000000000038577620372 ! 37: }; ! 38: ! 39: double ! 40: cos(x) double x; ! 41: { ! 42: double r; ! 43: register int s; ! 44: ! 45: if ((x = modf(x/(2.0*PI), &r)) < 0.0) { ! 46: x += 1.0; ! 47: r -= 1.0; ! 48: } ! 49: s = 0; ! 50: if (x > 0.5) { ! 51: s = 1; ! 52: x -= 0.5; ! 53: } ! 54: if (x > 0.25) { ! 55: s ^= 1; ! 56: x = 0.5 - x; ! 57: } ! 58: if (x > 0.125) { ! 59: x = 3.0 - 12.0*x; ! 60: r = x*_pol(x*x, sintab, 7); ! 61: } else { ! 62: x *= 8.0; ! 63: r = _pol(x*x, costab, 8); ! 64: } ! 65: return s ? -r : r; ! 66: } ! 67: ! 68: /* end of libm/cos.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.