[ 
https://issues.apache.org/jira/browse/NUMBERS-156?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17345740#comment-17345740
 ] 

Matt Juntunen commented on NUMBERS-156:
---------------------------------------

Below are the accuracy statistics for vectors of length 100, including the 
{{LinearCombination}} extended-precision algorithm (named "extLinear").

||name||input type||error mean||error std dev||error min||error max||failed||
|direct|high|NaN|-0.00|Infinity|-Infinity|200000|
|enorm|high|0.00124|1.10|-8.00|6.00|0|
|enormMod|high|-0.00179|1.02|-6.00|5.00|0|
|enormModKahan|high|0.00106|0.385|-1.00|1.00|0|
|extLinear|high|0.00130|0.369|-1.00|1.00|0|
|direct|high-thresh|-0.00174|1.02|-6.00|5.00|0|
|enorm|high-thresh|0.00129|1.10|-8.00|7.00|0|
|enormMod|high-thresh|0.00114|0.798|-4.00|4.00|0|
|enormModKahan|high-thresh|0.00111|0.385|-1.00|1.00|0|
|extLinear|high-thresh|0.00135|0.369|-1.00|1.00|0|
|direct|mid|-0.00223|1.02|-6.00|5.00|0|
|enorm|mid|-0.00223|1.02|-6.00|5.00|0|
|enormMod|mid|-0.00223|1.02|-6.00|5.00|0|
|enormModKahan|mid|0.000620|0.392|-1.00|1.00|0|
|extLinear|mid|0.000860|0.376|-1.00|1.00|0|
|direct|low-thresh|-0.00271|1.02|-6.00|5.00|0|
|enorm|low-thresh|0.000315|1.10|-8.00|7.00|0|
|enormMod|low-thresh|0.000165|0.797|-4.00|4.00|0|
|enormModKahan|low-thresh|0.000135|0.385|-1.00|1.00|0|
|extLinear|low-thresh|0.000380|0.370|-1.00|1.00|0|
|direct|low|5.74e+04|1.88e+05|-3.55e+06|3.33e+06|0|
|enorm|low|-2.50e-05|1.10|-8.00|6.00|0|
|enormMod|low|-0.00305|1.02|-6.00|5.00|0|
|enormModKahan|low|-0.000200|0.384|-1.00|1.00|0|
|extLinear|low|4.00e-05|0.369|-1.00|1.00|0|
|direct|full|0.00942|0.510|-2.00|1.00|194054|
|enorm|full|0.0952|0.677|-3.00|3.00|0|
|enormMod|full|0.00829|0.498|-2.00|2.00|0|
|enormModKahan|full|-8.50e-05|0.481|-2.00|2.00|0|
|extLinear|full|0.00200|0.437|-1.00|1.00|1866|

{{enormModKahan}} and {{extLinear}} are very close in terms of accuracy.

I also took a closer look at performance, focusing on the mid (unscaled) 
exponent range, since that is mostly what I'm concerned about for 
commons-geometry. Below are graphs of the performance of the various methods 
for different vector lengths.

 !performance-all.png! 
 !performance-len-1-5.png! 

Except for {{extLinear}}, all of the methods are in the same general range for 
small vectors. However, as the vector length grows, {{enormModKahan}} slows 
down much more quickly than the others.

_Conclusion_
Overall, I'm leaning toward using {{enormMod}} in {{Norms}} and documenting the 
fact that overflow and underflow are protected against but accuracy in standard 
exponent ranges resembles that of direct computation. The reasons for this 
choice are 
1. {{enormMod}} has good performance across a wide range of vector lengths and 
has an accuracy at least as good as direct computation.
2. Our previous Euclidean norm class ({{SafeNorm}}) also did not other enhanced 
precision, so we are not losing anything.
3. If we later decide to implement an extended precision Euclidean norm method, 
we can easily place that in a separate class or method. Users could then decide 
whether or not to take the performance hit for the higher accuracy.

Thoughts?


> SafeNorm 3D overload
> --------------------
>
>                 Key: NUMBERS-156
>                 URL: https://issues.apache.org/jira/browse/NUMBERS-156
>             Project: Commons Numbers
>          Issue Type: Improvement
>            Reporter: Matt Juntunen
>            Priority: Major
>         Attachments: performance-all.png, performance-len-1-5.png
>
>
> We should create an overload of {{SafeNorm.value}} that accepts 3 arguments 
> to potentially improve performance for 3D vectors.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to