11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* s_sinf.c -- float version of s_sin.c. 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Optimized by Bruce D. Evans. 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ==================================================== 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Developed at SunPro, a Sun Microsystems, Inc. business. 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * software is freely granted, provided that this notice 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * is preserved. 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ==================================================== 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char rcsid[] = "$FreeBSD: src/lib/msun/src/s_sinf.c,v 1.14 2005/11/28 06:15:10 bde Exp $"; 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math.h" 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define INLINE_KERNEL_COSDF 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define INLINE_KERNEL_SINDF 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math_private.h" 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "k_cosf.c" 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "k_sinf.c" 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Small multiples of pi/2 rounded to double precision. */ 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const double 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projects1pio2 = 1*M_PI_2, /* 0x3FF921FB, 0x54442D18 */ 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projects2pio2 = 2*M_PI_2, /* 0x400921FB, 0x54442D18 */ 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projects3pio2 = 3*M_PI_2, /* 0x4012D97C, 0x7F3321D2 */ 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projects4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */ 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfloat 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsinf(float x) 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project float y[2]; 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int32_t n, hx, ix; 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GET_FLOAT_WORD(hx,x); 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ix = hx & 0x7fffffff; 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix <= 0x3f490fda) { /* |x| ~<= pi/4 */ 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<0x39800000) /* |x| < 2**-12 */ 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(((int)x)==0) return x; /* x with inexact if x != 0 */ 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_sindf(x); 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<=0x407b53d1) { /* |x| ~<= 5*pi/4 */ 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<=0x4016cbe3) { /* |x| ~<= 3pi/4 */ 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(hx>0) 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_cosdf(x - s1pio2); 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return -__kernel_cosdf(x + s1pio2); 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_sindf((hx > 0 ? s2pio2 : -s2pio2) - x); 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<=0x40e231d5) { /* |x| ~<= 9*pi/4 */ 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<=0x40afeddf) { /* |x| ~<= 7*pi/4 */ 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(hx>0) 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return -__kernel_cosdf(x - s3pio2); 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_cosdf(x + s3pio2); 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_sindf(x + (hx > 0 ? -s4pio2 : s4pio2)); 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>=0x7f800000) return x-x; 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* general argument reduction needed */ 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else { 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = __ieee754_rem_pio2f(x,y); 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch(n&3) { 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 0: return __kernel_sindf((double)y[0]+y[1]); 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 1: return __kernel_cosdf((double)y[0]+y[1]); 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 2: return __kernel_sindf(-(double)y[0]-y[1]); 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return -__kernel_cosdf((double)y[0]+y[1]); 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 83