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