为什么在下面的场景中将Double.isNan()值设为False?

时间:2017-07-05 05:12:34

标签: java

任何人都可以解释为什么标志值返回False?

double a = 1.0;
double b = 0.0;
double c = a / b;
boolean flag = Double.isNaN(c);
System.out.println(flag); // False?
System.out.println(c); // Infinity

2 个答案:

答案 0 :(得分:2)

这是由于IEEE 754标准中浮点表示的定义。该标准具有“无限”和“NaN”的表示。 “无穷大”用于产生无限结果(例如1/0或tan(pi / 2)[*])或产生绝对值大于格式可表示的最大可能数的结果。更确切地说,在数学中,确实没有无限结果这样的东西;相反,它是根据限制来定义的。因此,1/0不存在,但是当x接近0时1 / x的限制是无限的。

NaN以“不确定形式”返回。在数学中,这些是诸如0/0的情况,当仅通过查看分子和分母无法确定限制时。 (如果你有两个函数f(x)和g(x),其中值在某个点f(a)= g(a)= 0都是0,那么你无法确定f(x)/的极限g(x)当x接近a时,没有额外的工作,例如L'Hopital的规则。)NaN也会返回,例如取负数的平方根。

在Java中,isNan仅对实际NaN返回true,而不是无穷大。尽管无穷大确实“不是数字”,但它根据IEEE标准不符合NaN的定义。

有关哪些操作生成NaN的定义,请参阅here

[*]请注意,“pi”不能用浮点数精确表示,所以这实际上不是一个可以在计算机上产生“无限结果”的操作。

答案 1 :(得分:1)

这就是IEEE-754标准所说的。将非零浮点数除以零时,它不会返回数字,而是infinity

看看这个:http://grouper.ieee.org/groups/754/faq.html#exceptions