我想在我的C++ 14代碼中做一個簡單的操作,pow(-0.89,-0.67)
,並且它給出了一個NaN
作爲結果。在SciLab中做相同的結果是-1.08。在C++中有任何方法來獲得正確的結果嗎?C++ POW(X,Y)X負雙倍和Y負雙倍,給出結果爲012
回答
我猜你在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)
我想到了複雜的,但沒有選擇去爲它,謝謝你這樣做+1。你認爲我應該刪除我的答案,因爲你的很好,我的答案是-1?沒關係,它縮回了。 – gsamaras
謝謝,這就是我需要的。 – user3394626
從pow()的文檔,您有:
如果base爲負,指數是不是一個整數值,或者如果基礎是零和的指數爲負數,將發生定義域錯誤,設置全局變量errno的值爲EDOM。
因此,你得到的nan結果是預期的。
你可以做這樣的:
printf ("-0.89^-0.67 = %f\n", -pow (0.89,-0.67));
這給:
-0.89^-0.67 = -1.081207
鏈接我是基於到:
有趣的問題,+1!
正如一個附註http://www.cplusplus.com/沒有正式附屬於C/C++標準,因此它可能不是最好的地方(即使材料是IMO 99%權利) –
謝謝你的提示。但它更加用戶友好(可能是因爲它更加優雅恕我直言)。我真的很想知道那1%! – gsamaras
它總是好的諮詢標準: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf 它說:
- pow(x,y)返回一個NaN並引發「有效」非法整數y的「無效」浮點異常。
因此,你的C++編譯器是正確的。它應該返回NaN。
- 1. Javascript:打印Y,X倍
- 2. POW(X,Y)
- 3. python x = x + x比y = x + x ?!慢120倍爲什麼?
- 4. 生成隨機正雙倍返回負雙倍值
- 5. Java:在負雙倍和正雙倍的範圍內生成隨機雙數
- 6. 將括號(負數)轉換爲雙倍
- 7. Int64由於雙倍10^x?
- 8. 雙倍和雙倍?互換?
- 9. 如何在java中實現(x pow y),其中x,y是雙重的?
- 10. java負雙正交/負雙倍的力量
- 11. 爲什麼雙倍「==」和「等於」雙倍?
- 12. 在C++中由雙倍變爲長倍不再給出正確結果
- 13. getter返回大的負雙倍值?
- 14. 檢查X是Y的倍數,其中Y可能爲零
- 15. CGPoint的x或y值爲負0
- 16. AchartEngine(隱藏X和Y軸的負面)
- 17. 在雙倍和雙倍差異
- 18. 爲什麼在C++中x [y] == y [x]?
- 19. 繪製雙y軸上時x和y lenghts不同
- 20. pow(X,Y,Z)<=> Z = X^Y加上
- 21. 雙倍乘法給出四捨五入的結果
- 22. 精準雙倍差於雙倍
- 23. 雙倍精度
- 24. 爲什麼graphicsDevice.viewport(x,y,z,w)使用x作爲x和y?
- 25. Numpy,爲什麼`x + = y`產生與`x = x + y`不同的結果?
- 26. 如何將字符串中的負值轉換爲雙倍
- 27. 總結雙倍ReadLine值?
- 28. 如何聲明x和y,使x + = y給出編譯錯誤並且x = x + y不是?
- 29. 爲什麼複製/粘貼將x和y置於負值?
- 30. $('x> y'),$('y','x')和$('x y')之間有什麼區別?
[閱讀您使用的功能的文檔](http://en.cppreference.com/w/cpp/numeric/math/pow)。 –
「正確」的結果將是一個複數,參見[Wolfram](http://www.wolframalpha.com/input/?i=+pow%28-0.89%2C-0.67%29+)。 – uesp