11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* s_tanf.c -- float version of s_tan.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_tanf.c,v 1.14 2005/11/28 05:35:32 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_TANDF 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math_private.h" 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "k_tanf.c" 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Small multiples of pi/2 rounded to double precision. */ 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const double 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectt1pio2 = 1*M_PI_2, /* 0x3FF921FB, 0x54442D18 */ 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectt2pio2 = 2*M_PI_2, /* 0x400921FB, 0x54442D18 */ 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectt3pio2 = 3*M_PI_2, /* 0x4012D97C, 0x7F3321D2 */ 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectt4pio2 = 4*M_PI_2; /* 0x401921FB, 0x54442D18 */ 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfloat 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttanf(float x) 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project float y[2]; 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int32_t n, hx, ix; 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GET_FLOAT_WORD(hx,x); 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ix = hx & 0x7fffffff; 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix <= 0x3f490fda) { /* |x| ~<= pi/4 */ 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<0x39800000) /* |x| < 2**-12 */ 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(((int)x)==0) return x; /* x with inexact if x != 0 */ 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_tandf(x,1); 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<=0x407b53d1) { /* |x| ~<= 5*pi/4 */ 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<=0x4016cbe3) /* |x| ~<= 3pi/4 */ 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_tandf(x + (hx>0 ? -t1pio2 : t1pio2), -1); 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_tandf(x + (hx>0 ? -t2pio2 : t2pio2), 1); 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<=0x40e231d5) { /* |x| ~<= 9*pi/4 */ 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<=0x40afeddf) /* |x| ~<= 7*pi/4 */ 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_tandf(x + (hx>0 ? -t3pio2 : t3pio2), -1); 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_tandf(x + (hx>0 ? -t4pio2 : t4pio2), 1); 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* tan(Inf or NaN) is NaN */ 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (ix>=0x7f800000) return x-x; 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* general argument reduction needed */ 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else { 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project n = __ieee754_rem_pio2f(x,y); 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* integer parameter: 1 -- n even; -1 -- n odd */ 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return __kernel_tandf((double)y[0]+y[1],1-((n&1)<<1)); 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 70