我有双(或浮动),如保持没有有效的值的变量可以是“空”,。我怎么能代表这个条件内置的类型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)宏我的工具箱。我已经在过去出现了一些有趣的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top