1

我设置了两个函数,一个启用浮点异常,一个禁用异常。
在下面的代码中,我一次性启用了两个异常(_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);                   
    }
4

2 回答 2

2
old_control & ~_EM_ZERODIVIDE | _EM_OVERFLOW

你的两个函数都做同样的事情。也许你应该删除一个?

于 2014-03-28T15:53:09.517 回答
1

如果您使用的是 C++,那么拥有一个处理两个基本浮点异常相关操作的类通常会更好。

1) 暂时禁用特定异常。2) 临时启用特定例外。

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

http://randomascii.wordpress.com/2012/04/21/exceptional-floating-point/

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

于 2014-03-31T05:32:53.390 回答