Reading and Writing Floating-Point Numbers
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 float
s and
double
s also have representations of positive and
negative zero, positive and negative infinity, and not a number (or
NaN
).
Note
Astute readers will notice that the number of
bits given for float
s and
double
s 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[5] 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 ...
Get Java I/O now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.