在 Scala 中,整数算术除以零会抛出 a,这似乎不一致java.lang.ArithmeticException: / by zero
,但是浮点运算(1.0/0.0
) 返回Double.Infinity
.
我知道从类型的角度来看,同时拥有 Double.Infinity 和 Integer.Infinity 可能会很棘手,但我认为使用 scala 强大的类型系统,他们可以找到其他方法来解决该方面的问题。
我还缺少其他什么东西可以更好地解释这两种不同的行为吗?
这是硬件限制,而不是软件限制,原因很简单:IEEE 754 浮点运算显式支持+Inf
and -Inf
,即存在与这两个想法相对应的位表示,因此它们作为以下结果是有意义的1.0/0.0
.
在普通处理器中实现的整数算术没有无穷大的内部表示,因此必须抛出错误。
您可以在软件中实现支持无穷大的整数类型,但它会更慢,因为除法运算不会直接对应于处理器
的div
操作说明。在我看来,这是不明智的:整数除零错误是几乎总是由于(a)算法的错误实现或(b)未能正确验证用户输入,这两个问题都是必须在编译代码之前解决的基本问题,而不是在运行时通过异常解决!另一方面,在 FP 算术中,当您没有(并且确实不能)期望它时,您可能很容易遇到被零除的情况:1e-308/1e+308
有一个正确的值,但它不能表示为double
即使两个操作数都是。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)