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.
that is, Double.MIN_VALUE.
It's easy to see why in the source. Using 3.0 here, we see:
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.max(0) (just one arg) but at least that could be considered a usage error.