为什么这个复杂的理性在Julia中会出现溢出错误?

时间:2016-07-17 17:10:43

标签: math julia

当我想要Julia(0.4.3)计算(2.4 - 1.2im) // (0.7 - 0.6im)时,它会出现溢出错误:

ERROR: OverflowError()
 in * at rational.jl:188
 in // at rational.jl:45
 in // at rational.jl:42

然而,(24 - 12 im) // (0.7 - 0.6im),数学上必然相同,确实有效。此外,(2.4 - 1.2im) / (0.7 - 0.6im)也有效,但当然这并不合理。

这是一个错误,还是我做错了什么?朱莉娅有没有合理的理由?

1 个答案:

答案 0 :(得分:4)

您应该使用:

(24//10 - 12im//10) / (7//10 - 6im//10)

代替。

为什么会这样?你写的数字是浮点数 - 它们不是0.7或2.4,而是这些数字的近似值。您可以通过转换为Rational来看到这种效果:

julia> Rational{Int64}(0.7)
3152519739159347//4503599627370496

您的问题中使用的//运算符隐式转换为有理数,因此可以观察到这些结果。

现在为什么会出现OverflowError?因为类型是Rational{Int64},这意味着分子和分母只能存储Int64范围内的数字。请注意当我们尝试对这个数字求平方时会发生什么,例如:

julia> Rational{Int64}(0.7) * Rational{Int64}(0.7)
ERROR: OverflowError()
 in *(::Rational{Int64}, ::Rational{Int64}) at ./rational.jl:196
 in eval(::Module, ::Any) at ./boot.jl:234
 in macro expansion at ./REPL.jl:92 [inlined]
 in (::Base.REPL.##1#2{Base.REPL.REPLBackend})() at ./event.jl:46

OverflowError告诉我们,由此产生的理性在这种类型中不再完全可以表示,这是一件好事 - 毕竟,Rational的全部要点是确切的!这可以通过Rational{BigInt}来修复,但当然会带来严重的性能损失。

因此,问题的根源是0.7等等是浮点文字,因此不完全是0.7。事实上,确切地说,0.70.6999999999999999555910790149937383830547332763671875。相反,使用7//10可以避免此问题。