我设置了两个函数,一个用于启用浮点异常,另一个用于禁用异常
在下面的代码中,我已经启用了两次异常(_EM_ZERODIVIDE和_EM_OVERFLOW),之后我需要禁用_EM_ZERODIVIDE并启用_EM_OVERFLOW。
传递给我的函数ResetFloatExeption(....)的参数
请参阅代码了解详情。
#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= %.10e\n",a/b);
int exponent = 50;
d = pow(10.0, exponent);
printf("d = %f\n",d);
}
答案 0 :(得分:2)
old_control & ~_EM_ZERODIVIDE | _EM_OVERFLOW
您的两个功能都是一样的。可能你应该删除一个?
答案 1 :(得分:1)
如果您使用的是C ++,那么拥有一个处理两个基本浮点异常相关操作的类通常会更好。
1)暂时禁用特定例外。 2)暂时启用特定例外。
在这两种情况下,类都可以处理对浮点异常设置的请求更改,然后重置它。您可以在此处找到此类的示例:
http://randomascii.wordpress.com/2012/04/21/exceptional-floating-point/
根据您的需要,您可以按原样使用它们,也可以将构造函数/析构函数实现复制到您的函数中。