2017-09-14 8 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)を使用してこの問題を解決できます。また、あなたがのIntのようxとyを定義し、それらへのfloat64さんを追加して進み、あなたの元のコードで

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 

注 - これは真剣にhttps://github.com/JuliaArbTypes/ArbFloats.jl

をチェックしてください。また

https://docs.julialang.org/en/latest/manual/performance-tips/#Avoid-changing-the-type-of-a-variable-1)あなたのコードが遅くなります
+0

ありがとう、これはとても役に立ちました –

関連する問題