【问题标题】:Is there standard way to get numerical consistency in Julia是否有标准方法来获得 Julia 中的数值一致性
【发布时间】:2017-12-04 23:51:05
【问题描述】:
└─╼ julia 
 Version 0.6.0 (2017-06-19 13:05 UTC)  
 julia> 1.0 + 0.1 - 1.0 - 0.1 == 0
  false  
 julia> 1.0 + 0.1 - 1.0 - 0.1
  8.326672684688674e-17

我知道像 0.1 这样的小数不能在没有额外工作的情况下以二进制点精确表示,例如

julia> 1//10
 1//10
julia> 1 + 1//10
 11//10
julia> 1 + 1//10 - 1
 1//10
julia> 1 + 1//10 - 1 - 1//10
 0//1
julia> 1 + 1//10 - 1 - 1//10 == 0
 true

或者纯粹是象征性的。

有几个舍入选项: 朱莉娅> 圆形 RoundDown RoundNearest RoundNearestTiesUp RoundUp RoundFromZero RoundNearestTiesAway RoundToZero RoundingMode

如果没有对数值稳定性进行冗长的讨论,Julia 是否有推荐的风格?

谢谢

【问题讨论】:

    标签: julia numerical-methods zero


    【解决方案1】:

    这真的不是关于 Julia 的问题。这将出现在任何使用 IEEE 浮点运算的语言中,因为 Julia 只使用该标准。所以标准规则适用。

    1. 不要期望浮点计算是精确的。相反,使用isapprox(或\approx for ≈)测试浮点相同性并适当设置容差。
    2. 如果您需要真正的小数,您应该使用您在该示例中的有理数。
    3. 另一个有用的东西可能是 DecFP.jl,它使用 IEEE 十进制算法,因此在这种示例中更精确。
    4. 如果您需要更精确,请使用更高的精度。 BigFloats 有其目的。

    【讨论】:

    • \approx for ≈ 非常好知道,函数名似乎是 isapprox 而不是 approx。 DecFP.jl 看起来很有希望。 Rationals 和 BigFloats 只是为我的用例解决了问题。 julia> @Base.Test.test 1 ≈ 0.9999999 atol=10.0^-7 Test Passed julia> @Base.Test.test 1 ≈ 0.9999999 atol=10.0^-8 Test Failed
    • 您的用例是什么?你应该更具体地说明这一点。处理浮点运算的正确方法取决于应用程序。
    • ≈ 解决了它。 deets 是不相关的。谢谢你的询问,寿。 Q 专门用于 Julia 方法。你已经很好地回答了这个问题。 @james 的回答对于描述加法案例很有趣,特别是。然而,≈ 确实使代码更具可读性和算术灵活性。当然,数字可能很危险。
    【解决方案2】:

    还有sum_kbn,这可能是您的应用程序所需的全部内容:

    julia> sum([1.0, 0.1, - 1.0, - 0.1])
    8.326672684688674e-17
    
    julia> sum_kbn([1.0, 0.1, - 1.0, - 0.1])
    0.0
    
    help?> sum_kbn
    search: sum_kbn cumsum_kbn
    
      sum_kbn(A)
    
      Returns the sum of all elements of A, using the Kahan-Babuska-Neumaier compensated summation algorithm for additional accuracy.
    

    【讨论】:

    【解决方案3】:

    一般来说,担心这种“不一致”是没有用的。你的数字在小数点后的第十六位是错误的,这比你测量地球周长时的原子大小要小得多。

    在实践中,您处理的量以一定的分辨率和精度进行测量,通过近似模型描述并使用截断方法计算。

    重要的是要注意错误的真正来源以及放大它们的数值过程。换句话说,对误差计算有一种感觉。转向精确算术通常是无稽之谈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 2018-03-11
      • 2021-12-26
      相关资源
      最近更新 更多