提交 ffa2ff39 编写于 作者: D darcy

7086710: java/util/Formatter/Basic.java failing after 7082971

Reviewed-by: alanb
上级 0c6092d8
...@@ -904,12 +904,13 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> { ...@@ -904,12 +904,13 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
throw new NumberFormatException("Infinite or NaN"); throw new NumberFormatException("Infinite or NaN");
// Translate the double into sign, exponent and significand, according // Translate the double into sign, exponent and significand, according
// to the formulae in JLS, Section 20.10.22. // to the formulae in JLS, Section 20.10.22.
int sign = (val >= 0.0 ? 1 : -1); // Preserving sign of zero doesn't matter
int exponent = Math.getExponent(val);
long valBits = Double.doubleToLongBits(val); long valBits = Double.doubleToLongBits(val);
long significand = (exponent == (Double.MIN_EXPONENT-1) int sign = ((valBits >> 63) == 0 ? 1 : -1);
? (valBits & ((1L << 52) - 1)) << 1 int exponent = (int) ((valBits >> 52) & 0x7ffL);
: (valBits & ((1L << 52) - 1)) | (1L << 52)); long significand = (exponent == 0
? (valBits & ((1L << 52) - 1)) << 1
: (valBits & ((1L << 52) - 1)) | (1L << 52));
exponent -= 1075;
// At this point, val == sign * significand * 2**exponent. // At this point, val == sign * significand * 2**exponent.
/* /*
...@@ -933,9 +934,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> { ...@@ -933,9 +934,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
BigInteger intVal; BigInteger intVal;
long compactVal = sign * significand; long compactVal = sign * significand;
if (exponent == 0) { if (exponent == 0) {
// If the exponent is zero, the significant fits in a long intVal = (compactVal == INFLATED) ? INFLATED_BIGINT : null;
assert compactVal != INFLATED;
intVal = null;
} else { } else {
if (exponent < 0) { if (exponent < 0) {
intVal = BigInteger.valueOf(5).pow(-exponent).multiply(compactVal); intVal = BigInteger.valueOf(5).pow(-exponent).multiply(compactVal);
...@@ -4162,15 +4161,30 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> { ...@@ -4162,15 +4161,30 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
return qsign < 0; return qsign < 0;
default: // Some kind of half-way rounding default: // Some kind of half-way rounding
if (roundingMode == ROUND_HALF_DOWN || assert roundingMode >= ROUND_HALF_UP &&
cmpFracHalf < 0 ) // We're closer to higher digit roundingMode <= ROUND_HALF_EVEN: "Unexpected rounding mode" + RoundingMode.valueOf(roundingMode);
if (cmpFracHalf < 0 ) // We're closer to higher digit
return false; return false;
else if (roundingMode == ROUND_HALF_UP || else if (cmpFracHalf > 0 ) // We're closer to lower digit
cmpFracHalf > 0 ) // We're closer to lower digit
return true; return true;
else else { // half-way
// roundingMode == ROUND_HALF_EVEN, true iff quotient is odd assert cmpFracHalf == 0;
return oddQuot;
switch(roundingMode) {
case ROUND_HALF_DOWN:
return false;
case ROUND_HALF_UP:
return true;
case ROUND_HALF_EVEN:
return oddQuot;
default:
throw new AssertionError("Unexpected rounding mode" + roundingMode);
}
}
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册