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

nai*_*rbv 6 java scala

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

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

还有其他我想念的东西可以更好地解释这两种不同的行为吗?

us2*_*012 15

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

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

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

  • 实际上,进入try块应该(在任何体面的jvm上)是免费的.不需要setjmp调用,抛出异常时需要做的就是走调用堆栈,检索每个帧的指令指针,用它来获取相应方法的信息记录(我是假设代码在这里被jitted,如果我们处于解释模式,这将是直接的)并检查指令指针是否在方法的任何catch块内.所有工作都在投掷时进行,进入try块不会产生任何惩罚(正常执行已经需要维护一个调用堆栈) (2认同)