该功能的目的是什么?
bool whatIsIt(double n)
{
return n == n;
}
它可以用来检查n中的每一位?
我对此表示怀疑。
任何评论都表示赞赏。
答案 0 :(得分:11)
它可用于检查n是否为NaN(不是数字),因为NaN与自身的比较不等。
可能是一种笨拙且不完全可靠的方法。 (参见比利的各种评论)C99和C ++ 11具有isnan()
功能。
答案 1 :(得分:4)
这在附录F的C标准中规定:60559浮点运算,特别是F.8.3关系运算符:
...如果
,则x != x
是x
NaN
声明为真...如果
,则x == x
是x
NaN
语句为false
如果__STDC_IEC_559__
为#defined
,则如果n
为NaN
,则此函数将返回false。
答案 2 :(得分:2)
可能存在检测NaN(它们永远不会等于任何东西,甚至彼此) - 尽管这将取决于您的特定编译器/平台/设置/等。严格来说,标准没有说明如何处理浮点数学。
答案 3 :(得分:0)
不,这不是“检查位”。
我猜它正在检查“NaN”。如果输入是NaN,它将返回FALSE,如果是任何其他浮点值,则返回TRUE。
答案 4 :(得分:0)
该功能检查数字是否具有可比性。
这对于用作排序函数的键或在搜索中使用的值非常重要。排序中使用的比较期望如果A&lt; B是真的,那么B < A将是假的。如果A或B是不可比较的值,那么这两个陈述都是错误的。
从技术上讲,需要的是strict weak ordering。
无法找到具有无法比较值的集合中的元素。包含不可比较值的列表是不可分类的。此外,优化的实现可能会走出正在排序的数组并开始破坏内存或者可能永远不会终止。
我知道双重的唯一不可比较的值是NaN。正如其他人所指出的那样,如果用作whatIsIt()
的参数,NaN将返回false。如果NaN是您比较的数字的可能值,那么您必须处理它,否则可能会发生不好的事情。
this维基百科文章中提到了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()的原因。