首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用std::signaling_nan?

如何使用std::signaling_nan?
EN

Stack Overflow用户
提问于 2008-10-25 00:09:17
回答 4查看 3.9K关注 0票数 7

在看了SO (Using NaN in C++)上的另一个问题后,我对std::numeric_limits<double>::signaling_NaN()产生了好奇。

我无法让signaling_NaN抛出异常。我想可能是信号,所以我试着捕捉SIGFPE,但没有。

下面是我的代码:

代码语言:javascript
复制
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++编译器。我想在回家后在另一台上测试它。

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-10-25 06:45:51

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

备注:

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

当启用浮点异常时,您可以使用signal()SEH (Structured Exception Handling)来捕获它们。

票数 5
EN

Stack Overflow用户

发布于 2008-10-26 02:17:19

一句警告:使用第三方DLL可能会默默地启用这些异常。对于加载以默认情况下启用它们的语言编写的DLL,这一点尤其正确。

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

票数 5
EN

Stack Overflow用户

发布于 2008-10-25 00:18:11

来自TFM

代码语言:javascript
复制
cout << "The signaling NaN for type float is:  "
    << numeric_limits<float>::signaling_NaN( )
    << endl;

->

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

其中“q”代表“安静”。不知道为什么它会返回那个,但这就是为什么它不会为你抛出一个异常。

出于好奇心,这样做效果会更好吗?

代码语言:javascript
复制
const double &real_snan( void )
{
    static const long long snan = 0x7ff0000080000001LL;
    return *(double*)&snan;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/235664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档