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 floats and doubles also have representations of positive and negative zero, positive and negative infinity, and not a number (or NaN).


Astute readers will notice that the number of bits given for floats and 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[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.