mirror of
https://github.com/fmtlib/fmt.git
synced 2025-07-30 10:47:35 +02:00
Handle negative exponent and nonnegative power
This commit is contained in:
@ -960,25 +960,31 @@ FMT_FUNC void fallback_format(Double v, buffer<char>& buf, int& exp10) {
|
|||||||
upper_store.assign(1);
|
upper_store.assign(1);
|
||||||
upper_store <<= fp_value.e + shift;
|
upper_store <<= fp_value.e + shift;
|
||||||
upper = &upper_store;
|
upper = &upper_store;
|
||||||
} else {
|
|
||||||
upper = &lower;
|
|
||||||
}
|
}
|
||||||
denominator.assign_pow10(exp10);
|
denominator.assign_pow10(exp10);
|
||||||
denominator <<= 1;
|
denominator <<= 1;
|
||||||
} else {
|
} else if (exp10 < 0) {
|
||||||
numerator.assign_pow10(-exp10);
|
numerator.assign_pow10(-exp10);
|
||||||
lower.assign(numerator);
|
lower.assign(numerator);
|
||||||
if (shift != 0) {
|
if (shift != 0) {
|
||||||
upper_store.assign(numerator);
|
upper_store.assign(numerator);
|
||||||
upper_store <<= 1;
|
upper_store <<= 1;
|
||||||
upper = &upper_store;
|
upper = &upper_store;
|
||||||
} else {
|
|
||||||
upper = &lower;
|
|
||||||
}
|
}
|
||||||
numerator *= significand;
|
numerator *= significand;
|
||||||
denominator.assign(1);
|
denominator.assign(1);
|
||||||
denominator <<= 1 - fp_value.e;
|
denominator <<= 1 - fp_value.e;
|
||||||
|
} else {
|
||||||
|
numerator.assign(significand);
|
||||||
|
denominator.assign_pow10(exp10);
|
||||||
|
denominator <<= 1 - fp_value.e;
|
||||||
|
lower.assign(1);
|
||||||
|
if (shift != 0) {
|
||||||
|
upper_store.assign(1 << shift);
|
||||||
|
upper = &upper_store;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if (!upper) upper = &lower;
|
||||||
// Invariant: fp_value == (numerator / denominator) * pow(10, exp10).
|
// Invariant: fp_value == (numerator / denominator) * pow(10, exp10).
|
||||||
bool even = (fp_value.f & 1) == 0;
|
bool even = (fp_value.f & 1) == 0;
|
||||||
int num_digits = 0;
|
int num_digits = 0;
|
||||||
|
@ -63,4 +63,5 @@ TEST(GrisuTest, Fallback) {
|
|||||||
fmt::format("{}", 5.423717798060526e+125));
|
fmt::format("{}", 5.423717798060526e+125));
|
||||||
EXPECT_EQ("1.372371880954233e-288",
|
EXPECT_EQ("1.372371880954233e-288",
|
||||||
fmt::format("{}", 1.372371880954233e-288));
|
fmt::format("{}", 1.372371880954233e-288));
|
||||||
|
EXPECT_EQ("55388492.622190244", fmt::format("{}", 55388492.622190244));
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user