2016-05-18 5 views
2

電源を構築する方法があります。Javaでの計算でNaNとInfinitiを処理する

public static double raisedToPower(double a, double b) { 
    return Math.pow(a, b); 
} 

評価方法は、NaNとInfinityの値を返すことができます。これは呼び出し時にプログラムを破壊する可能性があります。

私の考えでは、メソッド内で処理する必要があります(結果がInfinityまたはNaNの場合は、メソッドの外側で処理できる戻りキー)。それが質問です。私は何を鍵として返すことができますか、あるいはこのような状況に対処する別の方法がありますか?

public static double raisedToPower(double a, double b) { 
    double res = Math.pow(a, b); 
    if (Double.isNaN(res) || Double.isInfinite(res)) { 
     return key; 
    } 
    return res; 
} 
+0

'' 'key'''は何ですか? –

+0

それは問題です。キーは、このメソッドを呼び出すメソッドが、何かが間違っていることを識別するために使用する値です。 –

+2

とにかく 'key'をテストするなら、なぜ' key'を 'NaN'にできないのですか? – harold

答えて

1

あなたには、いくつかの値がそうでなければ(例えば-1)が返されることはありません、あなたはおそらく何Math.pow()戻って行くと、それが有効だことを確認するDouble.isFinite()でそれをテストする必要があることを確認していない限り。

2

ここには2つの方法があります。

  1. 例外をスローします。 IllegalArgumentExceptionのようなメッセージを「これらのパラメータでは未定義/不可能な結果」のように表示します。
  2. 特定の値を返す。 -1。昔ながらのC言語の方法ですが、数学の操作によく使用されます。
-1

カスタム例外を使用して、それらを引数チェックと組み合わせることもできます。

あなたがそれを必要とその後
public static double raisedToPower(double a, double b) throws NanException, InfinityException { 
    double res = Math.pow(a, b); 
    if(Double.isNaN(res)) 
     throw new NanException(); 

    if(Double.isInfinity(res)) 
     throw new InfinityException(); 

    return res; 
} 

、:

double foo; 
    try { 
     foo = raisedToPower(1.0, 0.0); 
    } 
    catch(InfinityException ie) { 
     //handle IE 
    } 
    catch(NanException ne) { 
     //handle NE 
    } 
+0

コントロールフローの例外を使用していますが、簡単な解決策のように思えますが、if/elseはロジックを処理するためのより良い方法です – OscarRyz