等于运算符“==”可以用于检查位吗?

4

该函数的目的是什么?

 bool whatIsIt(double n)
 {
    return n == n;
 }

它可以用来检查n中的每一位吗?

我对此表示怀疑。

欢迎提出任何评论。


严格来说,标准没有规定。这取决于您的平台上浮点数运算的操作方式。 - Billy ONeal
2
我本来会说它检查了n是否为数字而不是NaN,例如。 - Tony Lee
1
@paulsm4:一般来说是对的,但浮点类型是“特殊”的,所以在这种情况下不是真的。 - ildjarn
@ildjarn:浮点类型可能是特殊的。它们也可能不是。 - Billy ONeal
3
@Billy:这个事实本身就让它们一直很特别,不是吗? ;-] Translated: 这个事实本身就使它们一直很特别,是吧?;-] - ildjarn
显示剩余5条评论
5个回答

11

这种方法可能会过于琐碎且不完全可靠,但可以用来检查 n 是否为 NaN(非数字),因为 NaN 与其本身不相等。

在 C99 和 C++11 中,有一个名为 isnan() 的函数,这是更可靠的方法。(参见 Billy 的各种评论)


1
+1 -- 强调“可能”-- 我们不确定。这取决于架构/平台/设置/编译器等。 - Billy ONeal
1
C99也有isnan()(可能是C++11继承它的)。 - caf

4
这在C标准的附录F: 60559浮点算术中有明确规定,特别是在F.8.3关系运算符中:

... 如果 xNaN,则语句 x != x 为真

... 如果 xNaN,则语句 x == x 为假

如果定义了__STDC_IEC_559__,那么当nNaN时,此函数将返回假。

1
+1 -- 无论如何都支持C99。至少我能够获取到TC3草案。 - Billy ONeal

2

它可能是用来检测NaN(不等于任何东西,甚至不等于它们自己)的存在 - 虽然这取决于您特定的编译器/平台/设置等。 严格来说,标准没有规定浮点数运算如何处理。


1
但是C确实指定了如何处理关系上的NaN,前提是实现中定义了__STDC_IEC_559__ - MSN
@MSN:这只是C99。问题中提到的是C和C ++,通常意味着“C ++和C子集”——两者都没有指定任何类型的__STDC_IEC_559__。(当然,如果问题被标记为“C”或“C99”,那就不同了....) - Billy ONeal
@MSN:话说,公平地讲,我还没有能够得到C++11标准的副本,因为ANSI还没有行动起来,而且我不想为一份ANSI售价18美元的标准支付300美元...(而且,如果常量未定义,那么任何事情都是公平的) - Billy ONeal

0

该函数检查一个数字是否可比较。

这对于作为排序函数的键或用于搜索的值非常重要。在排序中使用的比较器期望如果 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(),除非这是一个面试问题或其他什么事情。


0
不,它不是在“检查位”。 我猜它是在检查“NaN”。如果输入为 NaN,则返回 FALSE,并在任何其他浮点值上返回 TRUE。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接