From f50ad340cbdc3f4fbc285d7dd758083eb678f49a Mon Sep 17 00:00:00 2001 From: Luis Kornblueh <luis.kornblueh@zmaw.de> Date: Sat, 28 Feb 2015 20:51:02 +0100 Subject: [PATCH] Solved int64_t division problem. --- src/mtime_timedelta.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/mtime_timedelta.c b/src/mtime_timedelta.c index 24e01b48..01ecc091 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; } -- GitLab