JDK 11 RFR of JDK-8202563: BigInteger/BigDecimal not immune to overflow, contrary to spec
Martin Buchholz
martinrb at google.com
Tue May 8 05:45:57 UTC 2018
Thanks for doing this - wordsmithing is hard.
Maybe
The unsigned
* right shift operator ({@code >>>}) is omitted, as this operation only
makes sense with a fixed word size.
On Mon, May 7, 2018 at 9:47 PM, joe darcy <joe.darcy at oracle.com> wrote:
> Hello,
>
> Over in BigInteger, 2^Integer.MAX_VALUE just isn't as effectively infinite
> as it used to be. Please review the spec changes and CSR below to clarify
> that the range of BigInteger is "arbitrarily large" but not "infinite":
>
> JDK-8202563: BigInteger/BigDecimal not immune to overflow, contrary to
> spec
> webrev: http://cr.openjdk.java.net/~darcy/8202563.0/
> CSR: https://bugs.openjdk.java.net/browse/JDK-8202761
>
> Patch below.
>
> Thanks,
>
> -Joe
>
> --- old/src/java.base/share/classes/java/math/BigInteger.java 2018-05-07
> 21:39:33.679361845 -0700
> +++ new/src/java.base/share/classes/java/math/BigInteger.java 2018-05-07
> 21:39:33.139361869 -0700
> @@ -52,18 +52,15 @@
> * and a few other miscellaneous operations.
> *
> * <p>Semantics of arithmetic operations exactly mimic those of Java's
> integer
> - * arithmetic operators, as defined in <i>The Java Language
> Specification</i>.
> + * arithmetic operators, as defined in <i>The Java™ Language
> Specification</i>.
> * For example, division by zero throws an {@code ArithmeticException},
> and
> * division of a negative by a positive yields a negative (or zero)
> remainder.
> - * All of the details in the Spec concerning overflow are ignored, as
> - * BigIntegers are made as large as necessary to accommodate the results
> of an
> - * operation.
> *
> * <p>Semantics of shift operations extend those of Java's shift operators
> * to allow for negative shift distances. A right-shift with a negative
> * shift distance results in a left shift, and vice-versa. The unsigned
> * right shift operator ({@code >>>}) is omitted, as this operation makes
> - * little sense in combination with the "infinite word size" abstraction
> + * little sense in combination with the arbitrarily large abstraction
> * provided by this class.
> *
> * <p>Semantics of bitwise logical operations exactly mimic those of
> Java's
> @@ -84,8 +81,8 @@
> * extended so that it contains the designated bit. None of the
> single-bit
> * operations can produce a BigInteger with a different sign from the
> * BigInteger being operated on, as they affect only a single bit, and the
> - * "infinite word size" abstraction provided by this class ensures that
> there
> - * are infinitely many "virtual sign bits" preceding each BigInteger.
> + * arbitrarily large abstraction provided by this class ensures that
> conceptually
> + * there are infinitely many "virtual sign bits" preceding each
> BigInteger.
> *
> * <p>For the sake of brevity and clarity, pseudo-code is used throughout
> the
> * descriptions of BigInteger methods. The pseudo-code expression
> @@ -105,13 +102,18 @@
> * +2<sup>{@code Integer.MAX_VALUE}</sup> (exclusive)
> * and may support values outside of that range.
> *
> + * An {@code ArithmeticException} is thrown when a BigInteger
> + * constructor or method would generate a value outside of the
> + * supported range.
> + *
> * The range of probable prime values is limited and may be less than
> * the full supported positive range of {@code BigInteger}.
> * The range must be at least 1 to 2<sup>500000000</sup>.
> *
> * @implNote
> - * BigInteger constructors and operations throw {@code
> ArithmeticException} when
> - * the result is out of the supported range of
> + * In the reference implementation, BigInteger constructors and
> + * operations throw {@code ArithmeticException} when the result is out
> + * of the supported range of
> * -2<sup>{@code Integer.MAX_VALUE}</sup> (exclusive) to
> * +2<sup>{@code Integer.MAX_VALUE}</sup> (exclusive).
> *
>
>
>
More information about the core-libs-dev
mailing list