Changeset 810 for soft


Ignore:
Timestamp:
Mar 22, 2016, 5:40:12 PM (9 years ago)
Author:
alain
Message:

Fix a bug in xprintf() function for %f format.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/giet_libs/stdlib.c

    r801 r810  
    230230                break;
    231231            }
    232             case ('e'):
    233             case ('f'):
    234             case ('g'):             // IEEE754 64 bits
     232            case ('f'):             // IEEE754 64 bits
     233                                    // integer part : up to 10 decimal digits
     234                                    // decimal part : 9 decimal digits
    235235            {
    236236                union
     
    242242                val.d = va_arg( *args, double );
    243243               
    244                 unsigned long long digits;
    245                 digits = val.ull & 0xFFFFFFFFFFFFFULL;    // mantisse
    246                
    247                 unsigned int base;
    248                 base = (unsigned int)((val.ull & 0x7FF0000000000000ULL) >> 52); // exp
    249 
    250                 unsigned int intp;
    251                 intp = (unsigned int)val.d;         // integer part
    252 
    253                 unsigned int decp;                  // decimal part
    254                
    255                 int isvalue = 0;
    256                
    257                 if (base == 0x7FF) // special values
    258                 {
    259                     if (digits & 0xFFFFFFFFFFFFFULL)  // Not a Number
     244                unsigned long long mantisse;
     245                mantisse = val.ull & 0xFFFFFFFFFFFFFULL;    // mantisse
     246               
     247                unsigned int exp;
     248                exp = (unsigned int)((val.ull & 0x7FF0000000000000ULL) >> 52); // exp
     249
     250                if (exp == 0x7FF) // special values
     251                {
     252                    if (mantisse & 0xFFFFFFFFFFFFFULL)  // Not a Number
    260253                    {
    261254                        buf[0] = 'N';
     
    277270                    break;
    278271                }
    279                
    280                 if (val.ull & 0x8000000000000000ULL)  // negative
     272
     273                // display sign & analyse overflow
     274                unsigned int overflow = 0;
     275                if (val.ull & 0x8000000000000000ULL)  // negative
    281276                {
    282277                    TO_STREAM( '-' );
    283278                    val.d = val.d * -1;
     279                    if( val.d < -9999999999.0) overflow = 1;
    284280                }
    285281                else                                  // positive
    286282                {
    287283                    TO_STREAM( '+' );
    288                 }
    289                
    290                 if (val.d > 0xFFFFFFFF)              // overflow
    291                 {
    292                     buf[0] = 'B';
    293                     buf[1] = 'I';
    294                     buf[2] = 'G';
     284                    if( val.d > 9999999999.0) overflow = 1;
     285                }
     286               
     287                // check overflow caused by the 10.9 format
     288                if ( overflow )   
     289                {
     290                    buf[0] = 'o';
     291                    buf[1] = 'v';
     292                    buf[2] = 'r';
    295293                    len = 3;
    296294                    pbuf = buf;
    297295                    break;
    298296                }
    299                
     297
     298                // compute integer & decimal parts
     299                unsigned int intp;                  // integer part
     300                unsigned int decp;                  // decimal part
     301                intp = (unsigned int)val.d;     
    300302                val.d -= (double)intp;
    301303                decp = (unsigned int)(val.d * 1000000000);
    302304               
     305                // display decimal value in 10.9 format
    303306                for(i = 0; i < 10; i++)
    304307                {
    305                     if ((!isvalue) && (intp % 10)) isvalue = 1;
    306308                    buf[9 - i] = HexaTab[intp % 10];
    307309                    if (!(intp /= 10)) break;
     
    310312                len = i+11;
    311313                buf[10] = '.';
    312                
    313314                for(i = 0; i < 9; i++)
    314315                {
    315                     if ((!isvalue) && (decp % 10)) isvalue = 1;
    316316                    buf[19 - i] = HexaTab[decp % 10];
    317317                    decp /= 10;
    318318                }
    319                
    320                 if (!isvalue)
    321                 {
    322                     if (val.d != 0)                   // underflow
    323                     {
    324                         buf[0] = 'T';
    325                         buf[1] = 'I';
    326                         buf[2] = 'N';
    327                         buf[3] = 'Y';
    328                         len = 4;
    329                         pbuf = buf;
    330                     }
    331                 }
    332 
    333319                break;
    334320            }
Note: See TracChangeset for help on using the changeset viewer.