未初始化的浮点数(C++)

tru*_*ru7 4 c++ initialization

如果要初始化具有"未初始化"状态的浮点数,您会选择什么值?(值很容易测试,最不可能与实际值混淆)

float min = -999999.;

可能有问题可能要么与实际值混淆,要么甚至因为模糊的浮动舍入而被测试(它看起来很幼稚:-)

jua*_*nza 12

如果要避免使用有效值float,可以使用NAN:

#include <limits>

....
float min = std::numeric_limits<float>::quiet_NaN();
Run Code Online (Sandbox Code Playgroud)

然后你可以std::isnan用来检查:

#include <cmath>

....
bool not_cool = std::isnan(min);
Run Code Online (Sandbox Code Playgroud)

  • @Juan要非常小心比较可能是NaN的值.因此,即使myVal设置为std :: numeric_limits <float> :: quiet_NaN(),运行if(myVal == std :: numeric_limits <float> :: quiet_NaN())也将始终为false.你需要一个等同的isnan.[编辑:见http://ideone.com/hzFCyB] (2认同)

Rah*_*thi 5

你可以使用NAN.然而

问题是使用未初始化的浮点变量.与整数不同,并非所有位模式都可用作浮点值.存在一类称为信令NaN或简称SNaN的值,它们是特殊的"非数字"值.如果您询问处理器,它将密切注意这些信令NaN并在遇到一个时引发"无效操作数"异常.(毕竟,这就是它被称为信号NaN的全部原因.)

另外我建议你使用 Boost.Optional像这样:

boost::optional<float> minValue;  // initially unset
Run Code Online (Sandbox Code Playgroud)

  • 对于这样的"问题",Boost.Optional也是我的选择,尤其是很快就会出现`std :: optional <T> (2认同)