1b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 2b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* @(#)s_sin.c 1.3 95/01/18 */ 3b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* 4b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ==================================================== 5b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 6b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 7b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Developed at SunSoft, a Sun Microsystems, Inc. business. 8b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Permission to use, copy, modify, and distribute this 9b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * software is freely granted, provided that this notice 10b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * is preserved. 11b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ==================================================== 12b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project */ 13b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 14b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* ieee_sin(x) 15b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Return sine function of x. 16b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 17b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * kernel function: 18b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * __kernel_sin ... sine function on [-pi/4,pi/4] 19b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * __kernel_cos ... cose function on [-pi/4,pi/4] 20b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * __ieee754_rem_pio2 ... argument reduction routine 21b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 22b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Method. 23b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Let S,C and T denote the sin, cos and tan respectively on 24b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2 25b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * in [-pi/4 , +pi/4], and let n = k mod 4. 26b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * We have 27b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 28b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * n ieee_sin(x) ieee_cos(x) ieee_tan(x) 29b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ---------------------------------------------------------- 30b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 0 S C T 31b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 1 C -S -1/T 32b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 2 -S -C T 33b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 3 -C S -1/T 34b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ---------------------------------------------------------- 35b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 36b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Special cases: 37b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Let trig be any of sin, cos, or tan. 38b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * trig(+-INF) is NaN, with signals; 39b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * trig(NaN) is that NaN; 40b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 41b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Accuracy: 42b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * TRIG(x) returns trig(x) nearly rounded 43b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project */ 44b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 45b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#include "fdlibm.h" 46b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 47b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#ifdef __STDC__ 48b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double ieee_sin(double x) 49b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#else 50b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double ieee_sin(x) 51b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double x; 52b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#endif 53b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project{ 54b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double y[2],z=0.0; 55b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project int n, ix; 56b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 57b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project /* High word of x. */ 58b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project ix = __HI(x); 59b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 60b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project /* |x| ~< pi/4 */ 61b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project ix &= 0x7fffffff; 62b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0); 63b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 64b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project /* ieee_sin(Inf or NaN) is NaN */ 65b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project else if (ix>=0x7ff00000) return x-x; 66b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 67b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project /* argument reduction needed */ 68b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project else { 69b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project n = __ieee754_rem_pio2(x,y); 70b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project switch(n&3) { 71b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project case 0: return __kernel_sin(y[0],y[1],1); 72b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project case 1: return __kernel_cos(y[0],y[1]); 73b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project case 2: return -__kernel_sin(y[0],y[1],1); 74b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project default: 75b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project return -__kernel_cos(y[0],y[1]); 76b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project } 77b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project } 78b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project} 79