Author: luc Date: Sun Oct 26 07:55:45 2008 New Revision: 708001 URL: http://svn.apache.org/viewvc?rev=708001&view=rev Log: Added a scalb method in MathUtils. This method is similar to the method with same name added in java.lang.Math as of Java 6.
Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/util/MathUtils.java commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/util/MathUtilsTest.java Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/util/MathUtils.java URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/util/MathUtils.java?rev=708001&r1=708000&r2=708001&view=diff ============================================================================== --- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/util/MathUtils.java (original) +++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/util/MathUtils.java Sun Oct 26 07:55:45 2008 @@ -713,6 +713,33 @@ } /** + * Scale a number by 2<sup>scaleFactor</sup>. + * <p>If <code>d</code> is 0 or NaN or Infinite, it is returned unchanged.</p> + * + * @param d base number + * @param scaleFactor power of two by which d sould be multiplied + * @return d × 2<sup>scaleFactor</sup> + * @since 2.0 + */ + public static double scalb(final double d, final int scaleFactor) { + + // handling of some important special cases + if ((d == 0) || Double.isNaN(d) || Double.isInfinite(d)) { + return d; + } + + // split the double in raw components + final long bits = Double.doubleToLongBits(d); + final long exponent = bits & 0x7ff0000000000000L; + final long rest = bits & 0x800fffffffffffffL; + + // shift the exponent + final long newBits = rest | (exponent + (((long) scaleFactor) << 52)); + return Double.longBitsToDouble(newBits); + + } + + /** * Normalize an angle in a 2&pi wide interval around a center value. * <p>This method has three main uses:</p> * <ul> Modified: commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml?rev=708001&r1=708000&r2=708001&view=diff ============================================================================== --- commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml (original) +++ commons/proper/math/branches/MATH_2_0/src/site/xdoc/changes.xml Sun Oct 26 07:55:45 2008 @@ -39,6 +39,10 @@ </properties> <body> <release version="2.0" date="TBD" description="TBD"> + <action dev="luc" type="add" > + Added a scalb method in MathUtils. This method is similar to the method + with same name added in java.lang.Math as of Java 6. + </action> <action dev="brentworden" type="fix" issue="MATH-227" due-to="Joerg Henning"> Fixed F distribution inverse CDF computation for small denominator degrees of freedom. </action> Modified: commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/util/MathUtilsTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/util/MathUtilsTest.java?rev=708001&r1=708000&r2=708001&view=diff ============================================================================== --- commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/util/MathUtilsTest.java (original) +++ commons/proper/math/branches/MATH_2_0/src/test/org/apache/commons/math/util/MathUtilsTest.java Sun Oct 26 07:55:45 2008 @@ -521,6 +521,16 @@ assertEquals(0, MathUtils.nextAfter(-Double.MIN_VALUE, 1), 0); } + public void testScalb() { + assertEquals( 0.0, MathUtils.scalb(0.0, 5), 1.0e-15); + assertEquals(32.0, MathUtils.scalb(1.0, 5), 1.0e-15); + assertEquals(1.0 / 32.0, MathUtils.scalb(1.0, -5), 1.0e-15); + assertEquals(Math.PI, MathUtils.scalb(Math.PI, 0), 1.0e-15); + assertTrue(Double.isInfinite(MathUtils.scalb(Double.POSITIVE_INFINITY, 1))); + assertTrue(Double.isInfinite(MathUtils.scalb(Double.NEGATIVE_INFINITY, 1))); + assertTrue(Double.isNaN(MathUtils.scalb(Double.NaN, 1))); + } + public void testNormalizeAngle() { for (double a = -15.0; a <= 15.0; a += 0.1) { for (double b = -15.0; b <= 15.0; b += 0.2) {