Allen Wirfs-Brock (2013-07-10T00:34:02.000Z)
On Jul 9, 2013, at 4:14 PM, Brendan Eich wrote:

> Jeff Walden wrote:
>> ...
> 
>>> Number.MAX_INTEGER == 2^53 - 1
>>> The maximum integer value that can be stored in a number without losing precision.
>>> (OK, so technically 2^53 can be stored, but that's an anomaly.)
>> 
>> Why discount the anomaly?  Looking at SpiderMonkey's source code, we have<http://mxr.mozilla.org/mozilla-central/search?string=%3C%3C%2053>  as vaguely representative of most of the places using a number like this, I think -- could be others not using the "<<  53" string, but that's probably a fair sample.  Ignore the RNG_DSCALE one, that's a red herring.  But all the others use 2**53 as the pertinent value.  (The dom/bindings/PrimitiveConversions.h hits using 2**53 -1 is a bug, I'm told, due to recent spec changes.)  So if this constant is to exist, and I think it's a fair constant to add, why would it not be 2**53?
> 
> I think you have a point! From http://en.wikipedia.org/wiki/Double-precision_floating-point_format,
> 
> "Between 2^52 =4,503,599,627,370,496 and 2^53 =9,007,199,254,740,992 the representable numbers are exactly the integers."
> 

Isn't the anomaly (and the issue) that 2^53 (9,007,199,254,740,992) is both the upper-end of the range of integers that can be exactly represented in IEEE float64, it is is also the representation of the smallest positive integer (2^53+1) that cannot be exactly represented.

In other words, if you see the IEEE float 64 encoding of 9,007,199,254,740,992 you don't know if it is an exact representation of 2^53 or an approximate representation of 2^53+1.

2^53-1 is the max integer value whose encoding is not also an approximation of some other integer value.

Allen
domenic at domenicdenicola.com (2013-07-16T16:03:58.443Z)
On Jul 9, 2013, at 4:14 PM, Brendan Eich wrote:

> Jeff Walden wrote:
>> ...
> 
>>> `Number.MAX_INTEGER == 2^53 - 1`
>>> The maximum integer value that can be stored in a number without losing precision.
>>> (OK, so technically 2^53 can be stored, but that's an anomaly.)
>> 
>> Why discount the anomaly?  Looking at SpiderMonkey's source code, we have http://mxr.mozilla.org/mozilla-central/search?string=%3C%3C%2053 as vaguely representative of most of the places using a number like this, I think -- could be others not using the `"<<  53"` string, but that's probably a fair sample.  Ignore the RNG_DSCALE one, that's a red herring.  But all the others use 2^53 as the pertinent value.  (The dom/bindings/PrimitiveConversions.h hits using 2^53 -1 is a bug, I'm told, due to recent spec changes.)  So if this constant is to exist, and I think it's a fair constant to add, why would it not be 2^53?
> 
> I think you have a point! From http://en.wikipedia.org/wiki/Double-precision_floating-point_format,
> 
> "Between 2^52 =4,503,599,627,370,496 and 2^53 =9,007,199,254,740,992 the representable numbers are exactly the integers."

Isn't the anomaly (and the issue) that 2^53 (9,007,199,254,740,992) is both the upper-end of the range of integers that can be exactly represented in IEEE float64, it is is also the representation of the smallest positive integer (2^53+1) that cannot be exactly represented.

In other words, if you see the IEEE float 64 encoding of 9,007,199,254,740,992 you don't know if it is an exact representation of 2^53 or an approximate representation of 2^53+1.

2^53-1 is the max integer value whose encoding is not also an approximation of some other integer value.