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);
+ }
}