2009-10-16 111 views
4

這裏是我的意思是試圖做的std ::戰俘給出了分數指數錯誤逼近

double x=1.1402 
double pow=1/3; 
std::pow(x,pow) -1; 

結果是0,但我預計0.4465

公式是(1 + x) ^3= 1.1402,找到x

+2

調試提示:如果您只是檢查傳遞給pow()的參數,顯然pow()沒有錯。你會看到第二個參數的值是零而不是1/3,表明pow()運行正常,問題在於你的代碼。 – 2009-10-16 21:13:04

+1

好吧,我已經解決了它..愚蠢的整數 – vehomzzz 2009-10-16 21:13:39

+5

每個人都犯了這個錯誤。 – mob 2009-10-16 21:18:57

回答

8

1/3完成的整數運算,所以你到 '戰俘' 分配0。嘗試pow(x, 1.0/3.0);

18

1/3是0.這是整數除法。

嘗試:

double pow = 1.0/3.0; 

爲:

#include <iostream> 
#include <cmath> 

int main(void) 
{ 
double x = 1.1402; 
double pow = 1.0/3.0; 
std::cout << std::pow(x, pow) - 1; 

} 
+2

嗯,好的... \ *聳肩\ * – GManNickG 2009-10-16 21:23:42

+0

有時最簡單的答案是勝利,有時候是最完整的。 StackOverflow也是隨機選擇答案的順序,所以有時會出現頂級勝利。平局運氣。 – 2009-10-19 21:09:31

+0

他已經接受了我的回答,並且後來改變爲那個。我沒有抱怨,13張票已經夠用了,儘管當時我已經吃飽了,而且接受是我唯一獲得代表的方法。雖然沒有問題:) – GManNickG 2009-10-19 21:15:56

0

的1/3整數除法,整數除法的結果爲0。

4

許多人指出,1/3 = 0,但沒有解釋爲什麼會這樣。

C和C++將根據操作數的類型執行操作。由於兩個操作數都是整數,因此它會執行整數除法來創建整數結果。當強制將該整數結果賦值給雙變量時,它會將整數0轉換爲雙精度值0.0。

沒有必要使兩個操作數加倍,如果其中任何一個是雙倍,則編譯器會在執行操作之前將另一個轉換爲雙倍。 1.0/3或1/3.0將返回您預期的結果,1.0/3.0也會返回。