Javascript дает другой ответ на тот же алгоритм в Python

Я работаю над проблемой Розалинды Mortal Fibonacci Rabbits, и сайт продолжает говорить мне, что мой ответ неверен, когда я использую свой алгоритм, написанный на JavaScript. Когда я использую тот же алгоритм в Python, я получаю другой (и правильный) ответ.

Несогласованность возникает только тогда, когда результат становится большим. Например, fibd(90, 19) возвращает 2870048561233730600 в JavaScript, но в Python я получаю 2870048561233731259 .

Есть ли что-то о числах в JavaScript, которые дают мне другой ответ или я ошибаюсь в своем JavaScript-коде?

Решение JavaScript:

 function fibd(n, m) { // Create an array of length m and set all elements to 0 var rp = new Array(m); rp = rp.map(function(e) { return 0; }); rp[0] = 1; for (var i = 1; i < n; i++) { // prepend the sum of all elements from 1 to the end of the array rp.splice(0, 0, rp.reduce(function (e, s) { return s + e; }) - rp[0]); // Remove the final element rp.pop(); } // Sum up all the elements return rp.reduce(function (e, s) { return s + e; }); } 

Решение Python:

 def fibd(n, m): # Create an array of length m and set all elements to 0 rp = [0] * m rp[0] = 1 for i in range(n-1): # The sum of all elements from 1 the end and dropping the final element rp = [sum(rp[1:])] + rp[:-1] return sum(rp) 

Я думаю, что Javascript имеет только тип данных «Number», и это фактически двойной IEEE под капотом. 2,870,048,561,233,730,600 слишком велико, чтобы удерживать точно в IEEE double, поэтому он приближен. (Обратите внимание, что конечное «00» – 17 знаков после запятой имеет право на удвоение.)

У Python, с другой стороны, есть поддержка bignum, и он будет очень радостно иметь дело с 4096 битными целыми числами (для тех, кто играет с криптографическими алгоритмами, это огромное благо).

Вы мог бы сможет найти библиотеку bavasum Javascript при поиске – например, http://silentmatt.com/biginteger/

Просто сделав немного исследований, эта статья кажется интересной. Javascript поддерживает только целые числа 53 бит.

Результат, данный Python, действительно выходит из максимального безопасного диапазона для JS. Если вы попытаетесь сделать

 parseInt('2870048561233731259') 

Он действительно вернется

 2870048561233731000