You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2011/11/17 15:33:10 UTC

svn commit: r1203205 - in /commons/proper/math/trunk/src: main/java/org/apache/commons/math/util/Precision.java test/java/org/apache/commons/math/util/PrecisionTest.java

Author: erans
Date: Thu Nov 17 14:33:10 2011
New Revision: 1203205

URL: http://svn.apache.org/viewvc?rev=1203205&view=rev
Log:
MATH-708.
New utility method.

Modified:
    commons/proper/math/trunk/src/main/java/org/apache/commons/math/util/Precision.java
    commons/proper/math/trunk/src/test/java/org/apache/commons/math/util/PrecisionTest.java

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math/util/Precision.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/util/Precision.java?rev=1203205&r1=1203204&r2=1203205&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math/util/Precision.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math/util/Precision.java Thu Nov 17 14:33:10 2011
@@ -473,4 +473,24 @@ public class Precision {
         }
         return unscaled;
     }
+
+
+    /**
+     * Computes a number {@code delta} close to {@code originalDelta} with
+     * the property that <pre><code>
+     *   x + delta - x
+     * </code></pre>
+     * is exactly machine-representable.
+     * This is useful when computing numerical derivatives, in order to reduce
+     * roundoff errors.
+     *
+     * @param x Value.
+     * @param originalDelta Offset value.
+     * @return a number {@code delta} so that {@code x + delta} and {@code x}
+     * differ by a representable floating number.
+     */
+    public static double representableDelta(double x,
+                                            double originalDelta) {
+        return x + originalDelta - x;
+    }
 }

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math/util/PrecisionTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/util/PrecisionTest.java?rev=1203205&r1=1203204&r2=1203205&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math/util/PrecisionTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math/util/PrecisionTest.java Thu Nov 17 14:33:10 2011
@@ -464,4 +464,22 @@ public class PrecisionTest {
         Assert.assertEquals(Float.POSITIVE_INFINITY, Precision.round(Float.POSITIVE_INFINITY, 2), 0.0f);
         Assert.assertEquals(Float.NEGATIVE_INFINITY, Precision.round(Float.NEGATIVE_INFINITY, 2), 0.0f);
     }
+
+
+    @Test
+    public void testRepresentableDelta() {
+        int totalCount = 0;
+        int nonRepresentableCount = 0;
+        final double x = 100;
+        final int numTrials = 10000;
+        for (int i = 0; i < numTrials; i++) {
+            final double originalDelta = Math.random();
+            final double delta = Precision.representableDelta(x, originalDelta);
+            if (delta != originalDelta) {
+                ++nonRepresentableCount;
+            }
+        }
+
+        Assert.assertTrue(nonRepresentableCount / (double) numTrials > 0.9);
+    }
 }