8000 Use 64-bits literals to forge 64-bits literals · smartcoder00/ArduinoJson@26948cb · GitHub
[go: up one dir, main page]

Skip to content

Commit 26948cb

Browse files
committed
Use 64-bits literals to forge 64-bits literals
1 parent 0f8698e commit 26948cb

File tree

2 files changed

+49
-44
lines changed

2 files changed

+49
-44
lines changed

src/ArduinoJson/Numbers/FloatTraits.hpp

Lines changed: 41 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -50,95 +50,92 @@ struct FloatTraits<T, 8 /*64bits*/> {
5050

5151
static T positiveBinaryPowerOfTen(int index) {
5252
ARDUINOJSON_DEFINE_PROGMEM_ARRAY( //
53-
uint32_t, factors,
53+
uint64_t, factors,
5454
{
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
6464
});
65-
return forge(pgm_read(factors + 2 * index),
66-
pgm_read(factors + 2 * index + 1));
65+
return forge(pgm_read(factors + index));
6766
}
6867

6968
static T negativeBinaryPowerOfTen(int index) {
7069
ARDUINOJSON_DEFINE_PROGMEM_ARRAY( //
71-
uint32_t, factors,
70+
uint64_t, factors,
7271
{
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
8281
});
83-
return forge(pgm_read(factors + 2 * index),
84-
pgm_read(factors + 2 * index + 1));
82+
return forge(pgm_read(factors + index));
8583
}
8684

8785
static T negativeBinaryPowerOfTenPlusOne(int index) {
8886
ARDUINOJSON_DEFINE_PROGMEM_ARRAY( //
89-
uint32_t, factors,
87+
uint64_t, factors,
9088
{
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
10098
});
101-
return forge(pgm_read(factors + 2 * index),
102-
pgm_read(factors + 2 * index + 1));
99+
return forge(pgm_read(factors + index));
103100
}
104101

105102
static T nan() {
106-
return forge(0x7ff80000, 0x00000000);
103+
return forge(0x7ff8000000000000);
107104
}
108105

109106
static T inf() {
110-
return forge(0x7ff00000, 0x00000000);
107+
return forge(0x7ff0000000000000);
111108
}
112109

113110
static T highest() {
114-
return forge(0x7FEFFFFF, 0xFFFFFFFF);
111+
return forge(0x7FEFFFFFFFFFFFFF);
115112
}
116113

117114
template <typename TOut> // int64_t
118115
static T highest_for(
119116
typename enable_if<is_integral<TOut>::value && is_signed<TOut>::value &&
120117
sizeof(TOut) == 8,
121118
signed>::type* = 0) {
122-
return forge(0x43DFFFFF, 0xFFFFFFFF); // 9.2233720368547748e+18
119+
return forge(0x43DFFFFFFFFFFFFF); // 9.2233720368547748e+18
123120
}
124121

125122
template <typename TOut> // uint64_t
126123
static T highest_for(
127124
typename enable_if<is_integral<TOut>::value && is_unsigned<TOut>::value &&
128125
sizeof(TOut) == 8,
129126
unsigned>::type* = 0) {
130-
return forge(0x43EFFFFF, 0xFFFFFFFF); // 1.8446744073709549568e+19
127+
return forge(0x43EFFFFFFFFFFFFF); // 1.8446744073709549568e+19
131128
}
132129

133130
static T lowest() {
134-
return forge(0xFFEFFFFF, 0xFFFFFFFF);
131+
return forge(0xFFEFFFFFFFFFFFFF);
135132
}
136133

137134
// constructs a double floating point values from its binary representation
138135
// we use this function to workaround platforms with single precision literals
139136
// (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);
142139
}
143140
};
144141

src/ArduinoJson/Polyfills/pgmspace_generic.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ inline const T* pgm_read(const T* const* p) {
2828
inline uint32_t pgm_read(const uint32_t* p) {
2929
return pgm_read_dword(p);
3030
}
31+
32+
template <typename T>
33+
inline T pgm_read(const T* p) {
34+
T result;
35+
memcpy_P(&result, p, sizeof(T));
36+
return result;
37+
}
38+
3139
#else
3240

3341
# ifndef ARDUINOJSON_DEFINE_PROGMEM_ARRAY

0 commit comments

Comments
 (0)
0