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

"isNaN(INFINITY)==false" is false

本文关键字:false isNaN INFINITY      更新时间:2023-10-16

>无穷大在任何标准数学中都不是数字,这会导致人们认为表达式

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:请省略任何关于被排除中间法则的评论;)。

William Kahan博士有很多文章解释了他在IEEE-754决策背后的想法。

  • 涵盖基本原理的讲义:http://www.laputan.org/pub/papers/ieee754.pdf
  • 他的网页上的论文在这里:http://www.cs.berkeley.edu/~wkahan/
  • 如果您对历史感到好奇,请在此处接受采访:http://www.cs.berkeley.edu/~wkahan/ieee754status/754story.html

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

顺便说一句,在非常技术意义上,+/-Inf 是仿射扩展实数系统中的数字。 因此,仅出于这个原因,我就希望isNaN在无穷大上返回false。

你正在寻找isFinite,一个在无穷大和 NaN 上返回false的函数。出于显而易见的原因,按照isNaN的思路调用此函数或其否定会令人困惑(一个好的做法是避免名称中不必要的否定,以便您正在考虑的isnotanumber函数最好命名为 isanumber 。这个函数存在,它被称为isFinite)。

你错了。如果你看一下高等数学,无穷大通常被视为一个数字。例如,在复杂分析中,它通常是 1+0i(根据所选的投影,它可能是一个不同的值)。也就是说,IEEE 754将无穷大定义为NaN是完全明智的。NaN 用于数学表达式未定义的情况,例如无穷大乘以 0。