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