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

前端之家收集整理的这篇文章主要介绍了java – scala:为什么1/0是算术异常但是1.0 / 0.0 = Double.Infinity前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
看起来不一致的是,在 Scala中,整数算术除以零会抛出一个java.lang.ArithmeticException:/ by零,但浮点运算(1.0 / 0.0)会返回Double.Infinity.

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

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

解决方法

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

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

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

猜你在找的Java相关文章