2015-06-19 64 views
1

我想在我的C++ 14代碼中做一個簡單的操作,pow(-0.89,-0.67),並且它給出了一個NaN作爲結果。在SciLab中做相同的結果是-1.08。在C++中有任何方法來獲得正確的結果嗎?C++ POW(X,Y)X負雙倍和Y負雙倍,給出結果爲012

+1

[閱讀您使用的功能的文檔](http://en.cppreference.com/w/cpp/numeric/math/pow)。 –

+4

「正確」的結果將是一個複數,參見[Wolfram](http://www.wolframalpha.com/input/?i=+pow%28-0.89%2C-0.67%29+)。 – uesp

回答

5

我猜你在SciLab中犯了一個錯字。你必須寫下

-0.89^-0.67 

這意味着你做了 - (0.89^-0.67)= - (1.08)。

如果改爲輸入

(-0.89)^-0.67 

你會得到答案-0.5504 - 0.9306i。負數的負根很複雜,C++中的pow函數會給你一個NaN結果。

如果使用std::complex類型,你會得到-0.5504正確答案 - 0.9306i:

#include <iostream> 
#include <complex> 
#include <cmath> 

int main() 
{ 
    std::complex<double> a(-0.89), b(-0.67); 
    std::cout << std::pow(a,b) << std::endl; 
} 

輸出:

(-0.550379,-0.93064) 
+0

我想到了複雜的,但沒有選擇去爲它,謝謝你這樣做+1。你認爲我應該刪除我的答案,因爲你的很好,我的答案是-1?沒關係,它縮回了。 – gsamaras

+0

謝謝,這就是我需要的。 – user3394626

2

pow()的文檔,您有:

如果base爲負,指數是不是一個整數值,或者如果基礎是零和的指數爲負數,將發生定義域錯誤,設置全局變量errno的值爲EDOM。

因此,你得到的nan結果是預期的。


你可以做這樣的:

printf ("-0.89^-0.67 = %f\n", -pow (0.89,-0.67)); 

這給:

-0.89^-0.67 = -1.081207


鏈接我是基於到:

  1. c++ pow function- invalid result?
  2. pow() problem

有趣的問題,+1!

+0

正如一個附註http://www.cplusplus.com/沒有正式附屬於C/C++標準,因此它可能不是最好的地方(即使材料是IMO 99%權利) –

+0

謝謝你的提示。但它更加用戶友好(可能是因爲它更加優雅恕我直言)。我真的很想知道那1%! – gsamaras