s_truncf.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       s_truncf.c (1189B)
       ---
            1 /* @(#)s_floor.c 5.1 93/09/24 */
            2 /*
            3  * ====================================================
            4  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
            5  *
            6  * Developed at SunPro, a Sun Microsystems, Inc. business.
            7  * Permission to use, copy, modify, and distribute this
            8  * software is freely granted, provided that this notice
            9  * is preserved.
           10  * ====================================================
           11  */
           12 
           13 /*
           14  * truncf(x)
           15  * Return x rounded toward 0 to integral value
           16  * Method:
           17  *        Bit twiddling.
           18  * Exception:
           19  *        Inexact flag raised if x not equal to truncf(x).
           20  */
           21 
           22 #include "math.h"
           23 #include "math_private.h"
           24 
           25 static const float huge = 1.0e30F;
           26 
           27 float
           28 truncf(float x)
           29 {
           30         int32_t i0,j0;
           31         u_int32_t i;
           32         GET_FLOAT_WORD(i0,x);
           33         j0 = ((i0>>23)&0xff)-0x7f;
           34         if(j0<23) {
           35             if(j0<0) {         /* raise inexact if x != 0 */
           36                 if(huge+x>0.0F)                /* |x|<1, so return 0*sign(x) */
           37                     i0 &= 0x80000000;
           38             } else {
           39                 i = (0x007fffff)>>j0;
           40                 if((i0&i)==0) return x; /* x is integral */
           41                 if(huge+x>0.0F)                /* raise inexact flag */
           42                     i0 &= (~i);
           43             }
           44         } else {
           45             if(j0==0x80) return x+x;        /* inf or NaN */
           46             else return x;                /* x is integral */
           47         }
           48         SET_FLOAT_WORD(x,i0);
           49         return x;
           50 }