Вычисление рядов гармоник для очень больших N (произвольные задачи точности) - PullRequest
0 голосов
/ 02 ноября 2018

Это дополнительный вопрос к предыдущему , который я задал.

Я пытаюсь вычислить ряд Harmonic для очень больших терминов, однако при сравнении с log (n) + γ я не получаю ожидаемой ошибки.

Я подозреваю, что основная проблема связана с типом BigFloat Джулия.

harmonic_bf = function(n::Int64)
    x=BigFloat(0)
    for i in n:-1:1
        x += BigFloat(1/i)
    end
    x
end

Например, хорошо известно, что нижняя граница для формулы: H_n - log (n) - γ равна 1/2 / (n + 1). Тем не менее, это верно для n = 10 ^ 7, а затем не для n = 10 ^ 8.

n=10^8
γ = big"0.57721566490153286060651209008240243104215933593992"
lower_bound(n) = 1/2/(n+1)

>>> harmonic_bf(n)-log(n)-γ > lower_bound(BigFloat(n))
false

Это сводит меня с ума, я, кажется, не могу понять, чего не хватает ... BigFloat предположительно должно устранить проблемы арифметической точности, но, похоже, это не так.

Примечание. Я пытался использовать BigFloat с неопределенной точностью и с 256-битной точностью.

1 Ответ

0 голосов
/ 03 ноября 2018

Вы должны убедиться, что вы используете BigFloat везде. Сначала в вашей функции (обратите внимание, что BigFloat(1/n) не совпадает с 1/BigFloat(i)):

function harmonic_bf(n::Int64)
    x=BigFloat(0)
    for i in n:-1:1
        x += 1/BigFloat(i)
    end
    x
end

и затем в тесте (уведомление BigFloat под log):

julia> harmonic_bf(n)-log(BigFloat(n))-γ > lower_bound(BigFloat(n))
true
...