Math.round optimization, and round to int
Remi Forax
forax at univ-mlv.fr
Sun Jun 5 18:34:52 UTC 2016
or use
r = r * (longBits < 0)? -1: 1;
which should be compiled to a conditional move.
cheers,
Rémi
----- Mail original -----
> De: "Jeff Hain" <jeffhain at rocketmail.com>
> À: core-libs-dev at openjdk.java.net
> Envoyé: Dimanche 5 Juin 2016 20:17:49
> Objet: Math.round optimization, and round to int
>
> 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