On Fri, 2 May 2025 16:04:18 GMT, fabioromano1 <d...@openjdk.org> wrote:

>> Raffaello Giulietti has updated the pull request incrementally with one 
>> additional commit since the last revision:
>> 
>>   Clearer and more complete spec of the *pow* methods.
>
> src/java.base/share/classes/java/lang/Math.java line 3500:
> 
>> 3498:             return (n & 0b1) == 0 ? 1 : -1;
>> 3499:         }
>> 3500: 
> 
> Suggestion:
> 
> 
>         if (x == 2) {
>             if (n >= Integer.SIZE - 1)
>                 throw new ArithmeticException("integer overflow");
>             return 1 << n;
>         }
>         if (x == -2) {
>             if (n >= Integer.SIZE)
>                 throw new ArithmeticException("integer overflow");
>             // if n == Integer.SIZE - 1, result is correct
>             return (n & 0b1) == 0 ? 1 << n : -(1 << n);
>         }
> 
>        if ((java.math.BigInteger.bitLengthForInt(Math.abs(x)) - 1L) * n + 1L 
> > Integer.SIZE) {
>            throw new ArithmeticException("integer overflow");
>        }
> 
> With also a check for the condition 
> `java.math.BigInteger.bitLengthForInt(Math.abs(x)) * n < Integer.SIZE`, when 
> it is true the path could be led to a loop that skips the checks.

return (n & 0b1) == 0 ? 1 << n : -(1 << n);


Equivalent to 



return ((1 << n) ^ -(n & 1)) + (n & 1);


Without branches it should be faster

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/25003#discussion_r2071898882

Reply via email to