Как обнаружить числовое переполнение / переполнение в арифметических операциях JavaScript?

Сегодня я проводил тестирование кода, целью было поймать все крайние случаи при добавлении двух целочисленных представлений строк в JavaScript. Один случай, который я не смог понять, - это как обнаружить переполнение / переполнение для суммы, хранящейся в IEEE 754.

Обычно в C я смотрю двоичное представление числового значения, но в JavaScript я могу смотреть только на 32-битное целочисленное значение.

Вот код, который у меня был:

function string_add(a, b) {
    if (arguments.length !== 2)
        throw new Error('two arguments expected as input');

    // ensure we have strings
    if (typeof a !== 'string' || typeof b !== 'string')
        throw new Error('bad parameter types');

    // ensure we do not have empty strings
    if (a.length === 0 || b.length === 0)
        throw new Error('an empty string is an invalid argument');

    // ensure we have integer arguments
    if (0 !== (+a % 1) || 0 !== (+b % 1))
        throw new Error('expected numeric integer strings for arguments');

    var sum = +a + +b;      // create numeric sum of a and b.
    sum+='';                // convert numeric sum to string
    return sum;
}

Заранее спасибо.

1 ответ

Решение

На самом деле, целые числа в Javascript - это 53 бита информации из-за того, как работает математика с плавающей точкой.

В прошлый раз, когда мне нужно было сделать нечто подобное, я сделал...

var MAX_INT = Math.pow(2, 53);
var MIN_INT = -MAX_INT;

var value = MAX_INT * 5;
if (value >= MAX_INT) {
  alert("Overflow");
}

// Note. you have to use MAX_INT itself as the overflow mark because of this:
value = MAX_INT+1;
if (value > MAX_INT) {
  alert("Overflow test failed");
}

РЕДАКТИРОВАТЬ После размышления об этом было бы легче сказать:

var MAX_INT = Math.pow(2, 53) -1;
var MIN_INT = -MAX_INT;

так как это самый большой INT, который вы знаете, не переполнен.

Другие вопросы по тегам