Index: luni/src/test/java/org/apache/harmony/luni/tests/java/lang/FloatTest.java =================================================================== --- luni/src/test/java/org/apache/harmony/luni/tests/java/lang/FloatTest.java (revision 470841) +++ luni/src/test/java/org/apache/harmony/luni/tests/java/lang/FloatTest.java (working copy) @@ -994,6 +994,9 @@ assertEquals("0x1.295788p23", Float.toHexString(9743299.65000F)); assertEquals("0x1.295788p23", Float.toHexString(9743299.650001234F)); assertEquals("0x1.700d1p33", Float.toHexString(12349743299.65000F)); + + // test HARMONY-2132 + assertEquals("0x1.01p10", Float.toHexString(0x1.01p10f)); } /** Index: luni/src/test/java/org/apache/harmony/luni/tests/java/lang/DoubleTest.java =================================================================== --- luni/src/test/java/org/apache/harmony/luni/tests/java/lang/DoubleTest.java (revision 470841) +++ luni/src/test/java/org/apache/harmony/luni/tests/java/lang/DoubleTest.java (working copy) @@ -1383,6 +1383,9 @@ assertEquals("0x1.2957874cccccdp23", Double.toHexString(9743299.65000D)); assertEquals("0x1.2957874cccf63p23", Double.toHexString(9743299.650001234D)); assertEquals("0x1.700d1061d3333p33", Double.toHexString(12349743299.65000D)); + + // test HARMONY-2132 + assertEquals("0x1.01p10", Double.toHexString(0x1.01p10)); } /** Index: luni/src/main/java/java/lang/Float.java =================================================================== --- luni/src/main/java/java/lang/Float.java (revision 470836) +++ luni/src/main/java/java/lang/Float.java (working copy) @@ -456,7 +456,7 @@ } int bitValue = floatToIntBits(f); - + boolean negative = (bitValue & 0x80000000) != 0; // mask exponent bits and shift down int exponent = (bitValue & 0x7f800000) >>> 23; @@ -489,7 +489,7 @@ String hexSignificand = Integer.toHexString(significand); // if there are digits left, then insert some '0' chars first - if (fractionDigits > hexSignificand.length()) { + if (significand != 0 && fractionDigits > hexSignificand.length()) { int digitDiff = fractionDigits - hexSignificand.length(); while (digitDiff-- != 0) { hexString.append('0'); @@ -499,14 +499,24 @@ hexString.append("p-126"); } else { // normal value hexString.append("1."); + // significand is 23-bits, so there can be 6 hex digits + int fractionDigits = 6; // remove trailing hex zeros, so Integer.toHexString() won't print // them while ((significand != 0) && ((significand & 0xF) == 0)) { significand >>>= 4; + fractionDigits--; } // this assumes Integer.toHexString() returns lowercase characters String hexSignificand = Integer.toHexString(significand); + // if there are digits left, then insert some '0' chars first + if (significand != 0 && fractionDigits > hexSignificand.length()) { + int digitDiff = fractionDigits - hexSignificand.length(); + while (digitDiff-- != 0) { + hexString.append('0'); + } + } hexString.append(hexSignificand); hexString.append('p'); // remove exponent's 'bias' and convert to a string Index: luni/src/main/java/java/lang/Double.java =================================================================== --- luni/src/main/java/java/lang/Double.java (revision 470836) +++ luni/src/main/java/java/lang/Double.java (working copy) @@ -477,7 +477,7 @@ String hexSignificand = Long.toHexString(significand); // if there are digits left, then insert some '0' chars first - if (fractionDigits > hexSignificand.length()) { + if (significand != 0 && fractionDigits > hexSignificand.length()) { int digitDiff = fractionDigits - hexSignificand.length(); while (digitDiff-- != 0) { hexString.append('0'); @@ -487,13 +487,24 @@ hexString.append("p-1022"); } else { // normal value hexString.append("1."); + // significand is 52-bits, so there can be 13 hex digits + int fractionDigits = 13; // remove trailing hex zeros, so Integer.toHexString() won't print // them while ((significand != 0) && ((significand & 0xF) == 0)) { significand >>>= 4; + fractionDigits--; } // this assumes Integer.toHexString() returns lowercase characters String hexSignificand = Long.toHexString(significand); + + // if there are digits left, then insert some '0' chars first + if (significand != 0 && fractionDigits > hexSignificand.length()) { + int digitDiff = fractionDigits - hexSignificand.length(); + while (digitDiff-- != 0) { + hexString.append('0'); + } + } hexString.append(hexSignificand); hexString.append('p');