如何使用std :: signaling_nan?

时间:2008-10-25 00:09:17

标签: c++ visual-c++ floating-point nan

在查看关于SO的另一个问题(Using NaN in 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评估为true,因此它在我的系统上实现。

有什么想法吗?

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

谢谢!

4 个答案:

答案 0 :(得分:5)

您可以使用_control87()函数启用浮点异常。来自_control87()上的MSDN文档:

  

注意:

     

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

启用浮点例外后,您可以使用signal()SEH (Structured Exception Handling)来捕获它们。

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

来自TFM

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

- &GT;

  

float类型的信令NaN是:1。#QNAN

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

出于好奇,这会更好吗?

const double &real_snan( void )
{
    static const long long snan = 0x7ff0000080000001LL;
    return *(double*)&snan;
}