13a8617a8SJordan K. Hubbard /* k_cosf.c -- float version of k_cos.c 23a8617a8SJordan K. Hubbard * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. 33a8617a8SJordan K. Hubbard */ 43a8617a8SJordan K. Hubbard 53a8617a8SJordan K. Hubbard /* 63a8617a8SJordan K. Hubbard * ==================================================== 73a8617a8SJordan K. Hubbard * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 83a8617a8SJordan K. Hubbard * 93a8617a8SJordan K. Hubbard * Developed at SunPro, a Sun Microsystems, Inc. business. 103a8617a8SJordan K. Hubbard * Permission to use, copy, modify, and distribute this 113a8617a8SJordan K. Hubbard * software is freely granted, provided that this notice 123a8617a8SJordan K. Hubbard * is preserved. 133a8617a8SJordan K. Hubbard * ==================================================== 143a8617a8SJordan K. Hubbard */ 153a8617a8SJordan K. Hubbard 163a8617a8SJordan K. Hubbard #ifndef lint 173a8617a8SJordan K. Hubbard static char rcsid[] = "$Id: k_cosf.c,v 1.2 1994/08/18 23:06:10 jtc Exp $"; 183a8617a8SJordan K. Hubbard #endif 193a8617a8SJordan K. Hubbard 203a8617a8SJordan K. Hubbard #include "math.h" 213a8617a8SJordan K. Hubbard #include "math_private.h" 223a8617a8SJordan K. Hubbard 233a8617a8SJordan K. Hubbard #ifdef __STDC__ 243a8617a8SJordan K. Hubbard static const float 253a8617a8SJordan K. Hubbard #else 263a8617a8SJordan K. Hubbard static float 273a8617a8SJordan K. Hubbard #endif 283a8617a8SJordan K. Hubbard one = 1.0000000000e+00, /* 0x3f800000 */ 293a8617a8SJordan K. Hubbard C1 = 4.1666667908e-02, /* 0x3d2aaaab */ 303a8617a8SJordan K. Hubbard C2 = -1.3888889225e-03, /* 0xbab60b61 */ 313a8617a8SJordan K. Hubbard C3 = 2.4801587642e-05, /* 0x37d00d01 */ 323a8617a8SJordan K. Hubbard C4 = -2.7557314297e-07, /* 0xb493f27c */ 333a8617a8SJordan K. Hubbard C5 = 2.0875723372e-09, /* 0x310f74f6 */ 343a8617a8SJordan K. Hubbard C6 = -1.1359647598e-11; /* 0xad47d74e */ 353a8617a8SJordan K. Hubbard 363a8617a8SJordan K. Hubbard #ifdef __STDC__ 373a8617a8SJordan K. Hubbard float __kernel_cosf(float x, float y) 383a8617a8SJordan K. Hubbard #else 393a8617a8SJordan K. Hubbard float __kernel_cosf(x, y) 403a8617a8SJordan K. Hubbard float x,y; 413a8617a8SJordan K. Hubbard #endif 423a8617a8SJordan K. Hubbard { 433a8617a8SJordan K. Hubbard float a,hz,z,r,qx; 443a8617a8SJordan K. Hubbard int32_t ix; 453a8617a8SJordan K. Hubbard GET_FLOAT_WORD(ix,x); 463a8617a8SJordan K. Hubbard ix &= 0x7fffffff; /* ix = |x|'s high word*/ 473a8617a8SJordan K. Hubbard if(ix<0x32000000) { /* if x < 2**27 */ 483a8617a8SJordan K. Hubbard if(((int)x)==0) return one; /* generate inexact */ 493a8617a8SJordan K. Hubbard } 503a8617a8SJordan K. Hubbard z = x*x; 513a8617a8SJordan K. Hubbard r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6))))); 523a8617a8SJordan K. Hubbard if(ix < 0x3e99999a) /* if |x| < 0.3 */ 533a8617a8SJordan K. Hubbard return one - ((float)0.5*z - (z*r - x*y)); 543a8617a8SJordan K. Hubbard else { 553a8617a8SJordan K. Hubbard if(ix > 0x3f480000) { /* x > 0.78125 */ 563a8617a8SJordan K. Hubbard qx = (float)0.28125; 573a8617a8SJordan K. Hubbard } else { 583a8617a8SJordan K. Hubbard SET_FLOAT_WORD(qx,ix-0x01000000); /* x/4 */ 593a8617a8SJordan K. Hubbard } 603a8617a8SJordan K. Hubbard hz = (float)0.5*z-qx; 613a8617a8SJordan K. Hubbard a = one-qx; 623a8617a8SJordan K. Hubbard return a - (hz - (z*r-x*y)); 633a8617a8SJordan K. Hubbard } 643a8617a8SJordan K. Hubbard } 65