2017-09-14 85 views
0

我已經認識到,在遞增和遞減迭代之間我沒有得到相同的結果。當這個數學表達式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 

回答

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

還檢查了https://github.com/JuliaArbTypes/ArbFloats.jl

+0

非常感謝,這非常有幫助 –