【问题标题】:"isNaN(INFINITY)==false" is false"isNaN(INFINITY)==false" 为假
【发布时间】:2014-01-10 11:07:55
【问题描述】:

在任何标准数学中,无穷大都不是一个数字,这会让人们想到表达式

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:请省略对排中律的任何评论。 ;)

【问题讨论】:

  • 为什么标记为C++
  • 但是在某些集合中,无穷大被认为是一个数字,例如en.wikipedia.org/wiki/Extended_real_number_line。此外,在 IEEE 数学中,与 NaN 不同,无穷大至少服从不等式比较(<> 等)。
  • 那么C++有什么不同吗?
  • @PascalCuoq:你是说'“isNaN(INFINITY)==false”是假的'是假的?我认为你错了是错误的。
  • @Manu343726 没错,代码不是 c++,但问题是适用于无数种编程语言(本质上)

标签: java c++ .net nan infinity


【解决方案1】:

博士。威廉·卡汉 (William Kahan) 在IEEE-754.

中有许多文章解释了他对这些决定背后的想法

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

顺便说一句,从技术上讲,+/-Inf 是 affinely extended real number system. 中的数字所以,仅出于这个原因,我希望 isNaN 在无穷大时返回 false。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 在这种情况下,“NaN”的正确名称将是“未定义”或类似名称。
    【解决方案3】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2010-09-12
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多