Le 2015-05-04 14:48, Thomas Neidhart a écrit :
Problem still remains, see here:
https://builds.apache.org/job/Commons%20Math%20H10/49/console

The test failures only occur on the following slaves it seems:

 * H10
 * ubuntu-2

This looks like what happened a few months ago then.

I will try to look at it. As we are only able to reproduce this on this
build system, I guess this implies committing lots of small changes (with
System.out.println and the like) and triggering a custom buid from the
Jenkins configuration above. I can do that, but wonder if there is another
way without committing the tests in the master branch. Can we set up an
h10-builds branch that would be used by the job above and would be ignored
by the regular job ?

If I remember well, when the previous problem arose even putting simple print statements in the code made the bug appear and disappear without control.

best regards,
Luc


Thomas


On Mon, May 4, 2015 at 1:43 PM, <l...@apache.org> wrote:

Repository: commons-math
Updated Branches:
  refs/heads/master c8cb75243 -> c771c0080


Attempt to circumvent some errors which seem to be platform-dependent.

The Jenkins build often fails on code that seems to be perfectly
correct. Failures also do no always happen so they may depend on
platform. There were similar problems a few months ago that were
probably related to JIT bugs.

This fix simply tries to do the same thing as before, but with an
earlier detection of NaN in one case, and by comparing directly the bits
representation in another case, to avoid wrong optimizations.

Project: http://git-wip-us.apache.org/repos/asf/commons-math/repo
Commit:
http://git-wip-us.apache.org/repos/asf/commons-math/commit/c771c008
Tree: http://git-wip-us.apache.org/repos/asf/commons-math/tree/c771c008 Diff: http://git-wip-us.apache.org/repos/asf/commons-math/diff/c771c008

Branch: refs/heads/master
Commit: c771c0080b08abd80418c4e88f1be3efec828f0a
Parents: c8cb752
Author: Luc Maisonobe <l...@apache.org>
Authored: Mon May 4 13:43:27 2015 +0200
Committer: Luc Maisonobe <l...@apache.org>
Committed: Mon May 4 13:43:27 2015 +0200

----------------------------------------------------------------------
.../org/apache/commons/math4/util/FastMath.java | 28 +++++++++-----------
 .../apache/commons/math4/util/FastMathTest.java |  4 +--
 2 files changed, 15 insertions(+), 17 deletions(-)
----------------------------------------------------------------------



http://git-wip-us.apache.org/repos/asf/commons-math/blob/c771c008/src/main/java/org/apache/commons/math4/util/FastMath.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/math4/util/FastMath.java
b/src/main/java/org/apache/commons/math4/util/FastMath.java
index 24bb857..fcd03ea 100644
--- a/src/main/java/org/apache/commons/math4/util/FastMath.java
+++ b/src/main/java/org/apache/commons/math4/util/FastMath.java
@@ -315,6 +315,9 @@ public class FastMath {
     /** Mask used to clear the non-sign part of a long. */
private static final long MASK_NON_SIGN_LONG = 0x7fffffffffffffffl;

+    /** Bits representation of +1.0. */
+    private static final long PLUS_ONE_BITS = 0x3ff0000000000000L;
+
/** 2^52 - double numbers this large must be integral (no fraction)
or NaN or Infinite */
     private static final double TWO_POWER_52 = 4503599627370496.0;
     /** 2^53 - double numbers this large must be even. */
@@ -1468,6 +1471,10 @@ public class FastMath {
             return x;
         }

+        if (y != y) { // Y is NaN
+            return y;
+        }
+
         if (x == 0) {
             long bits = Double.doubleToRawLongBits(x);
             if ((bits & 0x8000000000000000L) != 0) {
@@ -1485,18 +1492,13 @@ public class FastMath {

             if (y < 0) {
                 return Double.POSITIVE_INFINITY;
-            }
-            if (y > 0) {
+            } else {
                 return 0.0;
             }

-            return Double.NaN;
         }

         if (x == Double.POSITIVE_INFINITY) {
-            if (y != y) { // y is NaN
-                return y;
-            }
             if (y < 0.0) {
                 return 0.0;
             } else {
@@ -1505,21 +1507,17 @@ public class FastMath {
         }

         if (y == Double.POSITIVE_INFINITY) {
-            if (x * x == 1.0) {
-                return Double.NaN;
-            }
-
-            if (x * x > 1.0) {
+            long bitsAbsX = MASK_NON_SIGN_LONG &
Double.doubleToRawLongBits(x);
+            if (bitsAbsX > PLUS_ONE_BITS) {
                 return Double.POSITIVE_INFINITY;
-            } else {
+            } else if (bitsAbsX < PLUS_ONE_BITS) {
                 return 0.0;
+            } else {
+                return Double.NaN;
             }
         }

         if (x == Double.NEGATIVE_INFINITY) {
-            if (y != y) { // y is NaN
-                return y;
-            }

             if (y < 0) {
                 long yi = (long) y;


http://git-wip-us.apache.org/repos/asf/commons-math/blob/c771c008/src/test/java/org/apache/commons/math4/util/FastMathTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/math4/util/FastMathTest.java
b/src/test/java/org/apache/commons/math4/util/FastMathTest.java
index 5d36fea..06a1d07 100644
--- a/src/test/java/org/apache/commons/math4/util/FastMathTest.java
+++ b/src/test/java/org/apache/commons/math4/util/FastMathTest.java
@@ -29,8 +29,6 @@ import
org.apache.commons.math4.exception.MathArithmeticException;
 import org.apache.commons.math4.random.MersenneTwister;
 import org.apache.commons.math4.random.RandomGenerator;
 import org.apache.commons.math4.random.Well1024a;
-import org.apache.commons.math4.util.FastMath;
-import org.apache.commons.math4.util.Precision;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Ignore;
@@ -393,6 +391,8 @@ public class FastMathTest {

         Assert.assertTrue("pow(-2.0, 3.5) should be NaN",
Double.isNaN(FastMath.pow(-2.0, 3.5)));

+        Assert.assertTrue("pow(-0.0, NaN) should be NaN",
Double.isNaN(FastMath.pow(-0.0, Double.NaN)));
+
         // Added tests for a 100% coverage

         Assert.assertTrue("pow(+Inf, NaN) should be NaN",
Double.isNaN(FastMath.pow(Double.POSITIVE_INFINITY, Double.NaN)));



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to