Ignore:
Timestamp:
Feb 4, 2016, 6:25:22 PM (9 years ago)
Author:
meunier
Message:
  • Ajout de quelques fonction dans la lib math
  • Déplacement de certaines fonctions de stdlib vers string
File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/giet_libs/math/s_floor.c

    r581 r777  
    1111
    1212/* Modified for GIET-VM static OS at UPMC, France 2015.
    13  */
     13*/
    1414
    1515/*
     
    2828double floor(double x)
    2929{
    30         int32_t i0,i1,j0;
    31         u_int32_t i,j;
    32         EXTRACT_WORDS(i0,i1,x);
    33         j0 = ((i0>>20)&0x7ff)-0x3ff;
    34         if(j0<20) {
    35             if(j0<0) {  /* raise inexact if x != 0 */
    36                 if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
    37                     if(i0>=0) {i0=i1=0;}
    38                     else if(((i0&0x7fffffff)|i1)!=0)
    39                         { i0=0xbff00000;i1=0;}
    40                 }
    41             } else {
    42                 i = (0x000fffff)>>j0;
    43                 if(((i0&i)|i1)==0) return x; /* x is integral */
    44                 if(huge+x>0.0) {        /* raise inexact flag */
    45                     if(i0<0) i0 += (0x00100000)>>j0;
    46                     i0 &= (~i); i1=0;
    47                 }
    48             }
    49         } else if (j0>51) {
    50             if(j0==0x400) return x+x;   /* inf or NaN */
    51             else return x;              /* x is integral */
    52         } else {
    53             i = ((u_int32_t)(0xffffffff))>>(j0-20);
    54             if((i1&i)==0) return x;     /* x is integral */
    55             if(huge+x>0.0) {            /* raise inexact flag */
    56                 if(i0<0) {
    57                     if(j0==20) i0+=1;
    58                     else {
    59                         j = i1+(1<<(52-j0));
    60                         if(j<i1) i0 +=1 ;       /* got a carry */
    61                         i1=j;
    62                     }
    63                 }
    64                 i1 &= (~i);
    65             }
    66         }
    67         INSERT_WORDS(x,i0,i1);
    68         return x;
     30    int32_t i0, i1, j0;
     31    uint32_t i, j;
     32    EXTRACT_WORDS(i0, i1, x);
     33    j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
     34    if (j0 < 20) {
     35        if (j0 < 0) {   /* raise inexact if x != 0 */
     36            if (huge + x > 0.0) {/* return 0*sign(x) if |x|<1 */
     37                if (i0 >= 0) {
     38                    i0 = i1 = 0;
     39                }
     40                else if (((i0 & 0x7fffffff) | i1) != 0) {
     41                    i0 = 0xbff00000;
     42                    i1 = 0;
     43                }
     44            }
     45        }
     46        else {
     47            i = (0x000fffff) >> j0;
     48            if (((i0 & i) | i1) == 0) {
     49                return x; /* x is integral */
     50            }
     51            if (huge + x > 0.0) {       /* raise inexact flag */
     52                if (i0 < 0) {
     53                    i0 += (0x00100000) >> j0;
     54                }
     55                i0 &= (~i);
     56                i1 = 0;
     57            }
     58        }
     59    }
     60    else if (j0 > 51) {
     61        if (j0 == 0x400) {
     62            return x + x;       /* inf or NaN */
     63        }
     64        else {
     65            return x;           /* x is integral */
     66        }
     67    }
     68    else {
     69        i = ((uint32_t) (0xffffffff)) >> (j0 - 20);
     70        if ((i1 & i)== 0) {
     71            return x;   /* x is integral */
     72        }
     73        if (huge + x > 0.0) {           /* raise inexact flag */
     74            if (i0 < 0) {
     75                if (j0 == 20) {
     76                    i0 += 1;
     77                }
     78                else {
     79                    j = i1 + (1 << (52 - j0));
     80                    if (j < i1) {
     81                        i0 += 1 ;       /* got a carry */
     82                    }
     83                    i1 = j;
     84                }
     85            }
     86            i1 &= (~i);
     87        }
     88    }
     89    INSERT_WORDS(x, i0, i1);
     90    return x;
    6991}
    7092
Note: See TracChangeset for help on using the changeset viewer.