计算非常大的 N 的调和级数(任意精度问题)
Computing harmonic series for very large N (arbitrary precision problems)
这是我提出的 的后续问题。
我正在尝试将调和级数计算为非常大的项,但是与 log(n)+γ 进行比较时,我没有得到预期的错误。
我怀疑主要问题出在 BigFloat
julia 类型上。
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
理应解决算术精度问题,但事实似乎并非如此。
注意:我尝试使用未设置精度和 256 位精度的 BigFloat。
您必须确保在任何地方都使用 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
然后在测试中(注意log
下的BigFloat
):
julia> harmonic_bf(n)-log(BigFloat(n))-γ > lower_bound(BigFloat(n))
true
这是我提出的
我正在尝试将调和级数计算为非常大的项,但是与 log(n)+γ 进行比较时,我没有得到预期的错误。
我怀疑主要问题出在 BigFloat
julia 类型上。
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
理应解决算术精度问题,但事实似乎并非如此。
注意:我尝试使用未设置精度和 256 位精度的 BigFloat。
您必须确保在任何地方都使用 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
然后在测试中(注意log
下的BigFloat
):
julia> harmonic_bf(n)-log(BigFloat(n))-γ > lower_bound(BigFloat(n))
true