计算非常大N的谐波系列(任意精度问题)

Adr*_*ian 1 precision arbitrary-precision julia

这是我前一个问题的后续问题.

我正在尝试将Harmonic系列计算为非常大的项,但是当与log(n)+γ进行比较时,我没有得到预期的误差.

我怀疑主要问题是BigFloatjulia类型.

harmonic_bf = function(n::Int64)
    x=BigFloat(0)
    for i in n:-1:1
        x += BigFloat(1/i)
    end
    x
end
Run Code Online (Sandbox Code Playgroud)

例如,众所周知,公式的下限: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
Run Code Online (Sandbox Code Playgroud)

它让我疯狂,我似乎无法理解缺少的东西...... BigFloat应该让算术精度问题解决,但似乎并非如此.

注意:我尝试使用未设置的精度和256位精度的BigFloat.

Bog*_*ski 5

你必须确保你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
Run Code Online (Sandbox Code Playgroud)

然后在测试中(通知BigFloatlog):

julia> harmonic_bf(n)-log(BigFloat(n))-? > lower_bound(BigFloat(n))
true
Run Code Online (Sandbox Code Playgroud)