Author: nick
Date: Tue Apr 15 17:17:27 2008
New Revision: 648463

URL: http://svn.apache.org/viewvc?rev=648463&view=rev
Log:
Add MoreMath class

Added:
    commons/sandbox/me/trunk/src/org/apache/commons/me/lang/
    commons/sandbox/me/trunk/src/org/apache/commons/me/math/MoreMath.java   
(with props)
    commons/sandbox/me/trunk/test-src/org/apache/commons/me/lang/
    
commons/sandbox/me/trunk/test-src/org/apache/commons/me/math/TestMoreMath.java  
 (with props)
Modified:
    commons/sandbox/me/trunk/build-lib/   (props changed)
    commons/sandbox/me/trunk/src/org/apache/commons/me/util/ArrayHelper.java

Propchange: commons/sandbox/me/trunk/build-lib/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Tue Apr 15 17:17:27 2008
@@ -0,0 +1,3 @@
+junit-3.8.1.jar
+*.class
+*.swp

Added: commons/sandbox/me/trunk/src/org/apache/commons/me/math/MoreMath.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/me/trunk/src/org/apache/commons/me/math/MoreMath.java?rev=648463&view=auto
==============================================================================
--- commons/sandbox/me/trunk/src/org/apache/commons/me/math/MoreMath.java 
(added)
+++ commons/sandbox/me/trunk/src/org/apache/commons/me/math/MoreMath.java Tue 
Apr 15 17:17:27 2008
@@ -0,0 +1,160 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.commons.me.math;
+
+/**
+ * Fills in holes in the JavaME math libraries
+ */
+public class MoreMath {
+       /* Define some of our constants */
+       static final double PI = java.lang.Math.PI;
+    static final double HALF_PI = 1.5707963267948966135;
+    static final double NaN = (0.0/0.0);
+
+       // Various numbers based on the square root of two
+    static final double SQRT2    = 1.414213562373095048802e0;
+    static final double SQRT2_P1 = 2.414213562373095048802e0;
+    static final double SQRT2_M1 = 0.414213562373095048802e0;
+
+    // These are all used for the atan function
+    static final double p4  = 16.1536412982230228262;
+    static final double p3  = 268.42548195503973794141;
+    static final double p2  = 1153.0293515404850115428136;
+    static final double p1  = 1780.40631643319697105464587;
+    static final double p0  = 896.78597403663861959987488;
+    static final double q4  = 58.95697050844462222791;
+    static final double q3  = 536.265374031215315104235;
+    static final double q2  = 1666.7838148816337184521798;
+    static final double q1  = 2079.33497444540981287275926;
+    static final double q0  = 896.78597403663861962481162;
+
+       /**
+        * Implement the asin (arc-sine) function
+        */
+       public static double asin(double val) {
+               double work;
+               int sign;
+
+               // Work on positive numbers
+               sign = 0;
+               if(val < 0) {
+                       val = -val;
+                       sign++;
+               }
+
+               // Can't take the asin of a number >1 or <-1
+               if(val > 1) return NaN;
+
+               // Calculate
+               work = java.lang.Math.sqrt(1 - val*val);
+               if(val > 0.7) {
+                       work = HALF_PI - atan(work/val);
+               } else {
+                       work = atan(val/work);
+               }
+
+               // Fix the sign as needed
+               if(sign > 0) {
+                       work = -work;
+               }
+               return work;
+       }
+
+       /**
+        * Implement the acos (arc-cosine) function
+        */
+       public static double acos(double val) {
+               // Can't take the acos of a number >1 or <-1
+               if(val > 1 || val < -1) return NaN;
+
+               // Can implement acos off asin
+               return HALF_PI - asin(val);
+       }
+
+       /**
+        * Implement the atan (arc-tangent) function
+        */
+       public static double atan(double val) {
+               if(val > 0) {
+                       return scaling_atan(val);
+               }
+               return -scaling_atan( -val );
+    }
+
+       /**
+        * Implement the atan2 function, which
+        *  converts rectangular coordinates (x, y) to polar (r, theta)
+        */
+       public static double atan2(double val1, double val2) {
+               if(val1+val2 == val1) {
+                       if(val1 >= 0) {
+                               return HALF_PI;
+                       }
+                       return -HALF_PI;
+               }
+
+               val1 = atan(val1/val2);
+               if(val2 < 0) {
+                       if(val1 <= 0) {
+                               return val1 + PI;
+                       }
+                       return val1 - PI;
+               }
+               return val1;
+    }
+
+       /**
+        * Takes a positive value between 0 and
+        *  PI, scales it into the range 0 to 0.414,
+        *  and calls reducted_atan on it.
+        */
+       private static double scaling_atan(double val) {
+               if(val < SQRT2_M1) {
+                       // Already in right range, use
+                       return reducted_atan(val);
+               }
+               if(val > SQRT2_P1) {
+                       // Long way out of range, invert
+                       return HALF_PI - reducted_atan(1/val);
+               }
+               // Between sqrt(2)-1 and sqrt(2)+1
+               // Scale slightly
+               return HALF_PI/2 + reducted_atan((val-1)/(val+1));
+    }
+
+       /**
+        * Performs the atan function, but only on a limited
+        *  range of inputs.
+        * Works for the range -0.414 to +0.414
+        */
+    private static double reducted_atan(double val) {
+               double val_sq, value;
+
+               val_sq = val*val;
+               value = ((((p4*val_sq + p3)*val_sq + p2)*val_sq + p1)*val_sq + 
p0);
+               value = value / (((((val_sq + q4)*val_sq + q3)*val_sq + 
q2)*val_sq + q1)*val_sq + q0);
+               return value*val;
+       }
+
+
+       /**
+        * Empty constructor - largely un-used as
+        *  methods are static
+        */
+       public MoreMath() {
+       }
+}

