return "NaN";
if (isInfinite(d))
return d < 0 ? "-Infinity" : "Infinity";
long bits = doubleToLongBits(d);
CPStringBuilder result = new CPStringBuilder();
if (bits < 0)
result.append('-');
result.append("0x");
final int mantissaBits = 52;
final int exponentBits = 11;
long mantMask = (1L << mantissaBits) - 1;
long mantissa = bits & mantMask;
long expMask = (1L << exponentBits) - 1;
long exponent = (bits >>> mantissaBits) & expMask;
result.append(exponent == 0 ? '0' : '1');
result.append('.');
result.append(Long.toHexString(mantissa));
if (exponent == 0 && mantissa != 0)
{
// Treat denormal specially by inserting '0's to make
// the length come out right. The constants here are
// to account for things like the '0x'.
int offset = 4 + ((bits < 0) ? 1 : 0);
// The silly +3 is here to keep the code the same between
// the Float and Double cases. In Float the value is
// not a multiple of 4.
int desiredLength = offset + (mantissaBits + 3) / 4;
while (result.length() < desiredLength)
result.insert(offset, '0');
}
result.append('p');
if (exponent == 0 && mantissa == 0)
{
// Zero, so do nothing special.
}
else
{
// Apply bias.
boolean denormal = exponent == 0;
exponent -= (1 << (exponentBits - 1)) - 1;
// Handle denormal.
if (denormal)
++exponent;
}
result.append(Long.toString(exponent));
return result.toString();
}