Fix compilation on platforms with exotic double (#878)
This commit is contained in:
parent
e4ca37ccf6
commit
d7f17613f5
@ -513,7 +513,8 @@ FMT_FUNC void grisu2_gen_digits(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FMT_FUNC void grisu2_format_positive(double value, char *buffer, size_t &size,
|
template <typename Double>
|
||||||
|
FMT_FUNC void grisu2_format_positive(Double value, char *buffer, size_t &size,
|
||||||
int &dec_exp) {
|
int &dec_exp) {
|
||||||
FMT_ASSERT(value > 0, "value is nonpositive");
|
FMT_ASSERT(value > 0, "value is nonpositive");
|
||||||
fp fp_value(value);
|
fp fp_value(value);
|
||||||
@ -640,8 +641,10 @@ FMT_FUNC void grisu2_prettify(char *buffer, size_t &size, int exp,
|
|||||||
|
|
||||||
// Formats a nonnegative value using Grisu2 algorithm. Grisu2 doesn't give any
|
// Formats a nonnegative value using Grisu2 algorithm. Grisu2 doesn't give any
|
||||||
// guarantees on the shortness of the result.
|
// guarantees on the shortness of the result.
|
||||||
FMT_FUNC void grisu2_format(double value, char *buffer, size_t &size, char type,
|
template <typename Double>
|
||||||
int precision, bool write_decimal_point) {
|
FMT_FUNC typename std::enable_if<sizeof(Double) == sizeof(uint64_t)>::type
|
||||||
|
grisu2_format(Double value, char *buffer, size_t &size, char type,
|
||||||
|
int precision, bool write_decimal_point) {
|
||||||
FMT_ASSERT(value >= 0, "value is negative");
|
FMT_ASSERT(value >= 0, "value is negative");
|
||||||
int dec_exp = 0; // K in Grisu.
|
int dec_exp = 0; // K in Grisu.
|
||||||
if (value > 0) {
|
if (value > 0) {
|
||||||
|
@ -293,8 +293,13 @@ inline bool use_grisu() {
|
|||||||
|
|
||||||
// Formats value using Grisu2 algorithm:
|
// Formats value using Grisu2 algorithm:
|
||||||
// https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf
|
// https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf
|
||||||
FMT_API void grisu2_format(double value, char *buffer, size_t &size, char type,
|
template <typename Double>
|
||||||
int precision, bool write_decimal_point);
|
FMT_API typename std::enable_if<sizeof(Double) == sizeof(uint64_t)>::type
|
||||||
|
grisu2_format(Double value, char *buffer, size_t &size, char type,
|
||||||
|
int precision, bool write_decimal_point);
|
||||||
|
template <typename Double>
|
||||||
|
inline typename std::enable_if<sizeof(Double) != sizeof(uint64_t)>::type
|
||||||
|
grisu2_format(Double, char *, size_t &, char, int, bool) {}
|
||||||
|
|
||||||
template <typename Allocator>
|
template <typename Allocator>
|
||||||
typename Allocator::value_type *allocate(Allocator& alloc, std::size_t n) {
|
typename Allocator::value_type *allocate(Allocator& alloc, std::size_t n) {
|
||||||
|
@ -102,6 +102,11 @@ TEST(FPTest, GetCachedPower) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(FPTest, Grisu2FormatCompilesWithNonIEEEDouble) {
|
||||||
|
size_t size = 0;
|
||||||
|
fmt::internal::grisu2_format(4.2f, FMT_NULL, size, 0, 0, false);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct ValueExtractor: fmt::internal::function<T> {
|
struct ValueExtractor: fmt::internal::function<T> {
|
||||||
T operator()(T value) {
|
T operator()(T value) {
|
||||||
|
Loading…
Reference in New Issue
Block a user