【问题标题】:Multiplication of three numbers in c give a wrong results?c中三个数字的乘法给出错误的结果?
【发布时间】:2014-10-17 15:12:54
【问题描述】:

我无法相信我的程序中发生的事情

double den = 180*3600*10000 ;

在调试a得到这个值-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 ;
}

【问题讨论】:

  • 这不可能,请出示您的完整代码。
  • 显示真实代码。使用所有警告和调试信息编译它 (gcc -Wall -g)
  • 应该是 648000000。我猜那里有一个短或整数溢出。你没有发布真正的代码。
  • @MadScienceDreams 结果不会溢出为 648,000,000
  • 提供的代码溢出,因为原始问题没有。仅供参考,1000

标签: c multiplication


【解决方案1】:

通过问题中的完整代码,我们现在可以看到它是整数溢出。

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

这大于 32 位有符号整数的最大值 2,147,483,648。乘法的结果溢出到-2,109,934,592,然后转换为double。

为了得到正确的结果,在你做乘法之前把其中一个数字加倍:

10000.0 * 180 * 3600

【讨论】:

  • 非常感谢,je ne sais pas comment j ai loupe une erreur futile like that
【解决方案2】:
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 ;

解决问题

【讨论】:

  • 如何避免这种情况?
  • 确保您使用您的诉求类型,您的原始版本是double = int,它会在计算值后进行转换。
  • @user3466199 :使用现代编译器,如果发生这种情况会警告您。
猜你喜欢
  • 2014-01-11
  • 1970-01-01
  • 2019-03-24
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多