From 3d6240ba1b4f6f33a27b9eed7e51286f95d4cbe9 Mon Sep 17 00:00:00 2001
From: Paul Sokolovsky <pfalcon@users.sourceforge.net>
Date: Sun, 22 Nov 2015 20:02:16 +0200
Subject: [PATCH] py/formatfloat: Handle calculation of integer digit for %f
 format properly.

%f prints true integer digit, so its calculation should happen before any
exponential scaling.
---
 py/formatfloat.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/py/formatfloat.c b/py/formatfloat.c
index ec9090652..78e38831c 100644
--- a/py/formatfloat.c
+++ b/py/formatfloat.c
@@ -170,6 +170,15 @@ int mp_format_float(FPTYPE f, char *buf, size_t buf_size, char fmt, int prec, ch
             num_digits = prec + 1;
         }
     } else if (fp_isless1(f)) {
+        // We need to figure out what an integer digit will be used
+        // in case 'f' is used (or we revert other format to it below).
+        // As we just tested number to be <1, this is obviously 0,
+        // but we can round it up to 1 below.
+        char first_dig = '0';
+        if (f >= FPROUND_TO_ONE) {
+            first_dig = '1';
+        }
+
         // Build negative exponent
         for (e = 0, e1 = FPDECEXP; e1; e1 >>= 1, pos_pow++, neg_pow++) {
             if (*neg_pow > f) {
@@ -177,14 +186,9 @@ int mp_format_float(FPTYPE f, char *buf, size_t buf_size, char fmt, int prec, ch
                 f *= *pos_pow;
             }
         }
-        char first_dig = '0';
         char e_sign_char = '-';
         if (fp_isless1(f) && f >= FPROUND_TO_ONE) {
             f = FPCONST(1.0);
-            if (e > 1) {
-                // numbers less than 1.0 start with 0.xxx
-                first_dig = '1'; 
-            }
             if (e == 0) {
                 e_sign_char = '+';
             }
-- 
GitLab