diff --git a/src/ArduinoJson/Numbers/FloatTraits.hpp b/src/ArduinoJson/Numbers/FloatTraits.hpp
index 0af77f3b..94529a9c 100644
--- a/src/ArduinoJson/Numbers/FloatTraits.hpp
+++ b/src/ArduinoJson/Numbers/FloatTraits.hpp
@@ -116,6 +116,14 @@ struct FloatTraits {
return forge(0x7FEFFFFF, 0xFFFFFFFF);
}
+ static T highest_for(int64_t) {
+ return forge(0x43DFFFFF, 0xFFFFFFFF); // 9.2233720368547748e+18
+ }
+
+ static T highest_for(uint64_t) {
+ return forge(0x43EFFFFF, 0xFFFFFFFF); // 1.8446744073709549568e+19
+ }
+
static T lowest() {
return forge(0xFFEFFFFF, 0xFFFFFFFF);
}
@@ -212,6 +220,22 @@ struct FloatTraits {
return forge(0x7f7fffff);
}
+ static T highest_for(int32_t) {
+ return forge(0x4EFFFFFF); // 2.14748352E9
+ }
+
+ static T highest_for(uint32_t) {
+ return forge(0x4F7FFFFF); // 4.29496704E9
+ }
+
+ static T highest_for(int64_t) {
+ return forge(0x5EFFFFFF); // 9.22337148709896192E18
+ }
+
+ static T highest_for(uint64_t) {
+ return forge(0x5F7FFFFF); // 1.844674297419792384E19
+ }
+
static T lowest() {
return forge(0xFf7fffff);
}
diff --git a/src/ArduinoJson/Numbers/convertNumber.hpp b/src/ArduinoJson/Numbers/convertNumber.hpp
index 8f4c1af8..52a3f677 100644
--- a/src/ArduinoJson/Numbers/convertNumber.hpp
+++ b/src/ArduinoJson/Numbers/convertNumber.hpp
@@ -109,68 +109,20 @@ canConvertNumber(TIn value) {
}
// float32 -> int32
-template
-typename enable_if::value && sizeof(TIn) == 4 &&
- is_integral::value && is_signed::value &&
- sizeof(TOut) == 4,
- bool>::type
-canConvertNumber(TIn value) {
- return value >= numeric_limits::lowest() && value <= 2.14748352e+9f;
-}
-
// float32 -> uint32
-template
-typename enable_if::value && sizeof(TIn) == 4 &&
- is_integral::value && is_unsigned::value &&
- sizeof(TOut) == 4,
- bool>::type
-canConvertNumber(TIn value) {
- return value >= numeric_limits::lowest() && value <= 4.29496704e+9f;
-}
-
// float32 -> int64
-template
-typename enable_if::value && sizeof(TIn) == 4 &&
- is_integral::value && is_signed::value &&
- sizeof(TOut) == 8,
- bool>::type
-canConvertNumber(TIn value) {
- return value >= numeric_limits::lowest() && value <= 9.22337149e+18f;
-}
-
// float32 -> uint64
-template
-typename enable_if::value && sizeof(TIn) == 4 &&
- is_integral::value && is_unsigned::value &&
- sizeof(TOut) == 8,
- bool>::type
-canConvertNumber(TIn value) {
- return value >= numeric_limits::lowest() &&
- value <= 1.844674297419792384e+19f;
-}
-
// float64 -> int64
-template
-typename enable_if::value && sizeof(TIn) == 8 &&
- is_integral::value && is_signed::value &&
- sizeof(TOut) == 8,
- bool>::type
-canConvertNumber(TIn value) {
- return value >= numeric_limits::lowest() &&
- value <= FloatTraits::forge(
- 0x43DFFFFF, 0xFFFFFFFF); // 9.2233720368547748e+18
-}
-
// float64 -> uint64
template
-typename enable_if::value && sizeof(TIn) == 8 &&
- is_integral::value && is_unsigned::value &&
- sizeof(TOut) == 8,
+typename enable_if::value && is_integral::value &&
+ sizeof(TOut) >= sizeof(TIn),
bool>::type
canConvertNumber(TIn value) {
+ // Avoid error "9.22337e+18 is outside the range of representable values of
+ // type 'long'"
return value >= numeric_limits::lowest() &&
- value <= FloatTraits::forge(
- 0x43EFFFFF, 0xFFFFFFFF); // 1.8446744073709549568e+19
+ value <= FloatTraits::highest_for(TOut());
}
template