Dmitry Nadezhin wrote:
http://bugs.sun.com/view_bug.do?bug_id=4421494
https://bugs.openjdk.java.net/show_bug.cgi?id=100119
Summary: This old bug report says that Double.parseDouble(s) hangs for
decimal strings
in range (Double.MIN_NORMAL-0.5*Double.MIN_VALUE,Double.MIN), and returns
incorrect result for decimal string
Double.MIN_NORMAL-0.5*Double.MIN_VALUE.
This is because current code in FloatingDecimal.doubleValue() incorrectly
defines the condition when nextDown(dValue) - dValue ==
-0.5*ulp(dValue). The
current code considers that these are all numbers 2^n which are
represented as
normal doubles, and nexDown(dValue) - dValue == -1.0*ulp(dValue) for
other
doubles (subnormal or not 2-powers).
However, this is not correct for dValue == Double.MIN_VALUE, because
nextDown(Double.MIN_NORMAL) - Double.MIN_NORMAL ==
-1.0*ulp(Double.MIN_NORMAL).
The suggested change
- if ( (bigIntNBits == 1) && (bigIntExp > -expBias) ){
+ if ( (bigIntNBits == 1) && (bigIntExp >
-expBias+1) ){
redefines the condition so that dValue == Double.MIN_NORMAL doesn't
satisfy it.
-Dima
Hello.
Thank you for the proposed fix; that certainly sounds like a plausible
cause of the problem.
I'm a bit swamped now, but I'll try to look at verifying the fix and
sponsoring getting it back into the JDK within the next few weeks.
-Joe