Java understands two floating-point number formats, both
specified by the IEEE 754 standard. Floats are stored in four bytes
with a 1-bit sign, a 24-bit mantissa, and an 8-bit exponent. Float
values range from
1.40129846432481707×10 -45 to
3.40282346638528860×10 38, either
positive or negative. Doubles take up eight bytes with a one-bit
sign, 53-bit mantissa, and 11-bit exponent. This gives them a range
of 4.94065645841246544×10 -324 to
1.79769313486231570×10 308, either
positive or negative. Both
doubles also have representations of positive and
negative zero, positive and negative infinity, and not a number (or
Astute readers will notice that the number of
bits given for
doubles adds up to 33 and 65 bits, respectively,
one too many for the width of the number. A trick is used whereby the
first bit of the mantissa of a nonzero number is assumed to be 1.
With this trick, it is unnecessary to include the first bit of the
mantissa. Thus, an extra bit of precision is gained for free.
The details of this format are too complicated to discuss here. You can order the actual specification from the IEEE for about $29.00. That’s approximately $1.50 a page, more than a little steep in my opinion. The specification isn’t available online, but it was published in the February 1985 issue of ACM SIGPLAN Notices (Volume 22, #2, pp. 9-18), which should be available in any good technical library. The main thing you need ...