该函数的目的是什么?
bool whatIsIt(double n)
{
return n == n;
}
它可以用来检查n中的每一位吗?
我对此表示怀疑。
欢迎提出任何评论。
该函数的目的是什么?
bool whatIsIt(double n)
{
return n == n;
}
它可以用来检查n中的每一位吗?
我对此表示怀疑。
欢迎提出任何评论。
这种方法可能会过于琐碎且不完全可靠,但可以用来检查 n 是否为 NaN(非数字),因为 NaN 与其本身不相等。
在 C99 和 C++11 中,有一个名为 isnan()
的函数,这是更可靠的方法。(参见 Billy 的各种评论)
isnan()
(可能是C++11继承它的)。 - caf如果定义了... 如果
x
是NaN
,则语句x != x
为真... 如果
x
是NaN
,则语句x == x
为假
__STDC_IEC_559__
,那么当n
为NaN
时,此函数将返回假。它可能是用来检测NaN(不等于任何东西,甚至不等于它们自己)的存在 - 虽然这取决于您特定的编译器/平台/设置等。 严格来说,标准没有规定浮点数运算如何处理。
NaN
,前提是实现中定义了__STDC_IEC_559__
。 - MSN__STDC_IEC_559__
。(当然,如果问题被标记为“C”或“C99”,那就不同了....) - Billy ONeal该函数检查一个数字是否可比较。
这对于作为排序函数的键或用于搜索的值非常重要。在排序中使用的比较器期望如果 A < B 为真,则 B < A 将为假。如果 A 或 B 是不可比较的值,则这些语句都将为假。
从技术上讲,排序所需的是称为严格弱序的东西。
集合中具有不可比较值的元素无法找到。包含不可比较值的列表是不可排序的。此外,优化实现可能会走出正在排序的数组并开始破坏内存,或者可能永远不会终止。
我知道的唯一不可比较的双精度浮点数值是 NaN。正如其他人指出的那样,如果将 NaN 用作 whatIsIt()
的参数,则会返回 false。如果 NaN 是您要比较的数字的可能值,则必须处理它,否则可能会发生糟糕的事情。
这篇维基百科文章提到了 std::map 和 NaN 的问题。
您可以构造一个比较函数来将NaN排序到列表中的特定位置,但您不能仅使用内置运算符进行操作。相反,您可以执行以下操作:
if ( A < B ) then return -1;
else if ( B < A ) then return 1;
else return whatIsIt(A) - whatIsIt(B);
顺便提一下,在SQL中,NULL也不能在兼容的实现中进行比较。
这其中的谜团是为什么没有使用isnan(),除非这是一个面试问题或其他什么事情。