【发布时间】:2011-03-27 02:39:01
【问题描述】:
是否可以检查号码是否为NaN?
【问题讨论】:
-
NIL(C-ese 中为 NULL)是一个特殊的 pointer 值。数字没有 NULL 之类的东西。您是否正在考虑浮点 NaN?
-
我的意思是 NaN,我的错,修复了 Q。
是否可以检查号码是否为NaN?
【问题讨论】:
您正在寻找null,但这仅对指针有用。数字本身不能为空,它要么具有您放入其中的已知值,要么具有之前内存中的随机数据。
【讨论】:
是的,因为NaN 不等于任何其他数字,包括它自己。
当您考虑 NaN 的含义时,这是有道理的,即您创建了一个实际上无法用“正常”浮点值表示的值。
因此,如果您创建两个不知道它们是什么的数字,则很难认为它们相等。它们可能是,但是,考虑到它可能是相当大的数字可能性(实际上是无限的),两个相同数字的可能性微乎其微:-)
您可以查找一个函数(实际上是宏),例如 isnan(在 C 的 math.h 和 C++ 的 cmath 中),或者只使用 NaN 值不等于自身的属性。喜欢:
if (myFloat != myFloat) { ... }
如果由于某种奇怪的原因,您的 C 实现没有 isnan(它应该,因为标准要求它),您可以编写自己的代码,例如:
int isnan_float (float f) { return (f != f); }
【讨论】:
myFloat != myFloat 包装成某种带有注释的isnan 函数,以免将来不了解它的读者非常困惑。
Linux/gcc下有isnan(double),符合BSD4.3。
C99 提供 fpclassify(x) 和 isnan(x)。
(但 C++ 标准/编译器不一定包含 C99 功能。)
std::numeric_limit 应该有某种方法...正在检查...
哦。我应该知道...这个问题之前已经回答过... Checking if a double (or float) is NaN in C++ Using NaN in C++? http://bytes.com/topic/c/answers/588254-how-check-double-inf-nan
【讨论】: