在Julia中是否有标准的方法来获得数值一致性

在Julia中是否有标准的方法来获得数值一致性,julia,numerical-methods,zero,Julia,Numerical Methods,Zero,我知道,像0.1这样的小数如果不付出额外的努力,就不能准确地用二进制点表示 └─╼ 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 
 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
或者纯粹是象征性的

有几个舍入选项: 朱莉娅>圆形 四舍五入最接近的四舍五入最接近的四舍五入向上四舍五入 舍入从零舍入最近舍入到零舍入模式

如果不展开关于数值稳定性的长期讨论,Julia有推荐的风格吗


这真的不是关于朱莉娅的问题。这将出现在任何使用IEEE浮点算法的语言中,因为Julia只使用标准。因此,标准规则适用

  • 不要期望浮点计算是精确的。相反,请使用
    isapprox
    (或
    \approx
    测试浮点相同性≈) 适当设置公差
  • 如果你需要真正的小数,你应该使用有理数,就像你在那个例子中看到的那样
  • 另一个有用的东西可能是DecFP.jl,它使用IEEE十进制算法,因此在这种示例中更精确
  • 如果需要更精确,请使用更高的精度。
    BigFloat
    s有其用途

  • 另外还有
    sum\u kbn
    ,这可能是您的应用程序所需的全部:

    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
    

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

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


    注意误差的真正来源和放大误差的数值过程是很重要的。换句话说,对误差演算有一种感觉。转向精确算术通常是胡说八道。

    \≈ 非常值得了解,函数名似乎是isapprox而不是近似值。DecFP.jl看起来很有希望。有理数和大浮点数只是解决了我的用例的问题。
    julia>@Base.Test.Test 1≈ 0.9999999 atol=10.0^-7测试通过julia>@Base.Test.Test 1≈ 0.9999999 atol=10.0^-8测试失败
    您的用例是什么?您应该更具体一些。处理浮点运算的正确方法取决于应用程序。≈ 解决了它。DEET不相关。thx用于提问,tho。Q专门用于Julia方法。你回答得很好。@james的回答对描述加法案例特别有意思。但是≈ 确实让代码更具可读性和算术灵活性。当然,数字可能是危险的。thx!受你帖子的启发,我在Julia[.好东西]中找到了一个关于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.