我有双(或浮点)变量,可能是"空",如没有有效值.如何使用内置类型float和double来表示这种情况?
一个选项是一个包含浮点数和布尔值的包装器,但这不起作用,因为我的库有容器存储双精度而不是表现为双精度的对象.另一个是使用NaN(std :: numeric_limits).但我认为无法检查变量是否为NaN.
如何解决需要"特殊"浮点值来表示数字以外的其他问题?
我们通过使用NaN做到了这一点:
double d = std::numeric_limits::signaling_NaN(); bool isNaN = (d != d);
与自身相等的NaN值将产生错误.这是你测试NaN的方式,但是如果std::numeric_limits
是真的那么它似乎才有效(如果是的话,它也符合ieee754).
在C99中有一个称为isnan
此的宏math.h
,它也检查NaN值的浮点数.
在Visual C++中,有一个_isnan(double)
可以导入的非标准函数float.h
.
在C中,有一个isnan(double)
可以导入的功能math.h
.
在C++中,有一个可以导入的isnan(double)函数cmath
.
正如其他人所指出的那样,使用NaN可能会带来很多麻烦.它们是一种特殊情况,必须像NULL指针一样处理.不同之处在于NaN通常不会导致核心转储和应用程序故障,但它们很难追踪.如果您决定使用NaN,请尽可能少地使用它们.过度使用NaN是一种冒犯性的编码习惯.