Author: sebb
Date: Fri Jan 21 03:23:13 2011
New Revision: 1061608
URL: http://svn.apache.org/viewvc?rev=1061608&view=rev
Log:
Fix overflows in acos calculation
Modified:
commons/proper/math/branches/MATH_2_X/src/main/java/org/apache/commons/math/util/FastMath.java
Modified:
commons/proper/math/branches/MATH_2_X/src/main/java/org/apache/commons/math/util/FastMath.java
URL:
http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_X/src/main/java/org/apache/commons/math/util/FastMath.java?rev=1061608&r1=1061607&r2=1061608&view=diff
==============================================================================
---
commons/proper/math/branches/MATH_2_X/src/main/java/org/apache/commons/math/util/FastMath.java
(original)
+++
commons/proper/math/branches/MATH_2_X/src/main/java/org/apache/commons/math/util/FastMath.java
Fri Jan 21 03:23:13 2011
@@ -3135,7 +3135,18 @@ public class FastMath {
// Compute ratio r = y/x
double r = y/x;
- temp = r * 1073741824.0;
+
+ // Did r overflow?
+ if (Double.isInfinite(r)) { // x is effectively zero
+ return Math.PI/2; // so return the appropriate value
+ }
+
+ if (abs(r) < Double.MAX_VALUE/1073741824.0){ // is it safe to split r ?
+ temp = r * 1073741824.0;
+ } else {
+ temp = 0.0;
+ }
+
double ra = r + temp - temp;
double rb = r - ra;