JDK 15 RF(pre)R of JDK-8241374: add Math.absExact
Joe Darcy
joe.darcy at oracle.com
Wed Apr 1 01:37:14 UTC 2020
Hi Tagir,
On 3/30/2020 9:00 PM, Tagir Valeev wrote:
> Hello!
>
> Speaking about implementation, how about this?
>
> return (a < 0) ? negateExact(a) : a;
>
> This would require only one branch for positive numbers and also will
> utilize already intrinsified negateExact. The cost is a less verbose
> message ("integer overflow" or "long overflow"). However, when one
> sees the exception from absExact, its meaning becomes completely clear
> after reading the spec.
Given that the spec may not always be handy, I prefer the more precise
exception message given in the current, more verbose, implementation.
Thanks for the suggestion,
-Joe
>
> With best regards,
> Tagir Valeev.
>
> On Tue, Mar 31, 2020 at 12:54 AM Joe Darcy <joe.darcy at oracle.com> wrote:
>> Hello,
>>
>> Updated webrev at:
>>
>> http://cr.openjdk.java.net/~darcy/8241374.1/
>>
>> One of the four pieces of the update to discuss below. A few comments, I
>> added links from the abs methods to its sibling absExact method along
>> with an additional note on referring the differing absExact behavior on
>> a MIN_VALUE argument. I'll reflow the paragraphs and update the
>> copyright year before pushing. Link to the relevant JLS section included
>> in the absExact javadoc.
>>
>> --- old/src/java.base/share/classes/java/lang/Math.java 2020-03-30
>> 10:28:41.314472163 -0700
>> +++ new/src/java.base/share/classes/java/lang/Math.java 2020-03-30
>> 10:28:40.930472163 -0700
>> @@ -1359,9 +1359,12 @@
>> * {@link Integer#MIN_VALUE}, the most negative representable
>> * {@code int} value, the result is that same value, which is
>> * negative.
>> + * In contrast, the {@link Math#absExact(int)} method throws an
>> + * {@code ArithmeticException} for this value.
>> *
>> * @param a the argument whose absolute value is to be determined
>> * @return the absolute value of the argument.
>> + * @see Math#absExact(int)
>> */
>> @HotSpotIntrinsicCandidate
>> public static int abs(int a) {
>> @@ -1369,6 +1372,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 (JLS {@jls 4.2.1}), the
>> + * mathematical absolute value of {@link Integer#MIN_VALUE}
>> + * overflows the positive {@code int} range, so 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, unless overflow occurs
>> + * @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(
>> + "Overflow to represent absolute value of
>> Integer.MIN_VALUE");
>> + else
>> + return abs(a);
>> + }
>>
>> For the StrictMath methods, I include links to the Math equivalent, as
>> the other fooExact StrictMath methods do.
>>
>> Thanks,
>>
>> -Joe
>>
>>
>> On 3/30/2020 9:31 AM, Joe Darcy wrote:
>>> Hi Brian and Chris,
>>>
>>> I was considering adding such as JLS link myself; I'll work one in and
>>> post a revised webrev.
>>>
>>> Thanks,
>>>
>>> -Joe
>>>
>>> On 3/30/2020 9:29 AM, Brian Burkhalter wrote:
>>>> Hi Joe,
>>>>
>>>>> On Mar 30, 2020, at 6:31 AM, Chris Hegarty <chris.hegarty at oracle.com
>>>>> <mailto:chris.hegarty at oracle.com>> wrote:
>>>>>
>>>>>> Full webrev for review include including tests:
>>>>>>
>>>>>> http://cr.openjdk.java.net/~darcy/8241374.0/
>>>>>>
>>>>>> and the companion CSR:
>>>>>>
>>>>>> https://bugs.openjdk.java.net/browse/JDK-8241805
>>>>> Looks good to me.
>>>> Likewise.
>>>>
>>>>> I do like the explanatory paragraph about the asymmetry in the range
>>>>> of two's complement integer values. An alternative, or addition,
>>>>> would be a link to JLS 4.2.1 - Integral Types and Values [1], which
>>>>> shows the asymmetry from a language perspective.
>>>> I also like this suggestion.
>>>>
>>>> Brian
>>>>
>>>>> -Chris.
>>>>>
>>>>> [1]https://docs.oracle.com/javase/specs/jls/se14/html/jls-4.html#jls-4.2.1
More information about the core-libs-dev
mailing list