Joe*_*ile 1 julia ijulia-notebook
我开始意识到,在增量和减量迭代之间我没有得到相同的结果。n + (1/(i^4))当这个数学表达式迭代并在其自身上添加新值 75 次以上(即i迭代次数)时,我得到了轻微的差异。在 75 次迭代下,每个循环的结果保持不变。对于为什么会发生这种情况有什么想法吗?这是我正在运行的代码:
y=0
for i in 1:75
y = y + (1/(i^4))
end
print("final y value: ",y,"\n")
x=0
for i in 75:-1:1
x = x + (1/(i^4))
end
print("final x value: ",x,"\n")
Run Code Online (Sandbox Code Playgroud)
我得到了 x 和 y 的值:
final y value: 1.0823224592496965
final x value: 1.0823224592496967
Run Code Online (Sandbox Code Playgroud)
但是,如果我将循环限制更改为 74 或更少(以下示例中为 74),则两个循环都会得到相同的结果:
final y value: 1.0823224276447583
final x value: 1.0823224276447583
Run Code Online (Sandbox Code Playgroud)
这是因为由于 Float64 的精度,加法过程中会出现浮点舍入误差。如果舍入误差很重要,您可以使用任意精度浮点数(即 BigFloats)来解决此问题。
y = BigFloat(0)
#0.000000000000000000000000000000000000000000000000000000000000000000000000000000
for i in 1:75
y += 1/(i^4)
end
x = BigFloat(0)
for i in 75:-1:1
x += 1/(i^4)
end
print("final x value: ",x,"\n")
#final x value: 1.082322459249696627186876349853547531892905553263517504092305898666381835937500
print("final y value: ",y,"\n")
#final y value: 1.082322459249696627186876349853547531892905553263517504092305898666381835937500
Run Code Online (Sandbox Code Playgroud)
另请注意,在原始代码中,您将 x 和 y 定义为 Int,然后继续向它们添加 Float64 - 这会严重减慢您的代码速度(https://docs.julialang.org/en/latest/manual/performance-tips /#避免更改变量的类型1 )
另请查看https://github.com/JuliaArbTypes/ArbFloats.jl