Как найти предел представимых значений для целочисленного типа данных javascript?
Экспериментальным путем определил, что в javascript после некоторого значения, переменная представляется как infinity или -infinity. Можно ли написать алгоритм (только арифметические операторы) выводящий такое число, что с прибавлением или вычитанием единицы получится infinity или -infinity соответственно?
Ответы (1 шт):
Самое большое конечное число вычислить можно. Оно будет так велико, что его сумма с единицей будет равна ему самому. Этот критерий негодится. Я найду самое большое конечное число. То есть такое число что если к нему что-то прибавить, то получится или само число (если прибавка мала), или бесконечность (если прибавка достаточно велика).
Бесконечность отличается от обычного числа тем что inf == 2 * inf. Стартуем с единицы, последовательно удваиваем число пока не получим бесконечность. Запоминаем предыдущее значение в качестве стартовой точки (y).
Шаг z равен половине y. Добавляем шаг к y пока сумма конечна. Затем уменьшаем шаг в два раза и повторяем процесс. Останавливаемся в момент когда y == y + z. Для конечного y это условие означает что z так мало в сравнении с y что точности не хватает. В итоге в y лежит конечное число настолько большое, что к нему нельзя добавить никакую степень двойки.
Вся арифметика в программе точная - округления нет нигде кроме момента когда y == y + z. А в этот момент вычисления завершаются.
const max_finite = () => {
let x;
let y;
for (x = 1; x != 2 * x; x *= 2) {
y = x;
}
const inf = x;
for (let z = y / 2; z + y > y; z /= 2) {
for (; y + z < inf; y += z) {
}
}
return y;
};
console.log(max_finite());
$ node max_finite.js 1.7976931348623157e+308