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