7

在查看了关于 SO(在 C++ 中使用 NaN)的另一个问题后,我开始好奇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 .net 2003 的 C++ 编译器。我回家后想在另一个上测试它。

谢谢!

4

4 回答 4

5

您可以使用该_control87()函数来启用浮点异常。从 MSDN 文档中_control87()

笔记:

默认情况下,运行时库会屏蔽所有浮点异常。

启用浮点异常后,您可以使用signal()SEH(结构化异常处理)来捕获它们。

于 2008-10-25T06:45:51.280 回答
5

一个警告:使用第 3 方 DLL 可能会默默启用这些异常。对于加载以默认启用它们的语言编写的 DLL 尤其如此。

我在两种情况下发生过这种情况:从嵌入式浏览器控件打印到 HP 打印机,以及从用 Delphi 编写的 InnoSetup 注册我的 DLL(将一些初始值设置为 NaN)。

于 2008-10-26T02:17:18.503 回答
1

来自TFM

cout << "The signaling NaN for type float is:  "
    << numeric_limits<float>::signaling_NaN( )
    << endl;

->

浮点类型的信号 NaN 是:1.#QNAN

其中“Q”代表“安静”。不知道为什么它会返回它,但这就是它不会为你抛出异常的原因。

出于好奇,这会更好吗?

const double &real_snan( void )
{
    static const long long snan = 0x7ff0000080000001LL;
    return *(double*)&snan;
}
于 2008-10-25T00:18:10.953 回答
1

关键在于numeric_limits<T>::has_signaling_NaN。这对你有什么价值?(MSDN 似乎暗示它总是false适用于 MSVC?)

于 2008-10-25T17:19:05.283 回答