我有一些可能是“空”的双精度浮点数(或单精度浮点数)变量,即它们没有有效值。如何使用内置类型float和double表示这种情况?
一种选择是使用一个包装器,其中包含一个float和一个布尔值,但这不起作用,因为我的库存储的是双精度浮点数而不是像双精度浮点数一样运行的对象。另一种方法是使用NaN(std::numeric_limits)。但我看不到检查变量是否为NaN的方法。
我该如何解决需要“特殊”浮点值来表示其他意义的问题?
我有一些可能是“空”的双精度浮点数(或单精度浮点数)变量,即它们没有有效值。如何使用内置类型float和double表示这种情况?
一种选择是使用一个包装器,其中包含一个float和一个布尔值,但这不起作用,因为我的库存储的是双精度浮点数而不是像双精度浮点数一样运行的对象。另一种方法是使用NaN(std::numeric_limits)。但我看不到检查变量是否为NaN的方法。
我该如何解决需要“特殊”浮点值来表示其他意义的问题?
double d = std::numeric_limits<double>::signaling_NaN();
bool isNaN = (d != d);
NaN值与自身比较相等将返回false。这是测试NaN的方法,但只有当std::numeric_limits<double>::is_iec559
为true时才有效(如果是这样,则符合ieee754标准)。
在C99中,有一个名为isnan
的宏在math.h
中,用于检查浮点数是否为NaN值。
_isnan(double)
函数,您可以通过float.h
导入。isnan(double)
函数,您可以通过math.h
导入。cmath
导入。虽然它不是内置类型,但通常我会使用 boost::optional
来处理这种情况。如果您绝对不能使用它,也许一个指针可以解决问题 -- 如果指针为NULL,则表示结果不包含有效值。
一种选择是使用一个包装器,其中有一个浮点数和一个布尔值,但这不起作用,因为我的库具有存储双精度浮点数而不是像双精度浮点数一样行为的对象的容器。
真遗憾。在C++中,创建一个模板类自动转换为实际的双精度(引用)属性非常简单。(或者任何其他类型的引用。)您只需在模板类中使用强制转换运算符。例如:operator TYPE & () { return value; } 然后,您可以在任何正常使用双精度浮点数的地方使用HasValue<double>。
另一种方法是使用NaN(std::numeric_limits)。但我看不到检查变量是否为NaN的方法。
正如litb和James Schek所指出的那样,C99为我们提供了isnan()。
但要小心! NaN值使数学和逻辑变得非常有趣!您会认为一个数字既不能是NOT>=foo也不能是NOT<=foo。但是对于NaN,它可以。
我在工具箱中保留了一个WARN-IF-NAN(X)宏的原因是我过去曾遇到一些有趣的问题。