Я знал, что следует ожидать проблем с переполнением в JS, но я думаю, что он может обрабатывать числа, поскольку модуль используется во всех слабых местах.
JavaScript нена самом деле имеет отличный тип "integer" с "overflow";скорее он просто имеет тип «число», значения которого являются числами с плавающей запятой двойной точности и подвержены ошибке округления.Таким образом, даже если значение x * x
представляется в виде 64-разрядного целого числа, оно не может быть точно представлено в виде числа JavaScript.Числа JavaScript могут точно представлять любое целое число в диапазоне [- (2 53 -1), 2 53 -1] - см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER - но ваши вычисления включают значениявне этого диапазона.
Чтобы убедиться, что вы выходите за пределы этого диапазона, вы можете вставить это:
if (x * x > Number.MAX_SAFE_INTEGER)
throw 'error: ' + x + ' * ' + x + ' is ' + (x * x);
Вы увидите error: 294967268 * 294967268 is 8700568919138382<strong>0</strong>
, хотя 294,967,268 × 294,967,268 на самом деле8,7005,689,191,383,82 4 .
Чтобы это исправить, вам нужно либо меньшее значение MAX
(для обеспечения MAX * MAX <= Number.MAX_SAFE_INTEGER
), либо использовать (частичное) библиотека больших целых чисел для выполнения целочисленной арифметики с большими значениями, которые вы используете.