From 3ee93983739c7676e7161ac3610583fc03e972b3 Mon Sep 17 00:00:00 2001
From: Thomas Sarlandie <thomas@sarlandie.net>
Date: Mon, 3 Jul 2017 09:27:24 -0700
Subject: [PATCH] Fix #544: force large constants to double type

This helps when the compiler option `-fsingle-precision-constant` is
set (teensy 3.x).
---
 src/ArduinoJson/Polyfills/normalize.hpp    | 24 +++++++++++-----------
 src/ArduinoJson/TypeTraits/FloatTraits.hpp |  8 ++++----
 2 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/src/ArduinoJson/Polyfills/normalize.hpp b/src/ArduinoJson/Polyfills/normalize.hpp
index 5004b766..c994e2f0 100644
--- a/src/ArduinoJson/Polyfills/normalize.hpp
+++ b/src/ArduinoJson/Polyfills/normalize.hpp
@@ -17,16 +17,16 @@ int16_t normalize(T& value) {
 
   if (value >= ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD) {
 #if ARDUINOJSON_DOUBLE_IS_64BITS
-    if (value >= 1e256) {
-      value /= 1e256;
+    if (value >= 1e256L) {
+      value /= 1e256L;
       powersOf10 = int16_t(powersOf10 + 256);
     }
-    if (value >= 1e128) {
-      value /= 1e128;
+    if (value >= 1e128L) {
+      value /= 1e128L;
       powersOf10 = int16_t(powersOf10 + 128);
     }
-    if (value >= 1e64) {
-      value /= 1e64;
+    if (value >= 1e64L) {
+      value /= 1e64L;
       powersOf10 = int16_t(powersOf10 + 64);
     }
 #endif
@@ -58,16 +58,16 @@ int16_t normalize(T& value) {
 
   if (value > 0 && value <= ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD) {
 #if ARDUINOJSON_DOUBLE_IS_64BITS
-    if (value < 1e-255) {
-      value *= 1e256;
+    if (value < 1e-255L) {
+      value *= 1e256L;
       powersOf10 = int16_t(powersOf10 - 256);
     }
-    if (value < 1e-127) {
-      value *= 1e128;
+    if (value < 1e-127L) {
+      value *= 1e128L;
       powersOf10 = int16_t(powersOf10 - 128);
     }
-    if (value < 1e-63) {
-      value *= 1e64;
+    if (value < 1e-63L) {
+      value *= 1e64L;
       powersOf10 = int16_t(powersOf10 - 64);
     }
 #endif
diff --git a/src/ArduinoJson/TypeTraits/FloatTraits.hpp b/src/ArduinoJson/TypeTraits/FloatTraits.hpp
index 28fa261f..0af1f57a 100644
--- a/src/ArduinoJson/TypeTraits/FloatTraits.hpp
+++ b/src/ArduinoJson/TypeTraits/FloatTraits.hpp
@@ -34,13 +34,13 @@ struct FloatTraits<T, 8 /*64bits*/> {
     if (e >= 0)
       return m * (e & 1 ? 1e1 : 1) * (e & 2 ? 1e2 : 1) * (e & 4 ? 1e4 : 1) *
              (e & 8 ? 1e8 : 1) * (e & 16 ? 1e16 : 1) * (e & 32 ? 1e32 : 1) *
-             (e & 64 ? 1e64 : 1) * (e & 128 ? 1e128 : 1) *
-             (e & 256 ? 1e256 : 1);
+             (e & 64 ? 1e64L : 1) * (e & 128 ? 1e128L : 1) *
+             (e & 256 ? 1e256L : 1);
     e = TExponent(-e);
     return m * (e & 1 ? 1e-1 : 1) * (e & 2 ? 1e-2 : 1) * (e & 4 ? 1e-4 : 1) *
            (e & 8 ? 1e-8 : 1) * (e & 16 ? 1e-16 : 1) * (e & 32 ? 1e-32 : 1) *
-           (e & 64 ? 1e-64 : 1) * (e & 128 ? 1e-128 : 1) *
-           (e & 256 ? 1e-256 : 1);
+           (e & 64 ? 1e-64L : 1) * (e & 128 ? 1e-128L : 1) *
+           (e & 256 ? 1e-256L : 1);
   }
 
   static T nan() {
-- 
GitLab