我开始使用Julia语言,但即使是基本的操作,我也很惊讶地看到了看似不正确的结果:
julia> 0.05*0.05
0.0025000000000000005
和
julia> 1.0-0.85-0.1
0.05000000000000002
这怎么可能?我该怎么做才能获得准确的结果?
答案 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)