Странные результаты расчета чисел Фибоначчи

Я написал небольшую программу для эффективного вычисления чисел Фибоначчи:

function fib3(n)
    if n < 2
        return n
    else
        a = 0
        b = 1
        c = 0
        for i=2:n
            c = a + b
            a = b
            b = c
        end
        return b
    end
end
for n=1:110
    println(n,"\t",fib3(n))
end

Я получаю странный результат для больших чисел:

90  2880067194370816120
91  4660046610375530309
92  7540113804746346429
93  -6246583658587674878
94  1293530146158671551
95  -4953053512429003327
96  -3659523366270331776
97  -8612576878699335103
98  6174643828739884737
99  -2437933049959450366
100 3736710778780434371

В чем проблема? Что-то с типами?

1 ответ

Решение

Здесь попробуйте найти соответствующий диапазон в разделе "Минимальные и максимальные представимые значения":)

По-видимому, ваша установка является 64-битной, и, как сказано на этой странице, литералы по умолчанию являются Int64, и при переполнении вы наблюдаете "обходное поведение". Другими словами, 4660046610375530309+7540113804746346429 превысил максимальное значение, представленное 64-разрядным целым числом со знаком (2⁶³-1), поэтому следующее число в последовательности оказалось отрицательным. Это все еще число Фибоначчи, но по модулю 2⁶⁴ и обернуто в отрицательную область.

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