Skip to content

Commit a37f62a

Browse files
author
Fabrice Bellard
committed
fixed bad rounding in duration computation
1 parent ea3deb1 commit a37f62a

1 file changed

Lines changed: 5 additions & 6 deletions

File tree

‎temporal/duration.c‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ static int to_integer_if_integral(JSContext *ctx, JSValueConst val, int64_t *pre
8686
JS_ThrowRangeError(ctx, "value must be an integer");
8787
return -1;
8888
}
89-
if (d > (double)INT64_MAX || d < (double)INT64_MIN) {
89+
if (d >= 0x1p63 || d < -0x1p63) {
9090
JS_ThrowRangeError(ctx, "value out of range");
9191
return -1;
9292
}
@@ -107,7 +107,7 @@ static int to_integer_if_integral128(JSContext *ctx, JSValueConst val, js_int128
107107
JS_ThrowRangeError(ctx, "value must be an integer");
108108
return -1;
109109
}
110-
if (d > 0x1p127 || d < -0x1p127) {
110+
if (d >= 0x1p127 || d < -0x1p127) {
111111
JS_ThrowRangeError(ctx, "value out of range");
112112
return -1;
113113
}
@@ -1516,14 +1516,13 @@ static int duration_total_nudge(const char *timeZone, CalendarType calendar,
15161516
}
15171517

15181518
js_int128_t numerator = dest_ns - start_ns;
1519-
js_int128_t denominator = end_ns - start_ns;
1519+
int64_t denominator = end_ns - start_ns;
15201520

15211521
if (denominator == 0) {
15221522
*out = (double)r1;
1523-
return 0;
1523+
} else {
1524+
*out = duration_total_div((js_int128_t)r1 * denominator + sign * numerator, denominator);
15241525
}
1525-
1526-
*out = (double)((long double)(r1 * denominator + sign * numerator) / (long double)denominator);
15271526
return 0;
15281527
}
15291528

0 commit comments

Comments
 (0)