diff --git a/CHANGELOG.md b/CHANGELOG.md
index cc8ebffc..9fd159de 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@ HEAD
 ----
 
 * Disabled lazy number deserialization (issue #772)
+* Improved float serialization when `-fsingle-precision-constant` is used
 
 > ### BREAKING CHANGES
 >
diff --git a/src/ArduinoJson/Numbers/FloatTraits.hpp b/src/ArduinoJson/Numbers/FloatTraits.hpp
index a6ebcc12..3e3dd578 100644
--- a/src/ArduinoJson/Numbers/FloatTraits.hpp
+++ b/src/ArduinoJson/Numbers/FloatTraits.hpp
@@ -44,28 +44,46 @@ struct FloatTraits {
 
   static T positiveBinaryPowerOfTen(int index) {
     static T factors[] = {
-        1e1, 1e2, 1e4, 1e8, 1e16, 1e32,
-        // workaround to support platforms with single precision literals
-        forge(0x4D384F03, 0xE93FF9F5), forge(0x5A827748, 0xF9301D32),
-        forge(0x75154FDD, 0x7F73BF3C)};
+        1e1,
+        1e2,
+        1e4,
+        1e8,
+        1e16,
+        forge(0x4693B8B5, 0xB5056E17),  // 1e32
+        forge(0x4D384F03, 0xE93FF9F5),  // 1e64
+        forge(0x5A827748, 0xF9301D32),  // 1e128
+        forge(0x75154FDD, 0x7F73BF3C)   // 1e256
+    };
     return factors[index];
   }
 
   static T negativeBinaryPowerOfTen(int index) {
     static T factors[] = {
-        1e-1, 1e-2, 1e-4, 1e-8, 1e-16, 1e-32,
-        // workaround to support platforms with single precision literals
-        forge(0x32A50FFD, 0x44F4A73D), forge(0x255BBA08, 0xCF8C979D),
-        forge(0x0AC80628, 0x64AC6F43)};
+        forge(0x3FB99999, 0x9999999A),  // 1e-1
+        forge(0x3F847AE1, 0x47AE147B),  // 1e-2
+        forge(0x3F1A36E2, 0xEB1C432D),  // 1e-4
+        forge(0x3E45798E, 0xE2308C3A),  // 1e-8
+        forge(0x3C9CD2B2, 0x97D889BC),  // 1e-16
+        forge(0x3949F623, 0xD5A8A733),  // 1e-32
+        forge(0x32A50FFD, 0x44F4A73D),  // 1e-64
+        forge(0x255BBA08, 0xCF8C979D),  // 1e-128
+        forge(0x0AC80628, 0x64AC6F43)   // 1e-256
+    };
     return factors[index];
   }
 
   static T negativeBinaryPowerOfTenPlusOne(int index) {
     static T factors[] = {
-        1e0, 1e-1, 1e-3, 1e-7, 1e-15, 1e-31,
-        // workaround to support platforms with single precision literals
-        forge(0x32DA53FC, 0x9631D10D), forge(0x25915445, 0x81B7DEC2),
-        forge(0x0AFE07B2, 0x7DD78B14)};
+        1e0,
+        forge(0x3FB99999, 0x9999999A),  // 1e-1
+        forge(0x3F50624D, 0xD2F1A9FC),  // 1e-3
+        forge(0x3E7AD7F2, 0x9ABCAF48),  // 1e-7
+        forge(0x3CD203AF, 0x9EE75616),  // 1e-15
+        forge(0x398039D6, 0x65896880),  // 1e-31
+        forge(0x32DA53FC, 0x9631D10D),  // 1e-63
+        forge(0x25915445, 0x81B7DEC2),  // 1e-127
+        forge(0x0AFE07B2, 0x7DD78B14)   // 1e-255
+    };
     return factors[index];
   }
 
@@ -77,6 +95,9 @@ struct FloatTraits {
     return forge(0x7ff00000, 0x00000000);
   }
 
+  // constructs a double floating point values from its binary representation
+  // we use this function to workaround platforms with single precision literals
+  // (for example, when -fsingle-precision-constant is passed to GCC)
   static T forge(uint32_t msb, uint32_t lsb) {
     union {
       uint64_t integerBits;