C++ 浮点:禁用特定异常

C++ 浮点:禁用特定异常,c++,c,floating-point,floating-point-exceptions,C++,C,Floating Point,Floating Point Exceptions,我设置了两个函数,一个用于启用浮点异常,另一个用于禁用异常。 在下面的代码中,我一次启用了两个异常(_EM_ZERODIVIDE和_EM_OVERFLOW),之后我需要禁用just _EM_ZERODIVIDE并启用_EM_OVERFLOW。 传递给我的函数resetflootexeption(..)的参数是什么。 有关详细信息,请参见代码 #include <stdio.h> #include <float.h> #include <mat

我设置了两个函数,一个用于启用浮点异常,另一个用于禁用异常。
在下面的代码中,我一次启用了两个异常(_EM_ZERODIVIDE和_EM_OVERFLOW),之后我需要禁用just _EM_ZERODIVIDE并启用_EM_OVERFLOW。
传递给我的函数resetflootexeption(..)的参数是什么。
有关详细信息,请参见代码

    #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);                   
    }
#包括
#包括
#包括
#布拉格马-芬沃通道(on)
//设置浮动选择
void SetFloatExeption(无符号整数新_控件)
{
_clearfp();
_controlfp_s(0,新的_控件,_MCW_EM);
}
//重设浮点数
void ResetFloatExeption(未签名的int new_控件)
{
_clearfp();
_controlfp_s(0,新的_控件,_MCW_EM);
}
//***************主要****//
真空总管(真空)
{
不带符号的int-old_控件;
双a=1.1;
双b=0.0;
浮动d;
_controlfp_s(旧_控件,0,0);
//启用异常_EM_ZERODIVIDE和_EM_溢出
SetFloatExeption(旧控件&~(_EM_零除| u EM_溢出));
//在这里,如何调用ResetFloatExeption来禁用just EM_ZERODIVIDE并启用EM_OVERFLOW
重置浮动选项(旧控件和);
fprintf(标准值,“a/b=%.10e\n”,a/b);
int指数=50;
d=功率(10.0,指数);
printf(“d=%f\n”,d);
}

两个函数的作用相同。如果你使用C++,那么通常有更好的方法来处理一个处理两个基本的浮点异常相关操作的类。 1) 暂时禁用特定异常。 2) 临时启用特定异常

在这两种情况下,类都可以负责对浮点异常设置进行请求的更改,然后将其重置。您可以在此处找到此类类的示例:


根据您的需要,您可以按原样使用它们,也可以将构造函数/析构函数实现复制到您的函数中。

您的链接似乎是一个很好的教程。但是我使用C++,因为某些原因,我不能使用面向对象。谢谢,我想你可能在用C,但没问题。只需将构造函数和析构函数重命名为C函数——类只是为了方便起见,它们不允许任何不能用常规C完成的事情。是的,lol,我使用两个函数只是为了澄清一下。非常感谢。
old_control & ~_EM_ZERODIVIDE | _EM_OVERFLOW