1

我正在尝试编写一个自定义函数,该函数可以将任何数字 '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;
4

2 回答 2

7

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

特别是,对于std::pow函数,文档说:

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

并不是说std::domain_error抛出,而是返回 NAN 以表示异常。

既然没有throw,就没有什么可做的catch

出于您的目的,不要使用异常:因为您知道要处理什么样的输入,只需对其进行预过滤。

于 2013-10-16T11:58:20.550 回答
2

数学函数不会抛出异常——它们设置特殊的异常标志(更多关于它的浮点环境,甚至还有例子)。

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

于 2013-10-16T12:08:07.137 回答