如何使用标准::signaling_nan

How to use std::signaling_nan?

本文关键字:nan signaling 标准 何使用      更新时间:2023-10-16

在看了另一个关于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的计算结果为 true,因此它在我的系统上实现。

有什么想法吗?

我正在使用ms visual studio .net 2003的C++编译器。我想回家后在另一个上测试它。

谢谢!

可以使用

_control87() 函数启用浮点异常。来自 MSDN 文档 _control87()

注意:

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

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

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

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

来自全聚焦方式(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;
}

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