我的异常处理有什么问题?

时间:2013-10-16 11:40:56

标签: c++ exception pow

我正在尝试编写一个自定义函数,可以将任何数字'a'提升到幂'b',而我只对获得答案的真实部分感兴趣。我已经编写了自己的函数来处理,但是当a为负时它仍然会失败。可以告诉我如何解决这个问题吗?

#include <exception>
...
double power(double a, double b) {
    double output;
    try {output = pow(a,b);}
    catch (std::domain_error) { //even if I use catch(...) I still get a NaN.
    if (b==0.0) output = 1.0;
    if (a==0.0) output = 0.0;
    if (b<0.0) {
        b=-1.0*b;
        try {output = 1.0/pow(a,b);}
        catch (std::domain_error){ 
        a = -1.0*a;
        output = -1.0/pow(a,b);
        }}
    else {
        a=-1.0*a;
        output = -1.0*pow(a,b);}
    }
    return output;
}

非常感谢回复。我已阅读回复并提供以下代码。

double power(double a, double b) {
    double output;
    output = pow(a,b);
    if (output != output) {
       if (b==0.0) output = 1.0;
       if (a==0.0) output = 0.0;
          else if (b<0.0) {
           b=-1.0*b;
           output = 1.0/pow(a,b);
           if (output != output) { 
           a = -1.0*a;
           output = -1.0/pow(a,b);
           }}
       else {
        a=-1.0*a;
        output = -1.0*pow(a,b);}
    }
    if (output >= DBL_MAX) output = DBL_MAX;
    if (output <= -DBL_MAX) output =-DBL_MAX;
    if ((output >= -DBL_MIN) && (output <= DBL_MIN)) output = 0.0;
    return output;
}

我唯一剩下的问题是c ++如何处理1.0 / inf?

我希望它会被抓住
if ((output >= -DBL_MIN) && (output <= DBL_MIN)) output = 0.0;

2 个答案:

答案 0 :(得分:7)

浮点算术处理不会抛出std :: exceptions:它只返回表示异常的特殊值:

在论坛中,对于 std::pow 函数,文档说:

  

...   如果base为0且exp小于或等于0,则会发生域错误。   在这种情况下返回NAN   ...

它没有说std::domain_error被抛出,但是返回NAN代表了异常现象。

由于没有throw,因此catch没有任何内容。

出于您的目的,请不要使用例外:因为您知道要处理哪种输入,只需预先过滤它。

答案 1 :(得分:2)

数学函数不会抛出异常 - 它们设置了特殊的异常标志(在Floating-point environment中有更多关于它的信息,甚至有example)。

要检查pow函数是否失败,请检查返回值是否为NAN,或者使用其中一个浮动异常函数来执行此操作(假设您已正确设置)。