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)

2 ответа

Решение

Я думаю, что Javascript имеет только тип данных Number, и это фактически двойник IEEE. 2870,048,561,233,730,600 слишком велико, чтобы вписать его в двойное значение IEEE, поэтому оно является приблизительным. (Обратите внимание, что конечный знак "00" - 17 десятичных знаков примерно подходит для двойного.)

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

Вы может быть сможет найти библиотеку Javascript bignum, если вы будете искать - например, http://silentmatt.com/biginteger/

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

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

parseInt('2870048561233731259')

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

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