11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* s_cosf.c -- float version of s_cos.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_cosf.c,v 1.15 2005/11/30 06:47:18 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 Projectc1pio2 = 1*M_PI_2, /* 0x3FF921FB, 0x54442D18 */ 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectc2pio2 = 2*M_PI_2, /* 0x400921FB, 0x54442D18 */ 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectc3pio2 = 3*M_PI_2, /* 0x4012D97C, 0x7F3321D2 */ 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectc4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */ 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfloat 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectcosf(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 1.0; /* 1 with inexact if x != 0 */ 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_cosdf(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| ~> 3*pi/4 */ 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return -__kernel_cosdf(x + (hx > 0 ? -c2pio2 : c2pio2)); 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else { 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(hx>0) 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_sindf(c1pio2 - x); 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_sindf(x + c1pio2); 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<=0x40e231d5) { /* |x| ~<= 9*pi/4 */ 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix>0x40afeddf) /* |x| ~> 7*pi/4 */ 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_cosdf(x + (hx > 0 ? -c4pio2 : c4pio2)); 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else { 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(hx>0) 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_sindf(x - c3pio2); 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_sindf(-c3pio2 - x); 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* cos(Inf or NaN) is NaN */ 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (ix>=0x7f800000) return x-x; 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* general argument reduction needed */ 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else { 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = __ieee754_rem_pio2f(x,y); 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project switch(n&3) { 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 0: return __kernel_cosdf((double)y[0]+y[1]); 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 1: return __kernel_sindf(-(double)y[0]-y[1]); 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project case 2: return -__kernel_cosdf((double)y[0]+y[1]); 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project default: 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_sindf((double)y[0]+y[1]); 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 85