@@ -50,95 +50,92 @@ struct FloatTraits<T, 8 /*64bits*/> {
50
50
51
51
static T positiveBinaryPowerOfTen (int index) {
52
52
ARDUINOJSON_DEFINE_PROGMEM_ARRAY ( //
53
- uint32_t , factors,
53
+ uint64_t , factors,
54
54
{
55
- 0x40240000 , 0x00000000 , // 1e1
56
- 0x40590000 , 0x00000000 , // 1e2
57
- 0x40C38800 , 0x00000000 , // 1e4
58
- 0x4197D784 , 0x00000000 , // 1e8
59
- 0x4341C379 , 0x37E08000 , // 1e16
60
- 0x4693B8B5 , 0xB5056E17 , // 1e32
61
- 0x4D384F03 , 0xE93FF9F5 , // 1e64
62
- 0x5A827748 , 0xF9301D32 , // 1e128
63
- 0x75154FDD , 0x7F73BF3C // 1e256
55
+ 0x4024000000000000 , // 1e1
56
+ 0x4059000000000000 , // 1e2
57
+ 0x40C3880000000000 , // 1e4
58
+ 0x4197D78400000000 , // 1e8
59
+ 0x4341C37937E08000 , // 1e16
60
+ 0x4693B8B5B5056E17 , // 1e32
61
+ 0x4D384F03E93FF9F5 , // 1e64
62
+ 0x5A827748F9301D32 , // 1e128
63
+ 0x75154FDD7F73BF3C , // 1e256
64
64
});
65
- return forge (pgm_read (factors + 2 * index),
66
- pgm_read (factors + 2 * index + 1 ));
65
+ return forge (pgm_read (factors + index));
67
66
}
68
67
69
68
static T negativeBinaryPowerOfTen (int index) {
70
69
ARDUINOJSON_DEFINE_PROGMEM_ARRAY ( //
71
- uint32_t , factors,
70
+ uint64_t , factors,
72
71
{
73
- 0x3FB99999 , 0x9999999A , // 1e-1
74
- 0x3F847AE1 , 0x47AE147B , // 1e-2
75
- 0x3F1A36E2 , 0xEB1C432D , // 1e-4
76
- 0x3E45798E , 0xE2308C3A , // 1e-8
77
- 0x3C9CD2B2 , 0x97D889BC , // 1e-16
78
- 0x3949F623 , 0xD5A8A733 , // 1e-32
79
- 0x32A50FFD , 0x44F4A73D , // 1e-64
80
- 0x255BBA08 , 0xCF8C979D , // 1e-128
81
- 0x0AC80628 , 0x64AC6F43 // 1e-256
72
+ 0x3FB999999999999A , // 1e-1
73
+ 0x3F847AE147AE147B , // 1e-2
74
+ 0x3F1A36E2EB1C432D , // 1e-4
75
+ 0x3E45798EE2308C3A , // 1e-8
76
+ 0x3C9CD2B297D889BC , // 1e-16
77
+ 0x3949F623D5A8A733 , // 1e-32
78
+ 0x32A50FFD44F4A73D , // 1e-64
79
+ 0x255BBA08CF8C979D , // 1e-128
80
+ 0x0AC8062864AC6F43 // 1e-256
82
81
});
83
- return forge (pgm_read (factors + 2 * index),
84
- pgm_read (factors + 2 * index + 1 ));
82
+ return forge (pgm_read (factors + index));
85
83
}
86
84
87
85
static T negativeBinaryPowerOfTenPlusOne (int index) {
88
86
ARDUINOJSON_DEFINE_PROGMEM_ARRAY ( //
89
- uint32_t , factors,
87
+ uint64_t , factors,
90
88
{
91
- 0x3FF00000 , 0x00000000 , // 1e0
92
- 0x3FB99999 , 0x9999999A , // 1e-1
93
- 0x3F50624D , 0xD2F1A9FC , // 1e-3
94
- 0x3E7AD7F2 , 0x9ABCAF48 , // 1e-7
95
- 0x3CD203AF , 0x9EE75616 , // 1e-15
96
- 0x398039D6 , 0x65896880 , // 1e-31
97
- 0x32DA53FC , 0x9631D10D , // 1e-63
98
- 0x25915445 , 0x81B7DEC2 , // 1e-127
99
- 0x0AFE07B2 , 0x7DD78B14 // 1e-255
89
+ 0x3FF0000000000000 , // 1e0
90
+ 0x3FB999999999999A , // 1e-1
91
+ 0x3F50624DD2F1A9FC , // 1e-3
92
+ 0x3E7AD7F29ABCAF48 , // 1e-7
93
+ 0x3CD203AF9EE75616 , // 1e-15
94
+ 0x398039D665896880 , // 1e-31
95
+ 0x32DA53FC9631D10D , // 1e-63
96
+ 0x2591544581B7DEC2 , // 1e-127
97
+ 0x0AFE07B27DD78B14 // 1e-255
100
98
});
101
- return forge (pgm_read (factors + 2 * index),
102
- pgm_read (factors + 2 * index + 1 ));
99
+ return forge (pgm_read (factors + index));
103
100
}
104
101
105
102
static T nan () {
106
- return forge (0x7ff80000 , 0x00000000 );
103
+ return forge (0x7ff8000000000000 );
107
104
}
108
105
109
106
static T inf () {
110
- return forge (0x7ff00000 , 0x00000000 );
107
+ return forge (0x7ff0000000000000 );
111
108
}
112
109
113
110
static T highest () {
114
- return forge (0x7FEFFFFF , 0xFFFFFFFF );
111
+ return forge (0x7FEFFFFFFFFFFFFF );
115
112
}
116
113
117
114
template <typename TOut> // int64_t
118
115
static T highest_for (
119
116
typename enable_if<is_integral<TOut>::value && is_signed<TOut>::value &&
120
117
sizeof (TOut) == 8,
121
118
signed>::type* = 0) {
122
- return forge (0x43DFFFFF , 0xFFFFFFFF ); // 9.2233720368547748e+18
119
+ return forge (0x43DFFFFFFFFFFFFF ); // 9.2233720368547748e+18
123
120
}
124
121
125
122
template <typename TOut> // uint64_t
126
123
static T highest_for (
127
124
typename enable_if<is_integral<TOut>::value && is_unsigned<TOut>::value &&
128
125
sizeof (TOut) == 8,
129
126
unsigned>::type* = 0) {
130
- return forge (0x43EFFFFF , 0xFFFFFFFF ); // 1.8446744073709549568e+19
127
+ return forge (0x43EFFFFFFFFFFFFF ); // 1.8446744073709549568e+19
131
128
}
132
129
133
130
static T lowest () {
134
- return forge (0xFFEFFFFF , 0xFFFFFFFF );
131
+ return forge (0xFFEFFFFFFFFFFFFF );
135
132
}
136
133
137
134
// constructs a double floating point values from its binary representation
138
135
// we use this function to workaround platforms with single precision literals
139
136
// (for example, when -fsingle-precision-constant is passed to GCC)
140
- static T forge (uint32_t msb, uint32_t lsb ) {
141
- return alias_cast<T>(( uint64_t (msb) << 32 ) | lsb );
137
+ static T forge (uint64_t bits ) {
138
+ return alias_cast<T>(bits );
142
139
}
143
140
};
144
141
0 commit comments