如果在设置之前使用其值将在初始化后设置的变量,我正在尝试使用signaling_nan() 自动引发异常。
我已经尝试通过 fenv.h 使用浮点异常功能,但是该解决方案需要对 FE_INVALID 进行 if 测试,我想避免这种情况。
我在下面包含了一个简化的示例代码。在代码中,我有一个带有成员 double x 的类 A,我在构造函数中将其初始化为 signalling_nan()。该类还包括一个函数divide_by_x,它将类成员x传入的参数相除。我创建了一个对象 A a1,并调用 a1.divide_by_x(10.0)。我预计程序会引发异常,但它会继续并返回 nan 作为 divide_by_x 函数调用的值。
在示例代码中,我在程序末尾包含了一个针对 FE_INVALID 浮点异常的 if 测试,如果 x 使用 quiet_nan() [Not invalid] 与 signalling_nan() [FE_INVALID] . 这表明signaling_nan()确实产生了一个浮点异常,但是程序继续执行。
#include<iostream>
#include <utility>
#include <limits>
#include <float.h>
#include <signal.h>
#include <fenv.h>
using namespace std;
class A
{
public:
// Constructor
A():x(std::numeric_limits<double>::signaling_NaN()){}
//A():x(std::numeric_limits<double>::quiet_NaN()){}
// Set x
void set_x(double x_value) { x = x_value; }
// Divide number by x
double divide_by_x(double other_number)
{
double result = other_number/x;
return result;
}
// Member
double x;
};
int main(void)
{
feclearexcept(FE_ALL_EXCEPT);
A a1;
double before_setting_x;
before_setting_x = a1.divide_by_x(10.0);
if (fetestexcept(FE_INVALID))
printf("FE_INVALID\n");
else
printf("Not invalid\n");
return 0;
}
用signaling_nan()初始化x的输出:
FE_INVALID
使用 quiet_nan() 初始化 x 的输出:
不无效