微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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即使两个操作数都是.

原文地址:https://www.jb51.cc/java/126843.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