为什么我在Julia中为这些简单的操作得到错误的结果?

时间:2015-01-05 19:55:15

标签: floating-point julia

我开始使用Julia语言,但即使是基本的操作,我也很惊讶地看到了看似不正确的结果:

julia> 0.05*0.05
0.0025000000000000005

julia> 1.0-0.85-0.1
0.05000000000000002

这怎么可能?我该怎么做才能获得准确的结果?

1 个答案:

答案 0 :(得分:10)

  

我甚至惊讶于即使是基本操作也看似不正确的结果[...]这怎么可能?

二进制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

如果您有兴趣(即使您不感兴趣!),我强烈推荐 大卫戈德伯格的What every computer scientist should know about floating-point arithmetic。您可能也对TeX姊妹网站上的related answer of mine感兴趣。


  

我该怎么做才能获得准确的结果?

你只是在操纵理性数字吗?如果是这样,请知道Julia提供了 rational 类型,即允许您准确表示分数的类型。

默认使用的有理类型Rational{Int64}能够表示分子和分母落在64位整数范围内的任何有理数。 您可以使用此有理类型对有理数执行精确操作(禁止整数溢出):

julia> 1//20 * 1//20
1//400

julia> 1 - 17//20 - 1//10
1//20

此外,如果您需要arbitrary-precision有理数,可以使用Rational{BigInt}类型(请参阅Mr Alpha's comment