Propchange: 
commons/sandbox/me/trunk/src/org/apache/commons/me/math/MoreMath.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
commons/sandbox/me/trunk/src/org/apache/commons/me/util/ArrayHelper.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/me/trunk/src/org/apache/commons/me/util/ArrayHelper.java?rev=648463&r1=648462&r2=648463&view=diff
==============================================================================
--- commons/sandbox/me/trunk/src/org/apache/commons/me/util/ArrayHelper.java 
(original)
+++ commons/sandbox/me/trunk/src/org/apache/commons/me/util/ArrayHelper.java 
Tue Apr 15 17:17:27 2008
@@ -1,3 +1,19 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
 package org.apache.commons.me.util;
 
 /**

Added: 
commons/sandbox/me/trunk/test-src/org/apache/commons/me/math/TestMoreMath.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/me/trunk/test-src/org/apache/commons/me/math/TestMoreMath.java?rev=648463&view=auto
==============================================================================
--- 
commons/sandbox/me/trunk/test-src/org/apache/commons/me/math/TestMoreMath.java 
(added)
+++ 
commons/sandbox/me/trunk/test-src/org/apache/commons/me/math/TestMoreMath.java 
Tue Apr 15 17:17:27 2008
@@ -0,0 +1,65 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.commons.me.math;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for the More Maths functions
+ */
+public class TestMoreMath extends TestCase {
+       private static double[] testArcVals = new double[] {
+               0, 0.1, 0.11, 0.5, 0.9, 1.0, -0.1, -0.5, -1.0
+       };
+       private static double[] testMoreArcVals = new double[] {
+               1.1, 10, 20, 100, 1000, Math.PI, -1.4, -20
+       };
+
+       public void testASin() {
+               for(int i=0; i<testArcVals.length; i++) {
+                       assertEquals( 
+                               MoreMath.asin(testArcVals[i]), 
Math.asin(testArcVals[i]), 0.0001 
+                       ); 
+               }
+               assertTrue(Double.isNaN( MoreMath.asin( 1.1 ) ));
+               assertTrue(Double.isNaN( MoreMath.asin( -1.1 ) ));
+       }
+
+       public void testACos() {
+               for(int i=0; i<testArcVals.length; i++) {
+                       assertEquals( 
+                               MoreMath.acos(testArcVals[i]), 
Math.acos(testArcVals[i]), 0.0001 
+                       ); 
+               }
+               assertTrue(Double.isNaN( MoreMath.acos( 1.1 ) ));
+               assertTrue(Double.isNaN( MoreMath.acos( -1.1 ) ));
+       }
+
+       public void testATan() {
+               for(int i=0; i<testArcVals.length; i++) {
+                       assertEquals( 
+                               MoreMath.atan(testArcVals[i]), 
Math.atan(testArcVals[i]), 0.0001 
+                       ); 
+               }
+               // atan can go over 1, as tan is crazy like that
+               for(int i=0; i<testMoreArcVals.length; i++) {
+                       assertEquals( 
+                               MoreMath.atan(testMoreArcVals[i]), 
Math.atan(testMoreArcVals[i]), 0.0001 
+                       ); 
+               }
+       }
+}

Propchange: 
commons/sandbox/me/trunk/test-src/org/apache/commons/me/math/TestMoreMath.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to