k_cosf.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       k_cosf.c (1611B)
       ---
            1 /* k_cosf.c -- float version of k_cos.c
            2  * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
            3  */
            4 
            5 /*
            6  * ====================================================
            7  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
            8  *
            9  * Developed at SunPro, a Sun Microsystems, Inc. business.
           10  * Permission to use, copy, modify, and distribute this
           11  * software is freely granted, provided that this notice
           12  * is preserved.
           13  * ====================================================
           14  */
           15 
           16 #ifndef lint
           17 static char rcsid[] = "$FreeBSD: src/lib/msun/src/k_cosf.c,v 1.7 2002/05/28 18:15:04 alfred Exp $";
           18 #endif
           19 
           20 #include "math.h"
           21 #include "math_private.h"
           22 
           23 static const float
           24 one =  1.0000000000e+00, /* 0x3f800000 */
           25 C1  =  4.1666667908e-02, /* 0x3d2aaaab */
           26 C2  = -1.3888889225e-03, /* 0xbab60b61 */
           27 C3  =  2.4801587642e-05, /* 0x37d00d01 */
           28 C4  = -2.7557314297e-07, /* 0xb493f27c */
           29 C5  =  2.0875723372e-09, /* 0x310f74f6 */
           30 C6  = -1.1359647598e-11; /* 0xad47d74e */
           31 
           32 float
           33 __kernel_cosf(float x, float y)
           34 {
           35         float a,hz,z,r,qx;
           36         int32_t ix;
           37         GET_FLOAT_WORD(ix,x);
           38         ix &= 0x7fffffff;                        /* ix = |x|'s high word*/
           39         if(ix<0x32000000) {                        /* if x < 2**27 */
           40             if(((int)x)==0) return one;                /* generate inexact */
           41         }
           42         z  = x*x;
           43         r  = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6)))));
           44         if(ix < 0x3e99999a)                         /* if |x| < 0.3 */
           45             return one - ((float)0.5*z - (z*r - x*y));
           46         else {
           47             if(ix > 0x3f480000) {                /* x > 0.78125 */
           48                 qx = (float)0.28125;
           49             } else {
           50                 SET_FLOAT_WORD(qx,ix-0x01000000);        /* x/4 */
           51             }
           52             hz = (float)0.5*z-qx;
           53             a  = one-qx;
           54             return a - (hz - (z*r-x*y));
           55         }
           56 }