为什么我在 Julia 中的这些简单操作会得到不正确的结果?
Why am I getting incorrect results for these simple operations in Julia?
我已经开始使用 Julia 语言,但令我惊讶的是即使是基本操作也会得到看似不正确的结果:
julia> 0.05*0.05
0.0025000000000000005
和
julia> 1.0-0.85-0.1
0.05000000000000002
怎么会这样?我该怎么做才能获得准确的结果?
I'm surprised to get seemingly incorrect results with even basic operations [...] How can this be?
二进制 IEEE-754 浮点数 (which Julia uses) 无法准确表示 0.05、0.85 和 0.1 等数字。
比如你在Julia中写0.05
的时候,机器操纵的数字是一个非常接近实际数字0.05的数字,而不是正好0.05 .因此,您不能指望 0.05*0.05
等 Julia 表达式的计算结果恰好为 0.0025。
更多违反直觉的例子?尝试
julia> 1-0.2-0.2-0.2-0.2-0.2
5.551115123125783e-17
julia> 0.6/0.2 == 3
false
如果您有兴趣(即使您不感兴趣!),我强烈推荐
David Goldberg 在 TeX 姐妹网站上的 What every computer scientist should know about floating-point arithmetic. You may also be interested in this related answer of mine。
And what can I do to obtain exact results?
你只是在操纵有理数吗?如果是这样,请知道 Julia 提供了 rational 类型,即允许您准确表示分数的类型。
默认使用的有理数类型Rational{Int64}
能够表示分子和分母在64位整数范围内的任何有理数。
您可以使用此有理数类型对有理数执行精确运算(除非整数溢出):
julia> 1//20 * 1//20
1//400
julia> 1 - 17//20 - 1//10
1//20
此外,如果你想要arbitrary-precision rational numbers, you can use the Rational{BigInt}
type (see )
我已经开始使用 Julia 语言,但令我惊讶的是即使是基本操作也会得到看似不正确的结果:
julia> 0.05*0.05
0.0025000000000000005
和
julia> 1.0-0.85-0.1
0.05000000000000002
怎么会这样?我该怎么做才能获得准确的结果?
I'm surprised to get seemingly incorrect results with even basic operations [...] How can this be?
二进制 IEEE-754 浮点数 (which Julia uses) 无法准确表示 0.05、0.85 和 0.1 等数字。
比如你在Julia中写0.05
的时候,机器操纵的数字是一个非常接近实际数字0.05的数字,而不是正好0.05 .因此,您不能指望 0.05*0.05
等 Julia 表达式的计算结果恰好为 0.0025。
更多违反直觉的例子?尝试
julia> 1-0.2-0.2-0.2-0.2-0.2
5.551115123125783e-17
julia> 0.6/0.2 == 3
false
如果您有兴趣(即使您不感兴趣!),我强烈推荐 David Goldberg 在 TeX 姐妹网站上的 What every computer scientist should know about floating-point arithmetic. You may also be interested in this related answer of mine。
And what can I do to obtain exact results?
你只是在操纵有理数吗?如果是这样,请知道 Julia 提供了 rational 类型,即允许您准确表示分数的类型。
默认使用的有理数类型Rational{Int64}
能够表示分子和分母在64位整数范围内的任何有理数。
您可以使用此有理数类型对有理数执行精确运算(除非整数溢出):
julia> 1//20 * 1//20
1//400
julia> 1 - 17//20 - 1//10
1//20
此外,如果你想要arbitrary-precision rational numbers, you can use the Rational{BigInt}
type (see