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
Location:
soft/giet_vm/giet_libs/math
Files:
10 edited

Legend:

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

    r682 r777  
    103103        int32_t i,j,k,yisint,n;
    104104        int32_t hx,hy,ix,iy;
    105         u_int32_t lx,ly;
     105        uint32_t lx,ly;
    106106
    107107        EXTRACT_WORDS(hx,lx,x);
     
    180180
    181181    /* (x<0)**(non-int) is NaN */
    182         if(((((u_int32_t)hx>>31)-1)|yisint)==0) return (x-x)/(x-x);
     182        if(((((uint32_t)hx>>31)-1)|yisint)==0) return (x-x)/(x-x);
    183183
    184184    /* |y| is huge */
     
    251251
    252252        s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
    253         if(((((u_int32_t)hx>>31)-1)|(yisint-1))==0)
     253        if(((((uint32_t)hx>>31)-1)|(yisint-1))==0)
    254254            s = -one;/* (-ve)**(odd int) */
    255255
     
    312312{
    313313        double z = __ieee754_pow(x, y);
    314         if (isnan(y))
     314        if (isnan(y)) {
    315315                return z;
     316    }
    316317        if (isnan(x)) {
    317318                if (y == 0.0) {
     
    322323        if (x == 0.0) {
    323324                if (y == 0.0) {
    324                         return 0; /* pow(0.0,0.0) */
     325            return 0; /* pow(0.0,0.0) */
    325326                }
    326327                if (isfinite(y) && y < 0.0) {
     
    332333                if (isfinite(x) && isfinite(y)) {
    333334                        if (isnan(z)) {
    334                                 return 0.0/0.0; /* pow neg**non-int */
     335                                return 0.0 / 0.0; /* pow neg**non-int */
    335336                        }
    336337                        {
    337338                                double ret = huge;
    338339                                y *= 0.5;
    339                                 if(x<zero&&rint(y)!=y) ret = -huge;
     340                                if (x < zero && rint(y) !=y ) {
     341                    ret = -huge;
     342                }
    340343                                return ret;
    341344                        }
     
    347350        return z;
    348351}
     352
     353/*
     354 * Pseudo exp function (QM)
     355 * There probably is a better implementation
     356 */
     357double exp(double x)
     358{
     359    const double e = 2.71828182846;
     360    return pow(e, x);
     361}
     362
  • soft/giet_vm/giet_libs/math/e_rem_pio2.c

    r581 r777  
    7575        double tx[3];
    7676        int32_t e0,i,j,nx,n,ix,hx;
    77         u_int32_t low;
     77        uint32_t low;
    7878
    7979        GET_HIGH_WORD(hx,x);            /* high word of x */
     
    115115                y[0] = r-w;     /* quick check no cancellation */
    116116            } else {
    117                 u_int32_t high;
     117                uint32_t high;
    118118                j  = ix>>20;
    119119                y[0] = r-w;
  • soft/giet_vm/giet_libs/math/e_sqrt.c

    r581 r777  
    9393        int32_t sign = (int)0x80000000;
    9494        int32_t ix0,s0,q,m,t,i;
    95         u_int32_t r,t1,s1,ix1,q1;
     95        uint32_t r,t1,s1,ix1,q1;
    9696
    9797        EXTRACT_WORDS(ix0,ix1,x);
     
    168168            if (z>=one) {
    169169                z = one+tiny;
    170                 if (q1==(u_int32_t)0xffffffff) { q1=0; q += 1;}
     170                if (q1==(uint32_t)0xffffffff) { q1=0; q += 1;}
    171171                else if (z>one) {
    172                     if (q1==(u_int32_t)0xfffffffe) q+=1;
     172                    if (q1==(uint32_t)0xfffffffe) q+=1;
    173173                    q1+=2;
    174174                } else
  • soft/giet_vm/giet_libs/math/math_private.h

    r588 r777  
    1616#define _MATH_PRIVATE_H_
    1717
    18 typedef unsigned int u_int32_t;
    19 
     18typedef unsigned int uint32_t;
    2019typedef int          int32_t;
     20typedef unsigned long long int uint64_t;
     21typedef long long int int64_t;
    2122
    2223/* The original fdlibm code used statements like:
     
    5152  struct
    5253  {
    53     u_int32_t msw;
    54     u_int32_t lsw;
     54    uint32_t msw;
     55    uint32_t lsw;
    5556  } parts;
    5657} ieee_double_shape_type;
     
    6465  struct
    6566  {
    66     u_int32_t lsw;
    67     u_int32_t msw;
     67    uint32_t lsw;
     68    uint32_t msw;
    6869  } parts;
    6970} ieee_double_shape_type;
  • soft/giet_vm/giet_libs/math/s_copysign.c

    r581 r777  
    2424double copysign(double x, double y)
    2525{
    26         u_int32_t hx,hy;
     26        uint32_t hx,hy;
    2727        GET_HIGH_WORD(hx,x);
    2828        GET_HIGH_WORD(hy,y);
  • soft/giet_vm/giet_libs/math/s_fabs.c

    r581 r777  
    2222double fabs(double x)
    2323{
    24         u_int32_t high;
     24        uint32_t high;
    2525        GET_HIGH_WORD(high,x);
    2626        SET_HIGH_WORD(x,high&0x7fffffff);
  • soft/giet_vm/giet_libs/math/s_finite.c

    r581 r777  
    2323int isfinite(double x)
    2424{
    25         u_int32_t hx;
     25        uint32_t hx;
    2626
    2727        GET_HIGH_WORD(hx, x);
  • 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
  • soft/giet_vm/giet_libs/math/s_isnan.c

    r581 r777  
    2626        EXTRACT_WORDS(hx,lx,x);
    2727        hx &= 0x7fffffff;
    28         hx |= (u_int32_t)(lx|(-lx))>>31;
     28        hx |= (uint32_t)(lx|(-lx))>>31;
    2929        hx = 0x7ff00000 - hx;
    30         return (int)(((u_int32_t)hx)>>31);
     30        return (int)(((uint32_t)hx)>>31);
    3131}
  • soft/giet_vm/giet_libs/math/s_rint.c

    r581 r777  
    3535{
    3636        int32_t i0, j0, sx;
    37         u_int32_t i,i1;
     37        uint32_t i,i1;
    3838        double t;
    3939        /* We use w = x + 2^52; t = w - 2^52; trick to round x to integer.
     
    4747        EXTRACT_WORDS(i0,i1,x);
    4848        /* Unbiased exponent */
    49         j0 = ((((u_int32_t)i0) >> 20)&0x7ff)-0x3ff;
     49        j0 = ((((uint32_t)i0) >> 20)&0x7ff)-0x3ff;
    5050
    5151        if (j0 > 51) {
     
    5757
    5858        /* Sign */
    59         sx = ((u_int32_t)i0) >> 31;
     59        sx = ((uint32_t)i0) >> 31;
    6060
    6161        if (j0<20) {
     
    8181            }
    8282        } else {
    83             i = ((u_int32_t)(0xffffffff))>>(j0-20);
     83            i = ((uint32_t)(0xffffffff))>>(j0-20);
    8484            if ((i1&i)==0) return x;    /* x is integral */
    8585            i>>=1;
Note: See TracChangeset for help on using the changeset viewer.