2013-10-16 26 views
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; 
+1

使用哪種編譯器? – Dialecticus

+0

我在Visual Studio 2012上沒有出現異常。從文檔'pow()'不應引發異常,請參閱http://msdn.microsoft.com/en-us/library/vstudio/dt5dakze(v=vs .120).aspx –

+0

std :: pow不會拋出afaik。 –

回答

7

的浮點運算處理被抓不拋出std ::例外:它只是返回代表異常特殊值:

在partucular,爲std::pow功能,documetation說:如果基地是0和exp爲小於或等於0時

... 域誤差。 楠在這種情況下 返回...

這並不是說std::domain_error被拋出,但返回NaN表示看過那部異常。

由於沒有製作throw,所以沒有任何內容catch

出於您的目的,請勿使用例外:因爲您知道要處理的輸入類型,只需對其進行預過濾即可。

+0

謝謝。我使用x!= x檢查NaN,並使用x> = DBL_MAX檢查inf。我認爲我的代碼現在是正確的,但是你知道C++如何處理1.0/inf嗎? –

2

數學函數不會拋出異常 - 它們會設置特殊的異常標誌(更多關於Floating-point environment的信息,甚至有example)。

要檢查您的pow函數是否失敗,請檢查返回值是否爲NAN,或者使用其中一個浮動異常函數來執行它(假設您設置正確)。