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