“isNaN(INFINITY)== false”是假的

时间:2013-12-21 20:08:10

标签: java c++ .net nan infinity

Infinity不是任何标准数学中的数字,这会让人想到表达式

Double.isNaN(Double.POSITIVE_INFINITY)

应评估为true。但是,快速测试显示它的评估结果为false。仔细查看函数规范可以证实我的怀疑:“isNaN”不应被解释为“不是数字”,而是“是非数字值”。

我的问题是他们为什么这样实施呢?他们为什么不以这样的方式实现它呢?它还会返回false正无穷大?

在实践中,我现在更频繁地使用(Double.isNaN(x) || Double.isInfinite(x))方式,而不是仅使用Double.isNaN(x)。因此,最好分别使用Double.isNaN(x)(Double.isNaN(x) && !Double.isInfinite(x))

即使现在改变它会让人感到困惑 - 以我在这里描述的方式实现和解释这个功能会不会更好?

还有哪些其他考虑因素在这里发挥作用?

PS:请省略对被排除在外的中间人的法律的任何评论。 ;)

3 个答案:

答案 0 :(得分:9)

博士。 William Kahan在那里有许多作品解释他在IEEE-754.

中做出决定背后的想法

我建议你阅读他的作品来理解推理。他是IEEE-754背后的主要力量之一,所以最好从马的口中得到答案。

顺便说一下,在技术意义上,+ / - Inf是affinely extended real number system.中的数字所以,仅仅因为这个原因,我希望isNaN在无限上返回false。

答案 1 :(得分:3)

您正在寻找for isFinite,这是一个在无穷大和NaN上返回false的函数。由于显而易见的原因,将这个函数或它的否定称为isNaN是很困惑的(一个好的做法是避免名称中的不必要的否定,以便你想到的isnotanumber函数会更好地命名isanumber。此函数存在,它被称为isFinite)。

答案 2 :(得分:0)

你错了。如果你看高级数学,通常将无穷大视为一个数字。例如,在复杂分析中,通常 1 + 0i (取决于所选择的投影,它可能是不同的值)。也就是说,IEEE 754将无穷大定义为NaN是完全合理的。在未定义数学表达式的情况下使用NaN,例如,对于无限时间0。