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

2019-08-17 02:05发布

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

据我所知,从类型角度来看,它可能会非常棘手,同时拥有一个Double.Infinity和Integer.Infinity,但我相信与Scala的他们可以想出一些其他的方式来解决问题,这方面强大的类型系统。

有别的我失踪,将更好地解释这两种不同的行为?

Answer 1:

这是硬件限制,不是软件之一,原因很简单:IEEE754浮点运算明确支持+Inf-Inf ,即有对应于这两种观念位表示,因此,它是有道理的,他们是的结果1.0/0.0

在共同的处理器中实现整数运算不具有无穷大的内部表示,因此必须抛出一个错误。

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



文章来源: scala: why is 1/0 an arithmetic exception but 1.0/0.0 = Double.Infinity
标签: java scala