views:

446

answers:

7

Can a double (of a given number of bytes, with a reasonable mantissa/exponent balance) always fully precisely hold the range of an unsigned integer of half that number of bytes?

E.g. can an eight byte double fully precisely hold the range of numbers of a four byte unsigned int?

What this will boil down to is if a two byte float can hold the range of a one byte unsigned int.

A one byte unsigned int will of course be 0 -> 255.

Now I have to go revise floats :-)

+16  A: 

An IEEE754 8-byte double can represent any 4-byte integer, simply because it has 53-odd bits available for precision (and the 4-byte integer only needs 32).

It would be plausible for a 64-bit floating point number to have less than 32 bits of precision. That would allow truly huge numbers (due to the exponent) but at the cost of precision.

The bottom line is that, provided there are more bits of precision in the mantissa of the floating point number than there are in the integer (and enough bits in the exponent to scale it), then it can be represented without loss of precision.

paxdiablo
A: 

I wouldn't use the words "fully precisely" when talking about floating-point numbers. But yes, a double can represent a 32-bit integer.

I do not know which other combinations of floats and ints that this is also true for.

Practically speaking, you don't want to bother using floating point above what your machine supports, so just switch to rational arithmetic with bignums. That way, you're guaranteed precision.

Frank Krueger
A floating-point number can precisely represent some numbers, and among those are all integers that fit within its precision. Once you start doing division, or multiplication that could cause overflow, you've probably lost precision.Nor does everybody have a handy system for bignums and/or rational numbers.
David Thornley
+6  A: 

Yes. A float (or double) is guaranteed to exactly represent any integer that does not need to be truncated. For a double, there is 53 bits of precision, so that is more than enough to exactly represent any 32 bit integer, and a tiny (statistically speaking) proportion of 64 bit ones too.

1800 INFORMATION
+3  A: 

Exactly what the range is that you can represent exactly depends on a lot of factors in your implementation, but you can lower-bound it by saying that, if the exponent field is set to 0, you can exactly represent integers up to the width of your mantissa field (assuming a sign bit). For IEEE 754 double-precision, this means you can represent 52-bit numbers exactly. In general, your mantissa will be over half the width of the overall structure.

Matt J
+2  A: 

yes it can

Till
Short and to the point but some may like a little more "meat in their meal". :-)
paxdiablo
I'll go +1 for clarity ;-)
RBerteig
A: 

Dupe, I already asked and answered:

What's the first double that deviates from its corresponding long by delta?

Overflown
+1  A: 

For more details on how a double works, you might want to look at this blog post: Anatomy of a floating point number.

John D. Cook