11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* @(#)s_sin.c 5.1 93/09/24 */ 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ==================================================== 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Developed at SunPro, a Sun Microsystems, Inc. business. 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * software is freely granted, provided that this notice 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * is preserved. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ==================================================== 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char rcsid[] = "$FreeBSD: src/lib/msun/src/s_sin.c,v 1.10 2005/10/24 14:08:36 bde Exp $"; 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* sin(x) 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return sine function of x. 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * kernel function: 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * __kernel_sin ... sine function on [-pi/4,pi/4] 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * __kernel_cos ... cose function on [-pi/4,pi/4] 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * __ieee754_rem_pio2 ... argument reduction routine 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Method. 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Let S,C and T denote the sin, cos and tan respectively on 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * in [-pi/4 , +pi/4], and let n = k mod 4. 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * We have 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * n sin(x) cos(x) tan(x) 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ---------------------------------------------------------- 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 0 S C T 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1 C -S -1/T 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2 -S -C T 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 3 -C S -1/T 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ---------------------------------------------------------- 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Special cases: 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Let trig be any of sin, cos, or tan. 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * trig(+-INF) is NaN, with signals; 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * trig(NaN) is that NaN; 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Accuracy: 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * TRIG(x) returns trig(x) nearly rounded 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math.h" 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math_private.h" 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdouble 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsin(double x) 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project double y[2],z=0.0; 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int32_t n, ix; 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* High word of x. */ 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GET_HIGH_WORD(ix,x); 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* |x| ~< pi/4 */ 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ix &= 0x7fffffff; 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix <= 0x3fe921fb) { 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<0x3e400000) /* |x| < 2**-27 */ 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project {if((int)x==0) return x;} /* generate inexact */ 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_sin(x,z,0); 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* sin(Inf or NaN) is NaN */ 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (ix>=0x7ff00000) return x-x; 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* argument reduction needed */ 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else { 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = __ieee754_rem_pio2(x,y); 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch(n&3) { 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 0: return __kernel_sin(y[0],y[1],1); 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 1: return __kernel_cos(y[0],y[1]); 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 2: return -__kernel_sin(y[0],y[1],1); 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return -__kernel_cos(y[0],y[1]); 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 83