RFR: 6471906 - NegativeArraySizeException in tenToThe() (original) (raw)
Joe Darcy joe.darcy at oracle.com
Wed Jan 30 18:58:16 UTC 2013
- Previous message: RFR: 6471906 - NegativeArraySizeException in tenToThe()
- Next message: RFR: 6471906 - NegativeArraySizeException in tenToThe()
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hi Brian,
Looks fine. I think not have a regression test for this is okay since it would take a relatively long time to run and use a significant amount of memory.
Thanks,
-Joe
On 01/30/2013 10:34 AM, Brian Burkhalter wrote:
Please review at your convenience.
Issue: JDK-6471906 Assessment: The problem occurs because an attempt is made to allocate an array of length > Integer.MAXVALUE. 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
- Previous message: RFR: 6471906 - NegativeArraySizeException in tenToThe()
- Next message: RFR: 6471906 - NegativeArraySizeException in tenToThe()
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]