[BACK]Return to s_trunc.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libm / src

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/lib/libm/src/s_trunc.c between version 1.2 and 1.3

version 1.2, 2007/01/17 23:24:22 version 1.3, 2008/04/25 22:21:53
Line 35  static const double huge = 1.0e300;
Line 35  static const double huge = 1.0e300;
 double  double
 trunc(double x)  trunc(double x)
 {  {
         int32_t i0,i1,j0;          int32_t i0,i1,jj0;
         uint32_t i;          uint32_t i;
         EXTRACT_WORDS(i0,i1,x);          EXTRACT_WORDS(i0,i1,x);
         j0 = ((i0>>20)&0x7ff)-0x3ff;          jj0 = ((i0>>20)&0x7ff)-0x3ff;
         if(j0<20) {          if(jj0<20) {
             if(j0<0) {  /* raise inexact if x != 0 */              if(jj0<0) {         /* raise inexact if x != 0 */
                 if(huge+x>0.0) {/* |x|<1, so return 0*sign(x) */                  if(huge+x>0.0) {/* |x|<1, so return 0*sign(x) */
                     i0 &= 0x80000000U;                      i0 &= 0x80000000U;
                     i1 = 0;                      i1 = 0;
                 }                  }
             } else {              } else {
                 i = (0x000fffff)>>j0;                  i = (0x000fffff)>>jj0;
                 if(((i0&i)|i1)==0) return x; /* x is integral */                  if(((i0&i)|i1)==0) return x; /* x is integral */
                 if(huge+x>0.0) {        /* raise inexact flag */                  if(huge+x>0.0) {        /* raise inexact flag */
                     i0 &= (~i); i1=0;                      i0 &= (~i); i1=0;
                 }                  }
             }              }
         } else if (j0>51) {          } else if (jj0>51) {
             if(j0==0x400) return x+x;   /* inf or NaN */              if(jj0==0x400) return x+x;  /* inf or NaN */
             else return x;              /* x is integral */              else return x;              /* x is integral */
         } else {          } else {
             i = ((u_int32_t)(0xffffffff))>>(j0-20);              i = ((u_int32_t)(0xffffffff))>>(jj0-20);
             if((i1&i)==0) return x;     /* x is integral */              if((i1&i)==0) return x;     /* x is integral */
             if(huge+x>0.0)              /* raise inexact flag */              if(huge+x>0.0)              /* raise inexact flag */
                 i1 &= (~i);                  i1 &= (~i);

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.3

CVSweb <webmaster@jp.NetBSD.org>