Bug 2067 fixed: Scilab died when the Plot command is given a large numerical value 48/12648/5
Calixte DENIZET [Tue, 24 Sep 2013 14:42:09 +0000 (16:42 +0200)]
Change-Id: I53540de62841fe3754a63b5884ddf05d1b21cf6c

scilab/CHANGES_5.5.X
scilab/modules/graphic_objects/src/java/org/scilab/modules/graphic_objects/axes/Axes.java
scilab/modules/graphics/tests/nonreg_tests/bug_2067.tst

index 81f903e..6a63a49 100644 (file)
@@ -4,6 +4,8 @@
 Scilab Bug Fixes
 ================
 
+* Bug #2067 fixed - Scilab crashed when plot was called with a large numerical value.
+
 * Bug #4401 fixed - isnum did not recognize all constants or some complex numbers.
 
 * Bug #5016 fixed - condestsp could return different results when repeated calls were performed.
index 2768fdf..e4b1760 100644 (file)
@@ -1956,13 +1956,18 @@ public class Axes extends GraphicObject {
         Double[] bounds = getDataBounds();
         boolean eq = bounds[0].doubleValue() == bounds[1].doubleValue();
         if (getXAxisLogFlag()) {
-            bounds[0] = Math.log10(bounds[0]);
-            bounds[1] = Math.log10(bounds[1]);
-        }
-        if (eq) {
+            if (eq) {
+                bounds[0] = Math.log10(bounds[0]) - 1;
+                bounds[1] = bounds[0] + 2;
+            } else {
+                bounds[0] = Math.log10(bounds[0]);
+                bounds[1] = Math.log10(bounds[1]);
+            }
+        } else if (eq) {
             // Avoid to have same bounds.
-            bounds[0]--;
-            bounds[1]++;
+            double inc = getIncrement(bounds[0]);
+            bounds[0] -= inc;
+            bounds[1] += inc;
         }
 
         if (getXAxisLocationAsEnum() == AxisProperty.AxisLocation.ORIGIN) {
@@ -1975,12 +1980,17 @@ public class Axes extends GraphicObject {
 
         eq = bounds[2].doubleValue() == bounds[3].doubleValue();
         if (getYAxisLogFlag()) {
-            bounds[2] = Math.log10(bounds[2]);
-            bounds[3] = Math.log10(bounds[3]);
-        }
-        if (eq) {
-            bounds[2]--;
-            bounds[3]++;
+            if (eq) {
+                bounds[2] = Math.log10(bounds[2]) - 1;
+                bounds[3] = bounds[2] + 2;
+            } else {
+                bounds[2] = Math.log10(bounds[2]);
+                bounds[3] = Math.log10(bounds[3]);
+            }
+        } else if (eq) {
+            double inc = getIncrement(bounds[2]);
+            bounds[2] -= inc;
+            bounds[3] += inc;
         }
 
         if (getYAxisLocationAsEnum() == AxisProperty.AxisLocation.ORIGIN) {
@@ -1993,12 +2003,17 @@ public class Axes extends GraphicObject {
 
         eq = bounds[4].doubleValue() == bounds[5].doubleValue();
         if (getZAxisLogFlag()) {
-            bounds[4] = Math.log10(bounds[4]);
-            bounds[5] = Math.log10(bounds[5]);
-        }
-        if (eq) {
-            bounds[4]--;
-            bounds[5]++;
+            if (eq) {
+                bounds[4] = Math.log10(bounds[4]) - 1;
+                bounds[5] = bounds[4] + 2;
+            } else {
+                bounds[4] = Math.log10(bounds[4]);
+                bounds[5] = Math.log10(bounds[5]);
+            }
+        } else if (eq) {
+            double inc = getIncrement(bounds[4]);
+            bounds[4] -= inc;
+            bounds[5] += inc;
         }
 
         if (getZAxisLocationAsEnum() == AxisProperty.AxisLocation.ORIGIN) {
@@ -2018,6 +2033,12 @@ public class Axes extends GraphicObject {
         return bounds;
     }
 
+    private final double getIncrement(final double x) {
+        final int exponent = (int) (((Double.doubleToLongBits(x) & 0x7FF0000000000000L) >> 52) - 1023);
+
+        return Math.pow(2, Math.max(0, exponent - 52));
+    }
+
     /**
      * Round the bounds in the bounds array at the given index.
      * bounds[i] and bounds[i + 1 ] are rounded to be in the value written
index 515d244..ebb481f 100644 (file)
@@ -4,8 +4,6 @@
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
-// <-- NOT FIXED -->
-
 // <-- TEST WITH GRAPHIC -->
 
 // <-- Non-regression test for bug 2067 -->