RFR 7192954+4396272: Fix Float.parseFloat to round correctly and preserve monotonicity

Brian Burkhalter brian.burkhalter at oracle.com
Wed Jun 12 19:56:53 UTC 2013

The original patch has been updated such that it also fixes

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7039391 - Use Math.ulp in FloatingDecimal.

The updated patch is at


For purposes of comparison, the original patch is left online at the location indicated below.

The specific changes in the update are

1) Use IEEE-754 primitive long instead of primitive double for the candidate double, thereby removing FloatingDecimal.ulp() without using any Math.* methods.

2) Remove strictfp from declarations of doubleValue() and floatValue().

3) In floatValue(), find approximation directly instead of invoking doubleValue().

I have code-reviewed the update and ensured that it passes the JTREG tests in

* sun/misc/FloatingDecimal
* java/lang/Double
* java/lang/Float
* java/math

If there are other pertinent validations which should be performed please point them out.

Once this patch has been officially reviewed I will post the webrev for http://bugs.sun.com/view_bug.do?bug_id=7131192 - BigInteger.doubleValue() is "depressingly" slow.



On Jun 11, 2013, at 3:47 PM, Brian Burkhalter wrote:

> This contributed patch
> http://cr.openjdk.java.net/~bpb/4396272%2b7192954/
> fixes these two issues:
> 1) http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7192954 - Fix Float.parseFloat to round correctly and preserve monotonicity
> 2) http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4396272 - Parsing double fails to follow IEEE for largest decimal the should yield 0
> For 7192954, "stickyRound()" is replaced by actual code development containing a correction loop in floatValue() analogous to that in doubleValue().
> For 4396272, when the difference between the scaled big-int versions of the exact value and the candidate double value is exactly 1/2*ULP, and the candidate value <= 2*Double.MIN_NORMAL, then form the correction statement in a way that avoids rounding the intermediate result to zero thereby preventing correction.
> For reference see also this thread:
> http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-February/014788.html
> Thanks,
> Brian

More information about the core-libs-dev mailing list