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)
- Python – добавление координатной строки в список
- Кодирование Python, относящееся к функции any и ключевому слову "более одного раза"
- расстояние удаления между словами
- Выкл одной ошибкой в двоичном поиске (угловой регистр)
- Что не так в этом коде Python для регуляризованной линейной регрессии?
Я думаю, что 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
- различия первого порядка вдоль данной оси в массиве NumPy
- Застрял с HTTP-сервером Python с базовой аутентификацией с использованием BaseHTTP
- Преобразовать очень большое базовое число n в байты
- Пропущенный арифметический период – очистите мой код
- Скучные факториалы в python
- Итеративный или ленивый выбор проб
- Что не так с этим псевдокодом для версии Forster-Overfelt алгоритма обрезки полигонов Greiner-Horman?
- Как ускорить рекурсивный алгоритм
- Разделить кортеж кортежей (или список списков) парных значений в независимые комплекты?
- Как повысить производительность многих приложений в списке?
- Сортировка (шестнадцатеричный) цветов для соответствия радуге