题
我有双(或浮动),如保持没有有效的值的变量可以是“空”,。我怎么能代表这个条件内置的类型float和double?
一个选项将是具有浮子和一个布尔值,但不可阻挡的工作,因为我的库具有存储双打和不是表现为双打对象容器的包装。另一个办法是使用的NaN(的std :: numeric_limits)。但我看到没有办法检查变量是否为NaN。
如何解决需要一个“特殊”的浮点值意味着比其他一些东西的问题?
解决方案
在Visual C ++,有一个非标准 _isnan(double)
功能可以通过导入float.h
在C,有一个 isnan(double)
功能您可以通过导入math.h
在C ++中,有可以通过cmath
导入isnan(双)功能
正如其他人所指出的那样,使用NaN的可不少麻烦。他们是具有与类似NULL指针来处理的特殊情况。不同的是,为NaN不会通常会导致核心转储和应用程序故障,但是他们是非常难以追查。如果你决定使用NaN的,使用它们尽可能少。 NaN的过度使用是进攻编码实践。
其他提示
我们已经做了,通过使用楠:
double d = std::numeric_limits<double>::signaling_NaN();
bool isNaN = (d != d);
NaN值相比,针对其自身平等将产生错误的。这就是你测试NaN的方式,但是这似乎是只有std::numeric_limits<double>::is_iec559
是真实有效的(如果是的话,它符合IEEE754太)。
在C99有一个名为在isnan
math.h
此宏,它检查NaN值浮点数太
这不是一个内置的类型,但我通常使用boost::optional
对于这种事情。如果你绝对不能用,也许指针会做的伎俩 - 如果指针为NULL,那么你就知道结果不包含有效的值
一种选择是,有一个浮动广告的布尔的包装,但不可阻挡的工作,因为我的库具有存储表现为双打双打,而不是对象的容器。的强>
这是一个耻辱。在C ++中是微不足道的创建模板类,自动转换为实际的双(参考)属性。 (或任何其他类型的与此有关的一个参考。)你只需要使用转换运算符的模板类。例如: - 操作员TYPE&(){返回值; }然后,您可以使用的HasValue
<强> 另一个将被使用的NaN(的std :: numeric_limits)。但我看到没有办法检查变量是否为NaN。 强>
作为 litb 和詹姆斯Schek 还表示,C99为我们提供了isnan()。
但要注意与!南值使数学和逻辑真有趣!你可能会认为一些不能均未> = foo和NOT <= foo中。但与NaN时,就可以了。
还有一个原因,我保持WARN-IF-NAN(X)宏我的工具箱。我已经在过去出现了一些有趣的问题。