java.lang.ArithmeticException: / by zero
在 Scala 中,整数算术 div 由零抛出 a ,但浮点算术 ( 1.0/0.0
) 返回似乎不一致Double.Infinity
。
我知道从类型的角度来看,同时拥有 Double.Infinity 和 Integer.Infinity 可能会很棘手,但我假设使用 scala 强大的类型系统,他们可以想出一些其他方法来解决问题的这方面。
还有什么我遗漏的东西可以更好地解释这两种不同的行为吗?
这是硬件限制,而不是软件限制,原因很简单:IEEE754 浮点运算明确支持+Inf
和-Inf
,即有对应于这两个想法的位表示,因此将它们作为 的结果是有意义的1.0/0.0
。
在通用处理器中实现的整数运算没有无穷大的内部表示,因此必须抛出错误。
您可以在软件中实现一个支持无穷大的整数类型,但它会更慢,因为除法运算不会直接对应于处理器的div
指令。这在我看来是不明智的:整数除零错误几乎总是由于(a)算法的错误实现或(b)未能正确验证用户输入,这两个都是必须解决的基本问题在编译代码之前,而不是在运行时通过异常!另一方面,在 FP 算术中,当您不(并且真的不能)期望它时,您可能很容易遇到 div-by-zero:1e-308/1e+308
具有正确的值,但double
即使两个操作数都是,它也不能表示为 a。