scala:为什么1/0是算术异常,但1.0 / 0.0 = Double.Infinity

时间:2013-02-20 22:01:49

标签: java scala

似乎不一致的是,在Scala中,整数运算div除零会抛出java.lang.ArithmeticException: / by zero,但浮点运算(1.0/0.0)会返回Double.Infinity

我理解从类型的角度来看,同时拥有Double.Infinity和Integer.Infinity可能会很棘手,但我认为使用scala强大的类型系统他们可以想出一些其他方法来解决问题的这个方面

我还缺少哪些可以更好地解释这两种不同的行为?

1 个答案:

答案 0 :(得分:15)

这是硬件限制,而不是软件限制,原因很简单:IEEE754浮点算法明确支持+Inf-Inf,即有一些位表示与这两个想法相对应,因此,将它们作为1.0/0.0的结果是有道理的。

在通用处理器中实现的整数运算没有无穷大的内部表示,因此必须抛出错误。

你可以实现一个支持软件无穷大的整数类型,但它会慢一些,因为除法运算不能直接对应处理器 的div指令。在我看来这是不明智的:由于(a)算法的错误实现或(b)无法正确验证用户输入,整数除零错误几乎总是,这两者都是在编译代码之前必须解决的基本问题,而不是在运行时通过异常!另一方面,在FP算术中,当您不(并且实际上不能)期望它时,您可能很容易遇到div:by 1e-308/1e+308具有正确的值,但它不能表示为{{ 1}}即使两个操作数都是。