我已经意识到,在递增和递减的迭代之间我得不到相同的结果。当这个数学表达式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")
我为x和y得到了这个:
final y value: 1.0823224592496965
final x value: 1.0823224592496967
但是,如果我将循环限制更改为74或更低(在以下示例中为74),则两个循环都得到相同的结果:
final y value: 1.0823224276447583
final x value: 1.0823224276447583
答案 0 :(得分:4)
这是因为在添加过程中发生的浮点舍入错误,因为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
另请注意,在原始代码中,您将x和y定义为Int,然后继续向其添加Float64 - 这将严重降低代码速度(https://docs.julialang.org/en/latest/manual/performance-tips/#Avoid-changing-the-type-of-a-variable-1)