我在java中听到了一个转折。如果有人知道你被要求分享的正确原因。问题是:
double result1 = 1.0/0.0;
sop(result1); // output Infinity
double result2 = 0.0/0.0;
sop(result2); // output NaN
float
变量也是如此。但对于 int 类型它的提升ArithmeticException
。为什么?
注意:我使用的是 jdk 1.7
我在java中听到了一个转折。如果有人知道你被要求分享的正确原因。问题是:
double result1 = 1.0/0.0;
sop(result1); // output Infinity
double result2 = 0.0/0.0;
sop(result2); // output NaN
float
变量也是如此。但对于 int 类型它的提升ArithmeticException
。为什么?
注意:我使用的是 jdk 1.7
您不能使用 int 表示无穷大或 NAN。
来自JLS
浮点除法的结果由 IEEE 754 算术规则确定:
非零有限值除以零导致有符号无穷大。符号由上述规则确定。
检查IEEE 解释
为什么除以零(或上溢或下溢)不会停止程序或触发错误?为什么数字标准包括“非数字”(NaN)?754 模型鼓励强大的程序。它不仅适用于数值分析师,还适用于电子表格用户、数据库系统甚至咖啡壶。NaN 和无穷大的传播规则允许无关紧要的异常消失。类似地,逐渐下溢在精度范围内保持误差属性。
当需要注意异常情况时,可以通过陷阱立即检查它们,或者在方便的时候通过状态标志检查它们。陷阱可用于停止程序,但不可恢复的情况极为罕见。简单地停止程序不是嵌入式系统或网络代理的选项。更多情况下,陷阱会记录诊断信息或替换有效结果。
标志提供可预测的控制流和速度。它们的使用要求程序员了解异常情况,但标志粘性允许程序员延迟处理异常情况,直到必要时。
无穷大或未定义的数字不是整数集的一部分,因此它们被排除在int
和之外Integer
。这在大多数编程语言中都是一样的,而不是Java
本身。
但真正的原因当然是历史原因。过去使用 2 补码二进制逻辑来表示整数。标准中没有NaN
or Infinity
。