Changeset 648


Ignore:
Timestamp:
07/20/15 15:48:27 (9 years ago)
Author:
rlacroix
Message:

Fix possible overflows when simplifying a duration.

Affected XIOS 1.0 only.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/branchs/xios-1.0/src/duration.cpp

    r612 r648  
    110110      CDuration & CDuration::resolve(const CCalendar & c) 
    111111      { 
    112          // Simplification de l'écriture des minutes. 
    113          second += modf(minute, &minute) * (float)c.getMinuteLength(); 
    114          minute += int(second)/c.getMinuteLength(); second = int(second)%c.getMinuteLength(); 
     112        // Convert year, day, hour and minute to integer 
     113        month  += modf(year, &year) * c.getYearLength(); 
     114        hour   += modf(day, &day) * c.getDayLength(); 
     115        minute += modf(hour , &hour) * c.getHourLength(); 
     116        second += modf(minute, &minute) * c.getMinuteLength(); 
    115117 
    116          // Simplification de l'écriture des heures. 
    117          minute += modf(hour , &hour) * (float)c.getHourLength(); 
    118          hour   += int(minute)/c.getHourLength(); minute = int(minute)%c.getHourLength(); 
     118        // Simplify second, minute, day and year 
     119        double remain; 
     120        remain = fmod(second, c.getMinuteLength()); 
     121        minute += (second - remain) / c.getMinuteLength(); 
     122        second = remain; 
    119123 
    120          // Simplification de l'écriture des jours. 
    121          hour   += modf(day, &day) * (float)c.getDayLength(); 
    122          day    += int(hour)  /c.getDayLength(); hour   = int(hour)%c.getDayLength(); 
     124        remain = fmod(minute, c.getHourLength()); 
     125        hour   += (minute - remain) / c.getHourLength(); 
     126        minute = remain; 
    123127 
    124          // > Aucune équivalence jour - mois fixée par avance. // 
     128        remain = fmod(hour, c.getDayLength()); 
     129        day    += (hour - remain) / c.getDayLength(); 
     130        hour   = remain; 
    125131 
    126          // Simplification de l'écriture des années. 
    127          month  += modf(year, &year) * (float)c.getYearLength(); 
    128          year   += int(month) /c.getYearLength(); month  = int(month)%c.getYearLength(); 
    129          return *this; 
     132        remain = fmod(month, c.getYearLength()); 
     133        year   += (month - remain) / c.getYearLength(); 
     134        month  = remain; 
     135 
     136        return *this; 
    130137      } 
    131138 
Note: See TracChangeset for help on using the changeset viewer.