4

我在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

4

2 回答 2

3

您不能使用 int 表示无穷大或 NAN。

来自JLS

浮点除法的结果由 IEEE 754 算术规则确定:

非零有限值除以零导致有符号无穷大。符号由上述规则确定。

检查IEEE 解释

为什么除以零(或上溢或下溢)不会停止程序或触发错误?为什么数字标准包括“非数字”(NaN)?754 模型鼓励强大的程序。它不仅适用于数值分析师,还适用于电子表格用户、数据库系统甚至咖啡壶。NaN 和无穷大的传播规则允许无关紧要的异常消失。类似地,逐渐下溢在精度范围内保持误差属性。

当需要注意异常情况时,可以通过陷阱立即检查它们,或者在方便的时候通过状态标志检查它们。陷阱可用于停止程序,但不可恢复的情况极为罕见。简单地停止程序不是嵌入式系统或网络代理的选项。更多情况下,陷阱会记录诊断信息或替换有效结果。

标志提供可预测的控制流和速度。它们的使用要求程序员了解异常情况,但标志粘性允许程序员延迟处理异常情况,直到必要时。

于 2015-03-31T14:04:24.760 回答
0

无穷大或未定义的数字不是整数集的一部分,因此它们被排除在int和之外Integer。这在大多数编程语言中都是一样的,而不是Java本身。

但真正的原因当然是历史原因。过去使用 2 补码二进制逻辑来表示整数。标准中没有NaNor Infinity

于 2015-03-31T14:03:31.353 回答