【问题标题】:Different results for loops with decrement and increment具有递减和递增的循环的不同结果
【发布时间】:2017-09-14 01:06:47
【问题描述】:

我开始意识到,在递增和递减的迭代之间我没有得到相同的结果。当这个数学表达式 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

【问题讨论】:

    标签: julia ijulia-notebook


    【解决方案1】:

    这是因为在加法过程中发生浮点舍入误差,因为 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

    【讨论】:

    • 非常感谢,这很有帮助
    猜你喜欢
    • 2018-10-08
    • 2014-02-03
    • 2012-10-07
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2011-10-15
    相关资源
    最近更新 更多