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

Math 为什么这个复杂的rational在Julia中会出现溢出错误?,math,julia,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-12im)/(0.7-0.6im),确实起作用。另外,(2.4-1.2im)/(0.7-0.6im)也可以工作,但这当然不能给出合理的解释 这是一个错误,还是

当我希望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-12im)/(0.7-0.6im)
,确实起作用。另外,
(2.4-1.2im)/(0.7-0.6im)
也可以工作,但这当然不能给出合理的解释

这是一个错误,还是我做错了什么?Julia有没有不能使用的理性?

你应该使用:

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

为什么会发生这种情况?你写的数字是浮点数,不是0.7或2.4,而是这些数字的近似值。通过转换为Rational,可以看到这种效果:

julia> Rational{Int64}(0.7)
3152519739159347//4503599627370496
您问题中使用的
/
运算符对有理数进行了隐式转换,因此可以观察到类似的结果

为什么会发生
溢出错误
?因为类型是
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
overflowerrror
告诉我们,由此产生的rational不再是这种类型的精确表示,这毕竟是一件好事,
rational
的全部要点是精确的!这可以通过
Rational{BigInt}
来解决,但当然这会带来巨大的性能损失


因此问题的根源在于
0.7
等都是浮点文本,因此不完全是
0.7
。实际上,精确地表示,
0.7
0.6999999999555910790149937338305477332763671875
。相反,使用
7//10
可以避免这个问题。

非常感谢您的解释!现在我知道你不能在理性中使用浮点数(因为浮点数并不精确)。我在不久前报告过这是一个Julia bug,Simon Byrne有一个修复方法,其中包括禁止使用//。在电话上,所以现在不能把参考资料放在这里。