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

2

数学関数は例外をスローしません - 特別な例外フラグを設定します (詳細については、浮動小数点環境で、もあります)。

関数が失敗したかどうかをpow確認するには、戻り値が NAN であるかどうかを確認するか、浮動例外関数のいずれかを使用してそれを実行します (正しく設定されていると仮定します)。

于 2013-10-16T12:08:07.137 に答える