3 回答
TA贡献1946条经验 获得超4个赞
简而言之,这就是在IEEE-754标准中指定的方式,这是Java的浮点运算所基于的。
为什么不除以零(或上溢或下溢)会停止程序或触发错误?为什么数字标准包含“非数字”(NaN)?
754模型鼓励强大的程序。它不仅适用于数值分析人员,还适用于电子表格用户,数据库系统甚至咖啡壶。NaN和无穷大的传播规则允许无关紧要的异常消失。同样,渐进式下溢会在精度范围内保持错误属性。
当需要注意特殊情况时,可以通过陷阱立即检查它们,或者在方便的时候通过状态标志对其进行检查。陷阱可用于停止程序,但是不可恢复的情况极为罕见。对于嵌入式系统或网络代理,仅停止程序是不可行的。陷阱通常会记录诊断信息或替代有效结果。
标志提供可预测的控制流和速度。它们的使用要求程序员注意异常情况,但是标志的粘性允许程序员将异常情况的处理推迟到必要时。
TA贡献1810条经验 获得超5个赞
超越无限
class DoubleDivision {
public static void main(String[] args) {
System.out.println(5.0/0.0);
}
}
上面的代码以及您提到的摘录给出了infinity。
为什么Java使用Doubles代表小数。二进制不能完全表示一个数字,它只能表示一个近似值,因此Java的double都不能。
想象一个数字非常接近零。如果您知道微积分,请想象一个零极限。变量将接近零到某个可以想象到的微小距离,但永远不会完全相等。你可以想象的吧?好吧,假设该数字对于Java表示需要非常高的精度,它会放弃并调用它,0.0因为它没有很好的选择。这就是这里发生的事情。任何规则数除以超级接近数等于零的值基本上就是infinity。试试看:5 / (10^-100)。
另请参阅部分:数学错误中的特殊浮点值以获取更多信息:)
相关问题:为什么1/0给错误而1.0 / 0/0给inf
更新: INT没有NaNset 的无穷大和值,而float却有无穷大和NaN值。(根据java遵循的IEEE 754标准)
添加回答
举报