[Libreoffice-commits] core.git: sal/rtl

Stephan Bergmann sbergman at redhat.com
Wed Nov 22 23:00:17 UTC 2017


 sal/rtl/math.cxx |   12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

New commits:
commit c24c32bf71b8e64bd0d36e511f554e1f6c015842
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Wed Nov 22 15:34:09 2017 +0100

    ofz#4366 Divide-by-zero
    
    Change-Id: I3d0eb3bb6a69d09e71ce8bf91051f66e204eb0df
    Reviewed-on: https://gerrit.libreoffice.org/45098
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/sal/rtl/math.cxx b/sal/rtl/math.cxx
index 997280784351..96c5843dcfea 100644
--- a/sal/rtl/math.cxx
+++ b/sal/rtl/math.cxx
@@ -34,6 +34,7 @@
 #include <algorithm>
 #include <cassert>
 #include <float.h>
+#include <limits>
 #include <limits.h>
 #include <math.h>
 #include <stdlib.h>
@@ -365,8 +366,15 @@ inline void doubleToString(typename T::String ** pResult,
     int nExp = 0;
     if ( fValue > 0.0 )
     {
-        nExp = static_cast< int >(floor(log10(fValue)));
-        fValue /= getN10Exp(nExp);
+        // Cap nExp at a small value beyond which "fValue /= N10Exp" would lose precision (or N10Exp
+        // might even be zero); that will produce output with the decimal point in a non-normalized
+        // position, but the current quality of output for such small values is probably abysmal,
+        // anyway:
+        nExp = std::max(
+            static_cast< int >(floor(log10(fValue))), std::numeric_limits<double>::min_exponent10);
+        double const N10Exp = getN10Exp(nExp);
+        assert(N10Exp != 0);
+        fValue /= N10Exp;
     }
 
     switch (eFormat)


More information about the Libreoffice-commits mailing list