"isNaN(INFINITY)==false"是假的
"isNaN(INFINITY)==false" is false
>无穷大在任何标准数学中都不是数字,这会导致人们认为表达式
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。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 伪造事实↔false
- QueryWorkingSet总是返回false
- 为什么std::isnan 不是 constexpr?
- 如何区分地图中的 0 和 false?
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- Arduino-C++ bool 不会从 false 变为 true
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*
- 当我的 if 条件计算结果为 false 时,我的 else 块将不会执行
- 等于在 c++ 中返回 false
- strcmp 对于相等的字符序列返回 false
- CUDA:重载函数"isnan"的多个实例
- std::is_class 在引用类上为 false
- ios_base::sync_with_stdio(false); cin.tie(NULL);
- C++ - 负数和正数之间的比较返回 false
- 如何使用boost定义布尔类,可能的值应该是TRUE或FALSE?
- 如何编写一个接受如下断言消息的自定义断言函数:assert(false) << "assertio
- protobuf 的 ParseFromString 函数返回 false
- 为什么 std::isnan() 对于具有 NAN 值的双变量返回 false
- "isNaN(INFINITY)==false"是假的