diff --git a/src/mtime_timedelta.c b/src/mtime_timedelta.c index 24e01b4870be56b49fbcd0cd0c53c5255037d9c6..01ecc091f040f895d4f9ed397dfec36a84b9909b 100644 --- a/src/mtime_timedelta.c +++ b/src/mtime_timedelta.c @@ -1074,20 +1074,19 @@ divideTimeDeltaInSeconds(struct _timedelta* dividend, struct _timedelta* divisor { if ((dividend->year == 0) && (dividend->month == 0) && (divisor->year == 0) && (divisor->month == 0)) { - int64_t dividend_in_ms = (dividend->day * NO_OF_SEC_IN_A_DAY + dividend->hour * NO_OF_SEC_IN_A_HOUR + - dividend->minute * NO_OF_SEC_IN_A_MINUTE + dividend->second) * NO_OF_MS_IN_A_SECOND + dividend->ms; - - int64_t divisor_in_ms = (divisor->day * NO_OF_SEC_IN_A_DAY + divisor->hour * NO_OF_SEC_IN_A_HOUR + - divisor->minute * NO_OF_SEC_IN_A_MINUTE + divisor->second ) * NO_OF_MS_IN_A_SECOND + divisor->ms; + intmax_t numerator = (intmax_t) ((dividend->day * 86400 + dividend->minute * 60 + dividend->second) * 1000 + dividend->ms); + intmax_t denominator = (intmax_t) ((divisor->day * 86400 + divisor->minute * 60 + divisor->second ) * 1000 + divisor->ms); - if(divisor_in_ms == 0) /* Division by zero is illegal. */ - return NULL; + if (denominator == 0) /* Division by zero is illegal. */ + return NULL; - quo_ret->quotient = (int64_t)(dividend_in_ms/divisor_in_ms); - quo_ret->remainder_in_ms = dividend_in_ms - quo_ret->quotient*divisor_in_ms; //remainder is reported in ms. + imaxdiv_t div = imaxdiv(numerator, denominator); + + quo_ret->quotient = (int64_t) div.quot; + quo_ret->remainder_in_ms = (int64_t) div.rem; - return quo_ret; - } + return quo_ret; + } else /* Only seconds supported */ return NULL; }