如何使用std::signaling_nan?
-
04-07-2019 - |
题
后看着另一个问题上所(使用南C++)我成为好奇 std::numeric_limits<double>::signaling_NaN()
.
我不能让signaling_NaN扔一个例外。我想也许通过信它真的是一个信号所以我试图抓SIGFPE但没有...
这里是我的代码:
double my_nan = numeric_limits<double>::signaling_NaN();
my_nan++;
my_nan += 5;
my_nan = my_nan / 10;
my_nan = 15 / my_nan;
cout << my_nan << endl;
numeric_limits<double>::has_signaling_NaN
计算结果为真实,因此它是实现在我的系统。
任何想法?
我使用ms visual studio.净2003年的C++编译器。我要测试它对另一当我回家。
谢谢!
解决方案
你可以使用 _control87()
功能,使浮点例外。从MSDN文件 _control87()
:
注:
运行时间图书馆的掩所有浮点例外的默认。
当浮点的例外情况启用,可以使用 signal()
或 SEH(结构性的例外处理) 赶上他们。
其他提示
提醒一句:使用第3方Dll可以悄悄地启用这些例外情况。这尤其是用于装载DLL的语言书写,使他们能通过默认。
我已经发生的两个实例:印刷从一个嵌入式浏览器控制的一个打印机,注册我DLL(设置了一些初步的价值观南)从InnoSetup写的是在特尔斐。
关键在于 numeric_limits<T>::has_signaling_NaN
.这值不会这样对你?(MSDN似乎表明,它总是 false
为MSVC?)
从 利:
cout << "The signaling NaN for type float is: "
<< numeric_limits<float>::signaling_NaN( )
<< endl;
->
令南型浮动是:1.#QNAN
这里的'Q'代表'宁静'.不知道为什么它会返回,但是这就是为什么它不会扔的一个例外。
出于好奇,这是否更好?
const double &real_snan( void )
{
static const long long snan = 0x7ff0000080000001LL;
return *(double*)&snan;
}
不隶属于 StackOverflow