2015-12-10 13 views
9

Pracuję nad problemem Rosalind Mortal Fibonacci Rabbits, a strona internetowa mówi mi, że moja odpowiedź jest błędna, kiedy używam algorytmu napisanego JavaScript. Kiedy używam tego samego algorytmu w Pythonie, otrzymuję inną (i poprawną) odpowiedź.Javascript daje inną odpowiedź na ten sam algorytm w Pythonie

Ta niespójność występuje tylko wtedy, gdy wynik staje się duży. Na przykład fibd(90, 19) zwraca 2870048561233730600 w JavaScript, ale w Pythonie otrzymuję 2870048561233731259.

Czy jest coś na temat liczb w JavaScript, które dają mi inną odpowiedź lub czy popełniam subtelny błąd w moim kodzie JavaScript?

Rozwiązanie 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 rozwiązanie:

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) 
+0

Czy możesz podać jakiś przykład? Uruchomiłem twój kod i daje ten sam wynik dla wejścia (10,10). Jednak widzę literówkę "rp.splice (0, 0, rp.reduce (funkcja (e, s) {return s + e;}) - rP [0]);". Czy to możliwe? Jeśli nie, czy istnieje punkt rozbieżności? –

+0

Dobra uwaga. Dodałem przykład. Zdarza się to na większych wejściach. Dobry połów na literówkę. Dzięki, ale to nie problem. To tylko ja próbowałem uczynić nazwy zmiennych tak samo, a ja po prostu przegapiłem jedną zmienną do aktualizacji. Literówka jest teraz naprawiona – Cristian

Odpowiedz

13

myślę JavaScript ma tylko "numer" typ danych, a to faktycznie IEEE podwójna pod maską. 2 870,048,561,233,730,600 jest zbyt duży, aby utrzymać dokładnie w IEEE podwójne, więc jest zbliżony. (Zwróć uwagę, że końcowe "00" - 17 miejsc po przecinku jest prawie równe podwójnie.)

Python z drugiej strony ma wsparcie bignum i będzie dość wesoło radził sobie z 4096 bitowymi liczbami całkowitymi (dla tych, którzy bawią się algorytmami kryptograficznymi, to jest ogromne dobrodziejstwo).

Ty potęga będą mogli znaleźć bignum biblioteki JavaScript, jeśli szukać - na przykład http://silentmatt.com/biginteger/

7

prostu robi trochę badań, artykuł ten wydaje się interesująca. Javascript only supports 53bits integers.

Wynik podany przez Pythona jest rzeczywiście poza maksymalnym bezpiecznym zakresem dla JS. Jeśli spróbujesz zrobić

parseInt('2870048561233731259') 

To rzeczywiście powrócić

2870048561233731000 
Powiązane problemy