src/share/classes/sun/misc/FloatingDecimal.java
Print this page
rev 6572 : 8024356: Double.parseDouble() is slow for long Strings
Summary: Clamp nDigits to MAX_NDIGITS.
Reviewed-by: bpb, drchase, shade
Contributed-by: Dmitry Nadezhin <dmitry.nadezhin@oracle.com>
*** 68,77 ****
--- 68,86 ----
static final int maxDecimalDigits = 15;
static final int maxDecimalExponent = 308;
static final int minDecimalExponent = -324;
static final int bigDecimalExponent = 324; // i.e. abs(minDecimalExponent)
+ //
+ // The value below is chosen as a conservative threshold. It
+ // can be demonstrated that a decimal ulp less than 10^(-1075)
+ // is enough to guarantee correctness. Compensation is also made
+ // for the binary mantissa which takes 53 binary digits, or
+ // 17 decimal ones. Hence 1075 + 17 =~ 1100.
+ //
+ static final int MAX_NDIGITS = 1100;
+
static final long highbyte = 0xff00000000000000L;
static final long highbit = 0x8000000000000000L;
static final long lowbytes = ~highbyte;
static final int singleSignMask = 0x80000000;
*** 1466,1475 ****
--- 1475,1488 ----
* The hard part is adjusting it, by comparison
* with FDBigInt arithmetic.
* Formulate the EXACT big-number result as
* bigD0 * 10^exp
*/
+ if (nDigits > MAX_NDIGITS) {
+ nDigits = MAX_NDIGITS + 1;
+ digits[MAX_NDIGITS] = '1';
+ }
FDBigInt bigD0 = new FDBigInt( lValue, digits, kDigits, nDigits );
exp = decExponent - nDigits;
correctionLoop:
while(true){