2010-08-18 66 views
0

我看到,下面的代碼產生的結果如下,任何想法爲什麼是這樣的輸出?C的pow()函數按照頭文件<math.h>不能正常工作

#include <stdio.h> 
#include <math.h> 

int main() { 
    int i = 0; 
    for(i = 0; i < 10; i++) { 
     printf("%d\t\t\t%d\t\t\t", i, (int)pow(10, i));  
     printf("%f\n", pow(10, i)); 
    } 
    return 0; 
} 

輸出:

0      1      1.000000 

1      10      10.000000 

2      99      100.000000 

3      1000     1000.000000 

4      9999     10000.000000 

5      100000     100000.000000 

6      1000000     1000000.000000 

7      9999999     10000000.000000 

8      99999999    100000000.000000 

9      999999999    1000000000.000000 
+0

[pow函數的奇怪行爲]的可能重複(http://stackoverflow.com/questions/18155883/strange-behaviour-of-the-pow-function) – 2015-09-06 05:13:15

回答

2

鑄造int,否則結尾數字只會被截斷之前,請使用round()功能。

+0

感謝您的輸入我只是忘了它:) – Sanjay 2010-08-18 07:03:22

2

與其他十億個關於浮點的問題一樣:-),答案是不是所有的數字都可以精確表示。

而且,即使他們可以被表示爲exacly,您可能會得到類似於pow這樣的可能在循環內工作的不良結果。換句話說,無論操作錯誤有多小,如果你做了很多次,錯誤就會變大。

嘗試打印出從pow(10,4)%.50f或其他浮動點確定返回,我會保證你會看到類似9999.9999999237623465而不是10000

對於它的價值,在CygWin下的gcc 3.4.4下生成正確的結果,因此很可能您使用的是不太確切的實現pow

+0

是的,我明白,謝謝 – Sanjay 2010-08-18 07:03:44