Fix Grisu3 stopping conditions

This commit is contained in:
Victor Zverovich
2019-05-12 08:56:50 -07:00
parent f4dfd6e30f
commit b488df6cfe

View File

@ -656,21 +656,21 @@ template <int GRISU_VERSION> struct grisu_shortest_handler {
uint64_t d = integral ? diff : diff * data::POWERS_OF_10_64[-exp]; uint64_t d = integral ? diff : diff * data::POWERS_OF_10_64[-exp];
while (remainder < d && error - remainder >= divisor && while (remainder < d && error - remainder >= divisor &&
(remainder + divisor < d || (remainder + divisor < d ||
d - remainder > remainder + divisor - d)) { d - remainder >= remainder + divisor - d)) {
--buf[size - 1]; --buf[size - 1];
remainder += divisor; remainder += divisor;
} }
return digits::done; return digits::done;
} }
uint64_t unit = integral ? 1 : data::POWERS_OF_10_64[-exp]; uint64_t unit = integral ? 1 : data::POWERS_OF_10_64[-exp];
uint64_t up = diff + unit; // wp_Wup uint64_t up = (diff - 1) * unit; // wp_Wup
while (remainder < up && error - remainder >= divisor && while (remainder < up && error - remainder >= divisor &&
(remainder + divisor < up || (remainder + divisor < up ||
up - remainder > remainder + divisor - up)) { up - remainder >= remainder + divisor - up)) {
--buf[size - 1]; --buf[size - 1];
remainder += divisor; remainder += divisor;
} }
uint64_t down = diff - unit; // wp_Wdown uint64_t down = (diff + 1) * unit; // wp_Wdown
if (remainder < down && error - remainder >= divisor && if (remainder < down && error - remainder >= divisor &&
(remainder + divisor < down || (remainder + divisor < down ||
down - remainder > remainder + divisor - down)) { down - remainder > remainder + divisor - down)) {