JDK 15 RF(pre)R of JDK-8241374: add Math.absExact

Stuart Marks stuart.marks at oracle.com
Sun Mar 29 02:37:06 UTC 2020


Hi Joe,

Overall this looks quite good. Thanks for being thorough about this; I certainly 
would have forgotten about StrictMath. :-) Since this is integer arithmetic, is 
it true that the StrictMath versions are identical to the Math versions?

I have only a couple editorial quibbles.

> +     * {@code int} range and an exception is thrown for that argument.

Recommend adding a comma here:

> +     * {@code int} range, and an exception is thrown for that argument.

--

> +     * @return the absolute value of the argument absent overflow

I stumbled while reading this. While not incorrect, it seems a bit awkwardly 
worded to me. How about something like "...the argument, unless overflow occurs."

--

> +            throw new ArithmeticException("Cannot represent " +
> +                                          "absolute value of " +
> +                                          "Integer.MIN_VALUE");

In cases like this I usually prefer to put the entire string on its own line, 
avoiding the concatenation:

> +            throw new ArithmeticException(
> +                "Cannot represent absolute value of Integer.MIN_VALUE");

--

Thanks,

s'marks




On 3/28/20 1:34 PM, Joe Darcy wrote:
> Hello,
> 
> Please review the initial proposed wording of the spec for
> 
>      JDK-8241374: add Math.absExact
> 
> The eventual wording needs to be replicated four times (Math.absExact(int), 
> Math.absExact(long), StrictMath.absExact(int), StrictMath.absExact(long)) so I 
> want to get the wording agreed to before presenting it in quadruplicate.
> 
> The other "exact" methods mention overflow so I wanted the spec to absExact to 
> include both "exact" and "overflow" in its description.
> 
> Tests will follow in subsequent review iterations.
> 
> Thanks,
> 
> -Joe
> 
> diff -r c5d90e8d4a46 src/java.base/share/classes/java/lang/Math.java
> --- a/src/java.base/share/classes/java/lang/Math.java    Sat Mar 28 11:00:09 
> 2020 -0400
> +++ b/src/java.base/share/classes/java/lang/Math.java    Sat Mar 28 10:17:39 
> 2020 -0700
> @@ -1369,6 +1369,32 @@
>       }
> 
>       /**
> +     * Returns the mathematical absolute value of an {@code int} value
> +     * if it is exactly representable as an {@code int}, throwing
> +     * {@code ArithmeticException} if the result overflows the
> +     * positive {@code int} range.
> +     *
> +     * <p>Since the range of two's complement integers is asymmetric
> +     * with one additional negative value, the mathematical absolute
> +     * value of {@link Integer#MIN_VALUE} overflows the positive
> +     * {@code int} range and an exception is thrown for that argument.
> +     *
> +     * @param   a   the argument whose absolute value is to be determined
> +     * @return the absolute value of the argument absent overflow
> +     * @throws ArithmeticException if the argument is {@link Integer#MIN_VALUE}
> +     * @see Math#abs(int)
> +     * @since 15
> +     */
> +    public static int absExact(int a) {
> +        if (a == Integer.MIN_VALUE)
> +            throw new ArithmeticException("Cannot represent " +
> +                                          "absolute value of " +
> +                                          "Integer.MIN_VALUE");
> +        else
> +            return abs(a);
> +    }
> +
> +    /**
>        * Returns the absolute value of a {@code long} value.
>        * If the argument is not negative, the argument is returned.
>        * If the argument is negative, the negation of the argument is returned.
> 


More information about the core-libs-dev mailing list