└─╼ 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
答案 0 :(得分:4)
这对朱莉娅来说真的不是一个问题。这将使用IEEE浮点运算以任何语言显示,因为Julia只使用该标准。所以标准规则适用。
isapprox
(或\approx
表示≈)并适当地设置公差来测试浮点相同性。 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)
一般来说,担心这种“不一致”是没用的。您的数字在十六分之一小数时是错误的,当您测量地球的周长时,这个数字远小于原子的大小。
在实践中,您处理的数量是以一定的分辨率和准确度来衡量的,用近似模型描述并用截断方法计算。
重要的是要注意错误的真正来源以及放大这些错误的数字过程。换句话说,有一种错误演算的感觉。转向精确算术通常是无稽之谈。