11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* e_rem_pio2f.c -- float version of e_rem_pio2.c
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Debugged and 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/e_rem_pio2f.c,v 1.19 2005/11/23 03:03:09 bde Exp $";
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* __ieee754_rem_pio2f(x,y)
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * return the remainder of x rem pi/2 in y[0]+y[1]
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * use double precision internally
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * use __kernel_rem_pio2() for large x
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math.h"
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math_private.h"
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const int32_t two_over_pi[] = {
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project};
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * invpio2:  53 bits of 2/pi
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * pio2_1:   first  33 bit of pi/2
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * pio2_1t:  pi/2 - pio2_1
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const double
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectzero =  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecthalf =  5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecttwo24 =  1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectinvpio2 =  6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectpio2_1  =  1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectpio2_1t =  6.07710050650619224932e-11; /* 0x3DD0B461, 0x1A626331 */
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int32_t __ieee754_rem_pio2f(float x, float *y)
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	double w,t,r,fn;
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	double tx[1],ty[2];
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	float z;
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int32_t e0,n,ix,hx;
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	GET_FLOAT_WORD(hx,x);
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	ix = hx&0x7fffffff;
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    /* 33+53 bit pi is good enough for medium size */
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if(ix<=0x49490f80) {		/* |x| ~<= 2^19*(pi/2), medium size */
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    t  = fabsf(x);
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    n  = (int32_t) (t*invpio2+half);
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    fn = (double)n;
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    r  = t-fn*pio2_1;
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    w  = fn*pio2_1t;
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    y[0] = r-w;
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    y[1] = (r-y[0])-w;
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    if(hx<0) 	{y[0] = -y[0]; y[1] = -y[1]; return -n;}
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    else	 return n;
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    /*
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project     * all other (large) arguments
851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project     */
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if(ix>=0x7f800000) {		/* x is inf or NaN */
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    y[0]=y[1]=x-x; return 0;
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project    /* set z = scalbn(|x|,ilogb(|x|)-23) */
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	e0 = (ix>>23)-150;		/* e0 = ilogb(|x|)-23; */
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	SET_FLOAT_WORD(z, ix - ((int32_t)(e0<<23)));
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	tx[0] = z;
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	n  =  __kernel_rem_pio2(tx,ty,e0,1,1,two_over_pi);
941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	y[0] = ty[0];
951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	y[1] = ty[0] - y[0];
961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;}
971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	return n;
981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
99