Я читаю вторую главу книги Eloquent JavaScript. Автор утверждает, что:
Any whole number less than 2^52 (which is more than 10^15) will safely fit in a JavaScript number.
Я схватил значение 2 ^ 52 из wikipedia.
4,503,599,627,370,496
Значение должно быть меньше 2 ^ 52, поэтому я вычитал 1 из начального значения;
var max = 4503599627370495;
После определения максимальной переменной я проверяю, какое значение (я использую Chrome 32.0.1700.77
).
console.log(max); // 4503599627370495
Я хотел бы видеть, что происходит, когда я перехожу к этому пределу, поэтому я добавляю его пару раз.
Неожиданный:
max += 1;
console.log(max); // 4503599627370496
max += 1;
console.log(max); // 4503599627370497
max += 1;
console.log(max); // 4503599627370498
Я преодолел предел, и расчеты все еще точны.
Я попробовал следующую мощность вместо двух, 2 ^ 53, на этот раз я не вычитал 1:
9,007,199,254,740,992
var max = 9007199254740992;
Этот, кажется, больший предел, кажется, что я вполне могу добавить и вычитать числа:
max += 1;
console.log(max); // 9007199254740992
max += 1;
console.log(max); // 9007199254740992
max -= 1;
console.log(max); // 9007199254740991
max += 1;
console.log(max); // 9007199254740992
max -= 900;
console.log(max); // 9007199254740092
max += 900;
console.log(max); // 9007199254740992
Я могу назначить даже большее значение max, однако оно теряет точность, и я не могу безопасно добавить или вычитать числа снова.
Не могли бы вы точно объяснить механизм, который находится под капотом? Пример того, что происходит с битами после перехода выше 2 ^ 52, будет действительно полезен.