Julia BigFloat不提供任意精度

Julia BigFloat不提供任意精度,julia,Julia,我使用Chudnovsky算法计算pi的数字,这是我的代码: qMax = 1000000 L = Vector{BigFloat}(undef, qMax) L[1] = 13591409 for q in 2:qMax L[q] = L[q-1] + 545140134 end X = Vector{BigFloat}(undef, qMax) X[1] = 1.0 for q in 2:qMax X[q] = X[q-1] * (-262537412640768000)

我使用Chudnovsky算法计算pi的数字,这是我的代码:

qMax = 1000000

L = Vector{BigFloat}(undef, qMax)
L[1] = 13591409
for q in 2:qMax
    L[q] = L[q-1] + 545140134
end

X = Vector{BigFloat}(undef, qMax)
X[1] = 1.0
for q in 2:qMax
    X[q] = X[q-1] * (-262537412640768000)
end

M = Vector{BigFloat}(undef, qMax)
M[1] = 1.0
for q in 2:qMax
    M[q] = M[q-1] * (((12*(q-2) + 2) * (12*(q-2)+6) * (12*(q-2) + 10))/(q-1)^3)
end

result = 0
for q in 1:qMax
    global result += (M[q] * L[q]) / X[q]
end
print(426880 * sqrt(10005) * 1/result)

但是当我打印结果时,在qMax的1、10、1000等值的3后面会得到相同的位数。如何在3之后获取任意多个数字?

您可以使用
设置精度

julia> BigFloat(π)
3.141592653589793238462643383279502884197169399375105820974944592307816406286198

julia> setprecision(BigFloat, 1024)
1024

julia> BigFloat(π)
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724586997

julia> 
也可以在构造函数中指定精度:

julia> BigFloat(π, precision=2048)
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526357
julia> setprecision(BigFloat, 10) # low precision
10

julia> BigFloat(1) / 3
0.3335 # OK, low precision, as expected

julia> BigFloat(1, precision=100) / 3
0.3335 # Low precision still!
但是,运算符似乎不尊重构造函数中设置的精度:

julia> BigFloat(π, precision=2048)
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526357
julia> setprecision(BigFloat, 10) # low precision
10

julia> BigFloat(1) / 3
0.3335 # OK, low precision, as expected

julia> BigFloat(1, precision=100) / 3
0.3335 # Low precision still!
我希望通过整个表达式传播更高的精度,但事实似乎并非如此

编辑:我打开了这个行为


编辑2:

在更新
M
的循环中,所有的计算都是在
q
上完成的,这是一个正则整数,因此当您除以
(q-1)^3
时,这将意味着正则浮点除法,不涉及
大浮点

您可以像这样使用
BigFloat

for q in 2:qMax
    # Use `BigFloat`!
    q_f = BigFloat(q)
    M[q] = M[q-1] * (
        (
            (12*(q_f-2) + 2) * (12*(q_f-2)+6) * (12*(q_f-2) + 10)
        ) / (q_f-1)^3
    )
end
代码:

输出:

~/test $ julia so2.jl
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587042
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724586997

看起来除法隐式地使用了默认的精度:有没有办法解决这个问题?我的pi值在前15位之后不正确,因为qMax@lampbottle,调用
setprecision(BigFloat,1024)
应使所有
BigFloat
math使用精度1024即使在设置了setprecision(BigFloat,1000)之后,只有pi的前15位是正确的。@lampball,
sqrt(10005)
返回一个常规的
Float64
,而不是
BigFloat
,这会影响
1/结果的精度