Skip to content

Commit 62a8dba

Browse files
authored
Merge pull request #118 from pitrou/issue-117
Fix #117: compilation warning with gcc 6.3.0
2 parents d35368c + 133099a commit 62a8dba

File tree

2 files changed

+48
-31
lines changed

2 files changed

+48
-31
lines changed

include/fast_float/digit_comparison.h

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -44,40 +44,24 @@ fastfloat_really_inline int32_t scientific_exponent(parsed_number_string& num) n
4444
// this converts a native floating-point number to an extended-precision float.
4545
template <typename T>
4646
fastfloat_really_inline adjusted_mantissa to_extended(T value) noexcept {
47+
using equiv_uint = typename binary_format<T>::equiv_uint;
48+
constexpr equiv_uint exponent_mask = binary_format<T>::exponent_mask();
49+
constexpr equiv_uint mantissa_mask = binary_format<T>::mantissa_mask();
50+
constexpr equiv_uint hidden_bit_mask = binary_format<T>::hidden_bit_mask();
51+
4752
adjusted_mantissa am;
4853
int32_t bias = binary_format<T>::mantissa_explicit_bits() - binary_format<T>::minimum_exponent();
49-
if (std::is_same<T, float>::value) {
50-
constexpr uint32_t exponent_mask = 0x7F800000;
51-
constexpr uint32_t mantissa_mask = 0x007FFFFF;
52-
constexpr uint64_t hidden_bit_mask = 0x00800000;
53-
uint32_t bits;
54-
::memcpy(&bits, &value, sizeof(T));
55-
if ((bits & exponent_mask) == 0) {
56-
// denormal
57-
am.power2 = 1 - bias;
58-
am.mantissa = bits & mantissa_mask;
59-
} else {
60-
// normal
61-
am.power2 = int32_t((bits & exponent_mask) >> binary_format<T>::mantissa_explicit_bits());
62-
am.power2 -= bias;
63-
am.mantissa = (bits & mantissa_mask) | hidden_bit_mask;
64-
}
54+
equiv_uint bits;
55+
::memcpy(&bits, &value, sizeof(T));
56+
if ((bits & exponent_mask) == 0) {
57+
// denormal
58+
am.power2 = 1 - bias;
59+
am.mantissa = bits & mantissa_mask;
6560
} else {
66-
constexpr uint64_t exponent_mask = 0x7FF0000000000000;
67-
constexpr uint64_t mantissa_mask = 0x000FFFFFFFFFFFFF;
68-
constexpr uint64_t hidden_bit_mask = 0x0010000000000000;
69-
uint64_t bits;
70-
::memcpy(&bits, &value, sizeof(T));
71-
if ((bits & exponent_mask) == 0) {
72-
// denormal
73-
am.power2 = 1 - bias;
74-
am.mantissa = bits & mantissa_mask;
75-
} else {
76-
// normal
77-
am.power2 = int32_t((bits & exponent_mask) >> binary_format<T>::mantissa_explicit_bits());
78-
am.power2 -= bias;
79-
am.mantissa = (bits & mantissa_mask) | hidden_bit_mask;
80-
}
61+
// normal
62+
am.power2 = int32_t((bits & exponent_mask) >> binary_format<T>::mantissa_explicit_bits());
63+
am.power2 -= bias;
64+
am.mantissa = (bits & mantissa_mask) | hidden_bit_mask;
8165
}
8266

8367
return am;

include/fast_float/float_common.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <cstdint>
66
#include <cassert>
77
#include <cstring>
8+
#include <type_traits>
89

910
#if (defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) \
1011
|| defined(__amd64) || defined(__aarch64__) || defined(_M_ARM64) \
@@ -219,6 +220,8 @@ constexpr static float powers_of_ten_float[] = {1e0, 1e1, 1e2, 1e3, 1e4, 1e5,
219220
1e6, 1e7, 1e8, 1e9, 1e10};
220221

221222
template <typename T> struct binary_format {
223+
using equiv_uint = typename std::conditional<sizeof(T) == 4, uint32_t, uint64_t>::type;
224+
222225
static inline constexpr int mantissa_explicit_bits();
223226
static inline constexpr int minimum_exponent();
224227
static inline constexpr int infinite_power();
@@ -232,6 +235,9 @@ template <typename T> struct binary_format {
232235
static inline constexpr int smallest_power_of_ten();
233236
static inline constexpr T exact_power_of_ten(int64_t power);
234237
static inline constexpr size_t max_digits();
238+
static inline constexpr equiv_uint exponent_mask();
239+
static inline constexpr equiv_uint mantissa_mask();
240+
static inline constexpr equiv_uint hidden_bit_mask();
235241
};
236242

237243
template <> inline constexpr int binary_format<double>::mantissa_explicit_bits() {
@@ -339,6 +345,33 @@ template <> inline constexpr size_t binary_format<float>::max_digits() {
339345
return 114;
340346
}
341347

348+
template <> inline constexpr binary_format<float>::equiv_uint
349+
binary_format<float>::exponent_mask() {
350+
return 0x7F800000;
351+
}
352+
template <> inline constexpr binary_format<double>::equiv_uint
353+
binary_format<double>::exponent_mask() {
354+
return 0x7FF0000000000000;
355+
}
356+
357+
template <> inline constexpr binary_format<float>::equiv_uint
358+
binary_format<float>::mantissa_mask() {
359+
return 0x007FFFFF;
360+
}
361+
template <> inline constexpr binary_format<double>::equiv_uint
362+
binary_format<double>::mantissa_mask() {
363+
return 0x000FFFFFFFFFFFFF;
364+
}
365+
366+
template <> inline constexpr binary_format<float>::equiv_uint
367+
binary_format<float>::hidden_bit_mask() {
368+
return 0x00800000;
369+
}
370+
template <> inline constexpr binary_format<double>::equiv_uint
371+
binary_format<double>::hidden_bit_mask() {
372+
return 0x0010000000000000;
373+
}
374+
342375
template<typename T>
343376
fastfloat_really_inline void to_float(bool negative, adjusted_mantissa am, T &value) {
344377
uint64_t word = am.mantissa;

0 commit comments

Comments
 (0)