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

Sanford Whiteman commented on VELTOOLS-182:
-------------------------------------------

Yes, it's quite bad!

 

Why not delegate entirely to Java instead? This method is to avoid running a 
sort proper against the collection, since it only needs a single return value, 
right? Which I understand for large collections, but does this represent 
real-world use? (I don't know, I personally never try to get the max of 2-3 
user/system/default environment variables.)

> MathTool.max longtime bug with args (0,0)
> -----------------------------------------
>
>                 Key: VELTOOLS-182
>                 URL: https://issues.apache.org/jira/browse/VELTOOLS-182
>             Project: Velocity Tools
>          Issue Type: Bug
>          Components: GenericTools
>    Affects Versions: 2.0
>            Reporter: Sanford Whiteman
>            Priority: Major
>
> It appears that {{$math.max}} has had a bug since at least 2.0, or at least 
> I'm at a loss as to why the observed behavior would be expected, and it 
> doesn't appear to be documented.
>  
> {code:java}
> $math.max(0,0) {code}
>  
> returns
>  
> {code:java}
> 4.9E-324{code}
>  
> that is, Double.MIN_VALUE.
>  
> It's easy to see why in the source. Using 
> [3.0|https://apache.googlesource.com/velocity-tools/+/trunk/velocity-tools-generic/src/main/java/org/apache/velocity/tools/generic/MathTool.java#377]
>  here, we see:
>  
> {code:java}
>     public Number max(Object... nums)
>     {
>         double value = Double.MIN_VALUE;
>         Number[] ns = new Number[nums.length];
>         for (int i=0; i<nums.length; i++)
>         {
>             Number n = toNumber(nums[i]);
>             if (n == null)
>             {
>                 return null;
>             }
>             value = Math.max(value, n.doubleValue());
>             ns[i] = n;
>         }
>         return matchType(value, ns);
>     }
> {code}
>  
> So rather than delegating to {{Java.lang.Math.max}} directly, each iter takes 
> the {{Math.max}} of the current value and Double.MIN_VALUE. Ergo, if the 
> arguments are 0, that's always < Double.MIN_VALUE, so the result is in turn 
> Double.MIN_VALUE.
> The same goes for {{$math.min(0)}} (just one arg) but at least that could be 
> considered a usage error.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@velocity.apache.org
For additional commands, e-mail: dev-h...@velocity.apache.org

Reply via email to