2014-10-17 156 views
-8

我不能相信了在我的計劃c中三個數的相乘給出了錯誤的結果?

double den = 180*3600*1000 ; 

發生在調試得到這個值-2109934592.0000000

任何幫助,請???

你可以試試這個簡單的代碼

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

int main (int argc , char *argv) 
{ 
double denominator = 10000*180*3600 ; 

printf("%f \n", denominator) ; 
return 0 ; 
} 
+5

那是不可能的,顯示整個代碼請。 – simonzack 2014-10-17 15:14:48

+0

顯示真實的代碼。使用所有警告和調試信息編譯('gcc -Wall -g') – 2014-10-17 15:15:00

+0

請檢查您的電話號碼。我大概100%肯定這些不是正確的數字。 – gnasher729 2014-10-17 15:15:35

回答

3

隨着問題的完整代碼,我們現在可以看到它是一個整數溢出。

10000 * 180 * 3600 = 6,480,000,000. 

這大於2,147,483,648,它是32位帶符號整數的最大值。乘法結果溢出至-2,109,934,592,然後轉換爲double。

爲了得到正確的結果讓數字雙重之一,你在做乘法之前:

10000.0 * 180 * 3600 
+0

非常感謝,請耐心等待, – user3466199 2014-10-17 15:35:43

1
test.c: In function ‘main’: 
test.c:6:37: warning: integer overflow in expression [-Woverflow] 
     double denominator = 10000*180*3600 ; 
            ^

是錯誤,當我編譯。你溢出整數並鑄造成雙。

double denominator = 10000.0*180.0*3600.0 ; 

修復該問題

+0

如何避免這種情況? – user3466199 2014-10-17 15:22:55

+0

請確保您使用了您所控制的類型,您的原始版本是'double = int',在計算該值後進行轉換。 – exussum 2014-10-17 15:26:05

+0

@ user3466199:通過使用現代編譯器在發生這種情況時發出警告。 – 2014-10-17 15:26:34