Le 2012-08-09 13:50, Gilles Sadowski a écrit :
Hi.

Hi Gilles,


On Thu, Aug 09, 2012 at 08:07:25AM -0000, l...@apache.org wrote:
Author: luc
Date: Thu Aug  9 08:07:25 2012
New Revision: 1371082

URL: http://svn.apache.org/viewvc?rev=1371082&view=rev
Log:
added a function to raise a double to an int power

Modified:
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/util/FastMath.java

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/util/FastMath.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/util/FastMath.java?rev=1371082&r1=1371081&r2=1371082&view=diff

==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/util/FastMath.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/util/FastMath.java Thu Aug 9 08:07:25 2012
@@ -1582,6 +1582,34 @@ public class FastMath {


     /**
+     * Raise a double to an int power.
+     *
+     * @param d Number to raise.
+     * @param e Exponent.
+     * @return d<sup>e</sup>
+     */
+    public static double pow(double d, int e) {
+        if (e == 0) {
+            return 1.0;
+        } else if (e < 0) {
+            e = -e;
+            d = 1.0 / d;
+        }
+
+        double result = 1;
+        double d2p    = d;
+        while (e != 0) {
+            if ((e & 0x1) != 0) {
+                result *= d2p;
+            }
+            d2p *= d2p;
+            e = e >> 1;
+        }
+
+        return result;
+    }

I've added a unit test for this function. It shows that the result is not the same as with "pow(double, double)" (cf. tolerance in "assertEquals"). I didn't check which one is more accurate, but I thought that we should be
aware of the discrepancy.

I have checked this further. The pow(double, double) seems to be always slightly better than pow(double, int). I have used a comparison with Dfp set up at 60 digits and 100 digits too. I have also checked depending on the initial number being representable
or not.

I expected the method to be slightly more accurate for small powers (say up to 20) and most importantly be much faster. The first part of my assumption is not true, so it is a major
drawback. Even for very small powers I quickly have one ulp.

I'll take a further look at the current speed of pow(double,double) and if it is reasonable, I'll remove the new method. Adding a method that decreases accuracy is never good.

Thanks for having looked at this;

best regards,
Luc



Regards,
Gilles

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


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

Reply via email to