commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bill Rossi <b...@rossi.com>
Subject Re: [math] elementary functions.
Date Tue, 08 Jun 2010 16:46:46 GMT


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.dunning@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 <bill@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.dunning@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 <bill@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-unsubscribe@commons.apache.org
>>>> For additional commands, e-mail: dev-help@commons.apache.org
>>>>
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>>> For additional commands, e-mail: dev-help@commons.apache.org
>>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>

Mime
View raw message