为什么我在 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 )