Changeset 666 for soft


Ignore:
Timestamp:
Jul 27, 2015, 5:56:15 PM (9 years ago)
Author:
guerin
Message:

stdio: printf: fix compilation warning using an union

File:
1 edited

Legend:

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

    r661 r666  
    350350            case ('g'):             /* IEEE754 64 bits */
    351351            {
    352                
    353                 double vald = va_arg( *args, double);
    354                
    355                 unsigned long long
    356                     val = *(unsigned long long*)&vald, //get ieee754 without conversion
    357                     digits = val & 0xFFFFFFFFFFFFFULL;    //get mantissa
     352                union
     353                {
     354                    double d;
     355                    unsigned long long ull;
     356                } val;
     357               
     358                val.d = va_arg( *args, double );
     359               
     360                unsigned long long digits = val.ull & 0xFFFFFFFFFFFFFULL;    //get mantissa
    358361               
    359362                unsigned int
    360                     base = (unsigned int)((val & 0x7FF0000000000000ULL) >> 52), //get exposant
    361                     intp = (unsigned int)vald,         //get integer part of the float
     363                    base = (unsigned int)((val.ull & 0x7FF0000000000000ULL) >> 52), //get exposant
     364                    intp = (unsigned int)val.d,         //get integer part of the float
    362365                    decp;
    363366               
     
    378381                    {
    379382                        /* inf */
    380                         buf[0] = (val & 0x8000000000000000ULL) ? '-' : '+';
     383                        buf[0] = (val.ull & 0x8000000000000000ULL) ? '-' : '+';
    381384                        buf[1] = 'i';
    382385                        buf[2] = 'n';
     
    388391                }
    389392               
    390                 if (val & 0x8000000000000000ULL)
     393                if (val.ull & 0x8000000000000000ULL)
    391394                {
    392395                    /* negative */
     
    397400                                0);
    398401                    if (ret != 1) goto return_error;
    399                     vald = vald * -1;
     402                    val.d = val.d * -1;
    400403                }
    401404                else
     
    410413                }
    411414               
    412                 if (vald > 0xFFFFFFFF)
     415                if (val.d > 0xFFFFFFFF)
    413416                {
    414417                    /* overflow */
     
    421424                }
    422425               
    423                 vald -= (double)intp;
    424                 decp = (unsigned int)(vald * 1000000000);
     426                val.d -= (double)intp;
     427                decp = (unsigned int)(val.d * 1000000000);
    425428               
    426429                for(i = 0; i < 10; i++)
     
    443446                if (!isvalue)
    444447                {
    445                     if (vald != 0)
     448                    if (val.d != 0)
    446449                    {
    447450                        /* underflow */
Note: See TracChangeset for help on using the changeset viewer.