如何使用标准::signaling_nan
How to use std::signaling_nan?
在看了另一个关于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
?
- g++的分段错误(在NaN上使用to_string两次时)
- 输出是NaN,如何
- 为什么我在输出端得到 nan?
- 提升反序列化对象具有 nan 或 -nan 值
- Is !NaN not a NaN?
- NaN 上的宇宙飞船操作员
- C++ STL 排序会检查 NaN 吗?
- C++ 每次运行程序时我都会"nan"输出的问题
- 复制 -nan 表示浮点数,AVX __m256 复制后显示 0
- 如何使用 Node-addon-API 实现 node-nan 回调
- 为什么我的双变量通过添加 c++ 显示 nan?
- nan() 函数的参数
- 为什么 acos() 在使用点积的结果时会导致"nan(ind)"?
- 如何在 c++ 中处理 -nan 输出
- 为什么这段代码返回 -nan(ind)?C++
- Pybind11+nan节点模块冲突
- Nan::ObjectWrap to Napi::Object Wrap 无法访问 JavaScript 中的属性
- 第二个 while 循环未运行,将值设置为 "nan"
- 无穷大与 NAN 值
- 调用某个回调函数两次会导致分段错误:Nan