mirror of
https://github.com/fmtlib/fmt.git
synced 2025-07-31 19:24:48 +02:00
Fix Grisu3 stopping conditions
This commit is contained in:
@@ -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)) {
|
||||||
|
Reference in New Issue
Block a user