3 ms·
How is that? I assume the mantissa is chosen to represent the full number, but how is the exponent set so that the granularity is of exactly 1.0? And of course
by crpatino 11y ago
How is that? I assume the mantissa is chosen to represent the full number, but how is the exponent set so that the granularity is of exactly 1.0?
And of course 1x10^7 + 2x10^7 != 3x10^7, right?
- Stratoscope 11y ago2^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-point_format#Precision_limitations_on_integer_values https://en.wikipedia.org/wiki/Single-precision_floating-poin...
- dnautics 11y agoBecause integers are an integer multiple of a clean power of 2 (2^0 == 1)
- crpatino 11y agoStratoscope was already done a superb job explaining. But just to show why my question was not that dumb... Let's say you want to represent "two-million" in 32bit float: Your answer is: 0x1e8480 * 2^0. However, I was expecting something like: 0x1.e848 * 2^X. But then "125-thousand" is 0x1.e848 * 2^Y, so how do you standardize what is the correct exponent for integers, X or Y? And how do you know there is not a pair (M,Z) != (0x1.e848, X) such that M * 2^Z is also two-million?
- dnautics 11y agothe fraction of a floating point is always "starts with on invisible 1.xxxx" so that forces unique representations for your exponent for any given number. Is it not clear why this is the case? let's take a simple case where you have one bit of fraction. exponent 0, 2^0 = 1, fraction (1)0 = 1.0b = 1 exponent 0, 2^0 = 1, fraction (1)1 = 1.1b = 1.5 exponent 1, 2^1 = 2, fraction (1)0 = 10b = 2 exponent 1, 2^1 = 2, fraction (1)1 = 11b = 3 if we have more fraction bits it looks like this: exponent 0, 2^0 = 1, fraction (1)00 = 1.00b = 1 exponent 0, 2^0 = 1, fraction (1)01 = 1.01b = 1.25 exponent 0, 2^0 = 1, fraction (1)10 = 1.10b = 1.5 exponent 0, 2^0 = 1, fraction (1)11 = 1.11b = 1.75 exponent 1, 2^1 = 2, fraction (1)00 = 10.0b = 2 exponent 1, 2^1 = 2, fraction (1)01 = 10.1b = 2.5 exponent 1, 2^1 = 2, fraction (1)10 = 11.0b = 3 exponent 1, 2^1 = 2, fraction (1)11 = 11.1b = 3.5 So for any given exponent multiplication with a fraction with an invisible bit creates products that are hemmed between 1.0x2^n and 2.0*2^n so there's no collisions between any pair (e,f) in your representation.