浮点:禁用特定的异常
Floating point: Disable specific exception
我设置了两个函数,一个用于启用浮点异常,另一个用于禁用异常。
在下面的代码中,我一次启用了两个异常(_EM_ZERODIVIDE和_EM_OVERFLOW),在我需要禁用_EM_ZERODIVIDE并启用_EM_OVERFLOW之后。什么参数传递给我的函数resetfloatexception(....)。
请参阅代码了解详细信息。
#include <stdio.h>
#include <float.h>
#include <math.h>
#pragma fenv_access (on)
// SetFloatExeption
void SetFloatExeption (unsigned int new_control)
{
_clearfp();
_controlfp_s(0,new_control, _MCW_EM);
}
// ResetFloatExeption
void ResetFloatExeption (unsigned int new_control)
{
_clearfp();
_controlfp_s(0,new_control, _MCW_EM);
}
//*************** main ****//
void main( void )
{
unsigned int old_control;
double a = 1.1;
double b = 0.0;
float d;
_controlfp_s(&old_control,0,0);
// Enable exception _EM_ZERODIVIDE and _EM_OVERFLOW
SetFloatExeption (old_control & ~(_EM_ZERODIVIDE | _EM_OVERFLOW) );
// Here, How to call ResetFloatExeption to disable juste _EM_ZERODIVIDE and let _EM_OVERFLOW enabled
ResetFloatExeption(old_control & ???);
fprintf(stdout,"a/b= %.10en",a/b);
int exponent = 50;
d = pow(10.0, exponent);
printf("d = %fn",d);
}
old_control & ~_EM_ZERODIVIDE | _EM_OVERFLOW
你的两个函数都做同样的事情。也许你应该删掉一个?
如果你正在使用c++,那么最好有一个类来处理两个与浮点异常相关的基本操作。
1)暂时禁用特定异常。2)临时启用特定的异常。
在这两种情况下,类都可以负责对浮点异常设置进行所请求的更改,然后重置它。您可以在这里找到这样的类的示例:
http://randomascii.wordpress.com/2012/04/21/exceptional-floating-point/根据你的需要,你可以按原样使用它们,或者将构造函数/析构函数的实现复制到你的函数中。
相关文章:
- 浮点异常(核心转储)#694457
- 为什么代码段会引发浮点异常?
- Raspberry Pi Zero W 上的 OpenCV - 浮点异常
- 将异常字符串解析为向量上的浮点运算?
- C++Trie中的浮点异常
- 当没有浮点数据类型时,为什么此代码会出现浮点异常
- 浮点 由于除法语句而导致的 c++ 异常
- 如何找出浮点异常的位置
- 我无法捕捉并处理浮点异常
- 为什么trace()抛出浮点底流异常
- 找不到浮点异常
- 浮点异常不可捕获
- 为什么我的代码崩溃了,浮点异常
- 使用用户定义的函数查找完美数时出现浮点异常错误
- 继续在质数C 程序中获得浮点异常
- 获取浮点异常:8
- C ;浮点异常;没有./操作员
- 浮点异常,分割故障和类似的错误
- 大型文件的C 浮点异常
- 检测x86 Linux上的异常浮点操作