"isNaN(INFINITY)== false"是假的

Tim*_*ers 1 .net c++ java nan infinity

无穷大不是任何标准数学中的数字,这将导致人们思考表达

Double.isNaN(Double.POSITIVE_INFINITY)
Run Code Online (Sandbox Code Playgroud)

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

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

在实践中,我现在使用的(Double.isNaN(x) || Double.isInfinite(x))方式比我只使用的方式更频繁Double.isNaN(x).因此,最好分别使用Double.isNaN(x)(Double.isNaN(x) && !Double.isInfinite(x))替代.

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

还有哪些其他因素在这里起作用?

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

Joe*_*e Z 9

William Kahan博士在那里有许多作品解释他在IEEE-754决策背后的想法.

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

顺便说一句,在技术意义上,+/ - Inf是仿射扩展实数系统中的数字. 所以,仅仅因为这个原因,我希望isNaN在无限上返回false.