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

Remi Forax forax at univ-mlv.fr
Sun Mar 29 22:26:59 UTC 2020


----- Mail original -----
> De: "Stuart Marks" <stuart.marks at oracle.com>
> À: "joe darcy" <joe.darcy at oracle.com>
> Cc: "core-libs-dev" <core-libs-dev at openjdk.java.net>
> Envoyé: Dimanche 29 Mars 2020 04:37:06
> Objet: Re: JDK 15 RF(pre)R of JDK-8241374: add Math.absExact

> 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");


Yes, it's more readable.
As a trivia, those concatenation are done by the compiler at compile time because both the left side and the right side of + are compile time constants.
So the generated bytecode is identical.

> 
> --
> 
> Thanks,
> 
> s'marks

Rémi

> 
> 
> 
> 
> 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