在Julia

时间:2017-12-04 23:51:05

标签: julia numerical-methods zero

└─╼ 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

如果没有开始对数值稳定性的长期讨论,朱莉娅是否有推荐的风格?

THX

3 个答案:

答案 0 :(得分:4)

这对朱莉娅来说真的不是一个问题。这将使用IEEE浮点运算以任何语言显示,因为Julia只使用该标准。所以标准规则适用。

  1. 不要指望浮点计算是准确的。相反,使用isapprox(或\approx表示≈)并适当地设置公差来测试浮点相同性。
  2. 如果你需要真正的小数,你应该使用像那个例子那样的有理数。
  3. 另一个有用的东西可能是使用IEEE十进制算术的DecFP.jl,因此在这种示例中更精确。
  4. 如果您需要更精确,请使用更高的精度。 BigFloat有他们的目的。

答案 1 :(得分:3)

此外,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.

答案 2 :(得分:0)

一般来说,担心这种“不一致”是没用的。您的数字在十六分之一小数时是错误的,当您测量地球的周长时,这个数字远小于原子的大小。

在实践中,您处理的数量是以一定的分辨率和准确度来衡量的,用近似模型描述并用截断方法计算。

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