RFR: 6471906 - NegativeArraySizeException in tenToThe()
Brian Burkhalter
brian.burkhalter at oracle.com
Wed Jan 30 18:34:47 UTC 2013
Please review at your convenience.
Issue: JDK-6471906
Assessment:
The problem occurs because an attempt is made to allocate an array of length > Integer.MAX_VALUE.
Proposed solution:
--- a/src/share/classes/java/math/BigDecimal.java Fri Jan 25 12:25:10 2013 -0800
+++ b/src/share/classes/java/math/BigDecimal.java Tue Jan 29 13:23:47 2013 -0800
@@ -3537,13 +3537,25 @@
else
return expandBigIntegerTenPowers(n);
}
- // BigInteger.pow is slow, so make 10**n by constructing a
- // BigInteger from a character string (still not very fast)
- char tenpow[] = new char[n + 1];
- tenpow[0] = '1';
- for (int i = 1; i <= n; i++)
- tenpow[i] = '0';
- return new BigInteger(tenpow,1, tenpow.length);
+
+ if (n < 1024*524288) {
+ // BigInteger.pow is slow, so make 10**n by constructing a
+ // BigInteger from a character string (still not very fast)
+ // which occupies no more than 1GB (!) of memory.
+ char tenpow[] = new char[n + 1];
+ tenpow[0] = '1';
+ for (int i = 1; i <= n; i++) {
+ tenpow[i] = '0';
+ }
+ return new BigInteger(tenpow, 1, tenpow.length);
+ }
+
+ if ((n & 0x1) == 0x1) {
+ return BigInteger.TEN.multiply(bigTenToThe(n - 1));
+ } else {
+ BigInteger tmp = bigTenToThe(n/2);
+ return tmp.multiply(tmp);
+ }
}
The portion of the method using the tenpow array is retained for performance (speed of execution) reasons as the BigInteger multiplications for large values are slow. It is intended to address this latter problem separately.
Thanks,
Brian
More information about the core-libs-dev
mailing list