2^0 is 1, so if the exponent is 0 then the mantissa times one is your value, so every integer has an exact representation.
If the exponent is 1, then the mantissa is multiplied by 2 to get the actual value. Put another way, the mantissa is the value divided by 2 and rounded, i.e. shifted right one bit.
> 1x10^7 + 2x10^7 != 3x10^7, right?
This particular case is interesting.
If we're talking about 64-bit doubles, then you have 53 bits of precision for integers. All those values are well within that range, so this arithmetic and comparison are done with precise integer values, and the expression will compare equal.
If we're talking about 32-bit floats, the range of precise integer values is -16,777,216 through 16,777,216, or -2^24 through 2^24.
1x10^7 is 10,000,000, within that range, but the other two values are outside the range.
So you might expect that != would be the answer here.
But if you test it, that isn't the case: the expression compares equal!
The reason: although 20,000,000 and 30,000,000 are outside the range where every integer has a precise representation, they are within the range where every even integer is precise: -33,554,432 to 33,554,432. Values within this range but outside the range of precise integers are rounded to a multiple of 2.
Similarly in the range -67,108,864 to 67,108,864, all integers which are a multiple of 4 are represented precisely.
Basically, as you go outside the range of precise integers, values get rounded to a multiple of 2, 4, 8, etc. as required.
When the mantissa overflows the available precision, it is shifted to the right enough so that it fits without losing the most significant bits. Instead, the least significant bits are discarded, and the exponent is incremented by the number of discarded bits.
Of course you could choose other values where the rounding doesn't work out in your favor, and then you'd get the unequal comparison you expect. A simple example:
33333333.0f + 1.0f != 33333334.0f
Here, the value 33,333,333 is rounded down to 33,333,332. Add 1 to that and you get 33,333,333, which is again rounded down to 33,333,332.
33,333,334 is represented precisely, so the comparison fails.
https://en.wikipedia.org/wiki/Single-precision_floating-poin...