Thank you,
It would be nice to get it into Java, but I have no idea what the process
for that is.
I'll package up the code, test case, etc and post a link tonight.
On Tue, 8 Jun 2010, James Carman wrote:
That's what I was thinking. We could include it in Commons Math, but
it'd be great to see it make it into the language itself (in about 10
years as these things work).
On Tue, Jun 8, 2010 at 11:39 AM, Ted Dunning <ted.dunn...@gmail.com> wrote:
Bill,
This looks like nice work.
Have you considered contributing the code back to Java itself?
On Tue, Jun 8, 2010 at 8:29 AM, Bill Rossi <b...@rossi.com> wrote:
I've looked at StrictMath, generally Math appears to delegates to
StrictMath. StrictMath is implemented by the C fdlibm library.
This is what I've implemented to date, the code will compile and run
on JDK 1.4 and later. It may work on older JDKs, but I don't have them
available for testing. Note that functions like expm1 are not available
in earlier JDKs.
public class FastMath extends java.lang.Object{
public FastMath();
public static double exp(double);
public static double expm1(double);
public static double log(double);
public static double log1p(double);
public static double log10(double);
public static double pow(double, double);
public static double sin(double);
public static double cos(double);
public static double tan(double);
public static double atan(double);
public static double atan2(double, double);
public static double toRadians(double);
public static double toDegrees(double);
public static double abs(double);
public static double ulp(double);
public static double floor(double);
public static double ceil(double);
public static double rint(double);
public static long round(double);
static {};
}
Performance test gives these results:
Function Time Result Function Time
Result
----------------------------------------------------------------------------------------------
StrictMath.log 967 1.5118099917827207E8 FastMath.log 553
1.5118099917827207E8
StrictMath.pow 3199 4.6455095486440872E16 FastMath.pow 1967
4.645509548644088E16
StrictMath.exp 1079 2.2025454782076317E10 FastMath.exp 562
2.2025454782076317E10
StrictMath.sin 1151 1839071.8010869955 FastMath.sin 766
1839071.8010869955
StrictMath.cos 1173 -544020.191353572 FastMath.cos 665
-544020.191353572
StrictMath.tan 1568 -5.024600819552688E7 FastMath.tan 1081
-5.024600819552688E7
StrictMath.atan 1079 1.2403715749052648E7 FastMath.atan 902
1.2403715749052648E7
StrictMath.expm1 727 -9899999.500018543 FastMath.expm1 773
-9899999.500018543
This table shows execution time for 10,000,000 calls in milliseconds. The
result printed is there to prevent the JIT from optimizing away the
calculation entirely.
Note that some functions such as exp are nearly twice as fast. I've seen
it 3 times faster on different processors. The preformance varies by the
relative speed of calculation vs memory lookups.
The functions are implemented as tables of values in extra precision
(approx 70 bits), and then interpolated with a minimax polynomial.
Typical test code:
x = 0;
time = System.currentTimeMillis();
for (int i=0; i<10000000; i++)
x+=StrictMath.exp(i/1000000.0);
time = System.currentTimeMillis() - time;
System.out.print("StrictMath.exp "+time+"\t"+x+"\t");
x = 0;
time = System.currentTimeMillis();
for (int i=0; i<10000000; i++)
x+=FastMath.exp(i/1000000.0);
time = System.currentTimeMillis() - time;
System.out.println("FastMath.exp "+time+"\t"+x);
To test accuracy, I'd compute results and compare them to an aribitrary
precision math library.
On Tue, 8 Jun 2010, James Carman wrote:
Have you tried looking at StrictMath?
On Tue, Jun 8, 2010 at 10:44 AM, Ted Dunning <ted.dunn...@gmail.com>
wrote:
Bill,
Which functions do you have?
Anything more than the standard sin, cos, exp and log?
On Tue, Jun 8, 2010 at 6:52 AM, Bill Rossi <b...@rossi.com> wrote:
I have developed over the past year a set of elementary functions
similar
to those in java.lang.Math, but with the following characteristics:
* Higher performance.
* Better accuracy. Results are accurate to slightly more that +/- 0.5
ULP.
* Pure Java. The standard Math class is impleneted via JNI, and thus
takes
a performance hit.
---------------------------------------------------------------------
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
---------------------------------------------------------------------
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