Math.round optimization, and round to int
joe darcy
joe.darcy at oracle.com
Mon Jun 6 16:34:55 UTC 2016
Hello,
As a general comment, the Java microbenching version of "Pics or it
didn't happen" should be "jmh or it isn't faster" ;-)
As Andrew's other comment notes, the performance details can be
processor and platform specific so discerning small performance
differences really needs to be data-driven.
Thanks,
-Joe
On 6/5/2016 11:17 AM, Jeff Hain wrote:
> Hi.
>
>
>
> While playing around with Math.round(double) code,
> I found out that
>
> if (longBits < 0) {
> r = -r;
> }
>
> can be replaced with:
>
> long bitsSignum = (((longBits >> 63) << 1) + 1); // 2*0+1 = 1, or 2*-1+1 = -1
> r *= bitsSignum;
>
> which seems a bit faster, as one could expect due to less branching.
>
>
>
> NB: The playing was making an "int roundToInt(double)" method.
> I think it would be good to have such a method in Math
> (and also versions for short/byte?),
> because people often use "(int) Math.round(foo)" for this use case,
> which doesn't work when out of int range.
> Moreover, people should rarely catch the bug in their tests,
> since they usually don't test with pathological values.
>
> Recent example:
> http://alvinalexander.com/java/how-to-round-float-double-to-int-integer-in-java
>
>
>
> -Jeff
>
More information about the core-libs-dev
mailing list