* Bug #14396 fixed - real number display was not proper for very wide decimal parts 39/17839/3
Pierre-Aime Agnel [Tue, 1 Mar 2016 17:16:01 +0000 (18:16 +0100)]
Change-Id: I6dbafe88c611be94725a75a88eabaf866ab5665f

scilab/CHANGES
scilab/modules/ast/src/cpp/types/tostring_common.cpp
scilab/modules/ast/tests/nonreg_tests/bug_14396.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/nonreg_tests/bug_14396.tst [new file with mode: 0644]

index ca1c234..862993d 100644 (file)
@@ -361,6 +361,8 @@ In 6.0.0:
 
 * Bug #14389 fixed - Updated int8(), type(), typeof(), overloading(), iconvert() and inttype() help pages. Added int64() and uint64() descriptions.
 
+* Bug #14396 fixed - real number display was not proper for very wide decimal parts
+
 * Bug #14415 fixed - Corrected some spellings error in help pages
 
 * Bug #14416 fixed - The file extension filter in Scinotes "Save as" window did not re-used the active file's extension when applicable.
index bd97a4e..e749239 100644 (file)
@@ -242,10 +242,12 @@ void addDoubleValue(std::wostringstream * _postr, double _dblVal, DoubleFormat *
         }
         else
         {
+            // PLUS_SIGN "+" is not written by default
             pSign = L"";
         }
     }
 
+    // Step 1: BLANK and SIGN in pwstSign
     os_swprintf(pwstSign, 32, L"%ls%ls", pBlank, pSign);
 
     if (ISNAN(_dblVal))
@@ -260,18 +262,37 @@ void addDoubleValue(std::wostringstream * _postr, double _dblVal, DoubleFormat *
     }
     else if (_pDF->bExp)
     {
+        // Prints the exponent part 1.543D+03 for example
         double dblAbs = fabs(_dblVal);
         double dblDec = 0;
         double dblEnt = 0;
         double dblTemp = 0;
 
+        // modf returns the fractional par in dblDec
+        // and stores the pointer to the integral part in dblEnt
         dblDec = std::modf(dblAbs, &dblEnt);
         if (dblEnt == 0)
         {
-            dblTemp = std::floor(std::log10(dblDec));
+            // The integral part in 0
+            // the number in between 0 and 1 in absolute value
+            // dblTemp stores the position of the significant digit
+            // floor(log10(0.01)) = -2
+            // floor(log10(0.00123)) = -3
+            // floor(log10(0.0015)) = -3
+            if (dblDec != 0)
+            {
+                dblTemp = std::floor(std::log10(dblDec));
+            }
+            else
+            {
+                dblTemp = 0;
+            }
         }
         else
         {
+            // dblTemp stores the number of digit of the integral part minus one
+            // log10(15) = 1.176
+            // log10(1530) = 3.185
             dblTemp = std::log10(dblEnt);
         }
 
@@ -280,11 +301,11 @@ void addDoubleValue(std::wostringstream * _postr, double _dblVal, DoubleFormat *
 
         if (_pDF->bPrintPoint)
         {
-            os_swprintf(pwstFormat, 32, L"%ls%%#d.%%0%dldD%%+.02d", pwstSign, _pDF->iPrec);
+            os_swprintf(pwstFormat, 32, L"%ls%%#d.%%0%dlldD%%+.02d", pwstSign, _pDF->iPrec);
         }
         else
         {
-            os_swprintf(pwstFormat, 32, L"%ls%%d%%0%dldD%%+.02d", pwstSign, _pDF->iPrec);
+            os_swprintf(pwstFormat, 32, L"%ls%%d%%0%dlldD%%+.02d", pwstSign, _pDF->iPrec);
         }
 
         if ((long long int)std::round(dblDec) != (long long int)dblDec)
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14396.dia.ref b/scilab/modules/ast/tests/nonreg_tests/bug_14396.dia.ref
new file mode 100644 (file)
index 0000000..054d7f5
--- /dev/null
@@ -0,0 +1,36 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14396 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14396
+//
+// <-- Short Description -->
+// Display of real number with exponent was wrong
+format("v");
+format(10);
+a = 1.e-10;
+disp(a) // for dia.ref
+   1.000D-10
+str = "1.000D-10";
+assert_checkequal(string(a), str);
+format("e");
+format(10);
+a = 0;
+str = "0.000D+00"; // 9 characters + sign
+disp(0); // for dia.ref
+   0.000D+00
+assert_checkequal(string(a), str);
+format("v");
+format(18);
+a = 12345678900000012;
+disp(a) // for dia.ref
+   1.23456789000D+16
+str = "1.23456789000D+16";
+assert_checkequal(string(a), str);
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14396.tst b/scilab/modules/ast/tests/nonreg_tests/bug_14396.tst
new file mode 100644 (file)
index 0000000..acacd46
--- /dev/null
@@ -0,0 +1,39 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14396 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14396
+//
+// <-- Short Description -->
+// Display of real number with exponent was wrong
+
+format("v");
+format(10);
+
+a = 1.e-10;
+disp(a) // for dia.ref
+str = "1.000D-10";
+assert_checkequal(string(a), str);
+
+format("e");
+format(10);
+
+a = 0;
+str = "0.000D+00"; // 9 characters + sign
+disp(0); // for dia.ref
+assert_checkequal(string(a), str);
+
+format("v");
+format(18);
+a = 12345678900000012;
+disp(a) // for dia.ref
+str = "1.23456789000D+16";
+
+assert_checkequal(string(a), str);