后看着另一个问题上所(使用南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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top