在 Julia 中是否有标准的方法来获得数值一致性
Is there standard way to get numerical consistency in Julia
└─╼ 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 的问题。这将出现在任何使用 IEEE 浮点算法的语言中,因为 Julia 只使用标准。所以标准规则适用。
- 不要指望浮点计算是精确的。相反,使用
isapprox
(或 \approx
for ≈)测试浮点相同性并适当设置公差。
- 如果你需要真正的小数,你应该像你在那个例子中那样使用有理数。
- 另一个有用的东西可能是 DecFP.jl,它使用 IEEE 十进制算法,因此在这种示例中更加精确。
- 如果您需要更精确,请使用更高的精度。
BigFloat
有它们的目的。
还有 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.
一般来说,担心这个是没有用的"inconsistency"。你的数字小数点后十六位是错误的,这比你测量地球周长时的原子大小要小得多。
在实践中,您所处理的数量是以一定的分辨率和精度测量的,由近似模型描述并使用截断方法计算。
重要的是要处理错误的真正来源和放大它们的数字过程。换句话说,对错误演算有感觉。转向精确算术通常是无稽之谈。
└─╼ 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 的问题。这将出现在任何使用 IEEE 浮点算法的语言中,因为 Julia 只使用标准。所以标准规则适用。
- 不要指望浮点计算是精确的。相反,使用
isapprox
(或\approx
for ≈)测试浮点相同性并适当设置公差。 - 如果你需要真正的小数,你应该像你在那个例子中那样使用有理数。
- 另一个有用的东西可能是 DecFP.jl,它使用 IEEE 十进制算法,因此在这种示例中更加精确。
- 如果您需要更精确,请使用更高的精度。
BigFloat
有它们的目的。
还有 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.
一般来说,担心这个是没有用的"inconsistency"。你的数字小数点后十六位是错误的,这比你测量地球周长时的原子大小要小得多。
在实践中,您所处理的数量是以一定的分辨率和精度测量的,由近似模型描述并使用截断方法计算。
重要的是要处理错误的真正来源和放大它们的数字过程。换句话说,对错误演算有感觉。转向精确算术通常是无稽之谈。