当我想要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)
也有效,但当然这并不合理。
这是一个错误,还是我做错了什么?朱莉娅有没有合理的理由?
答案 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.7
是0.6999999999999999555910790149937383830547332763671875
。相反,使用7//10
可以避免此问题。