Как найти предел представимых значений для целочисленного типа данных javascript?

Экспериментальным путем определил, что в javascript после некоторого значения, переменная представляется как infinity или -infinity. Можно ли написать алгоритм (только арифметические операторы) выводящий такое число, что с прибавлением или вычитанием единицы получится infinity или -infinity соответственно?


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Самое большое конечное число вычислить можно. Оно будет так велико, что его сумма с единицей будет равна ему самому. Этот критерий негодится. Я найду самое большое конечное число. То есть такое число что если к нему что-то прибавить, то получится или само число (если прибавка мала), или бесконечность (если прибавка достаточно велика).

Бесконечность отличается от обычного числа тем что 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
→ Ссылка