2014-10-17 172 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