【发布时间】:2019-10-31 06:02:58
【问题描述】:
我有这 20 个号码
409,29,657,523,1481,447,904,312,110,1207,55,284,65,232,102,206,218,565,731,34
他们是群众,我需要找到 $m^{3}$ 的平均值。但它给了我错误的答案。当我在某个限制后添加它们时,总和会下降。所以我试图在每个立方体添加为mmmsum = mmmsum +m*m*m;后打印总和@
首先我尝试使用 int 数据类型 (%d) 并观察到总和下降,然后假设这可能是由于范围的限制我尝试了 unsigned int 然后我也遇到了同样的问题,所以我尝试了 unsigned long int 同样的问题,但只有更高的总和,然后我尝试了 unsigned long long,这一次总和比预期的要多,在两次总和后它再次下降
int main()
{
int m[] ={409,29,657,523,1481,447,904,312,110,1207,55,284,65,232,102,206,218,565,731,34};
int mmmsum=0;
for(int i=0;i<20;i++)
{
mmmsum = mmmsum + m[i]*m[i]*m[i];
printf("\n %d",mmmsum);
}
return 0;
}
现在,如果我使用 pow 函数来计算多维数据集和 unsigned long int (%lu) 数据类型,它就会正确。为什么它不适用于 m*m*m
上面显示的代码是我为解码编写的代码:我正在发布一段原始代码,实际上数组 a 在实际问题中并不存在
unsigned long long m_av,mm_av,mmm_av;
........
//======= for M, MM, MMM =============
m_av=0;mm_av=0;mmm_av=0;
cluster = head;
while(cluster)
{
l = cluster->label;
m = L2[l];
m_av = m_av + m;
mm_av = mm_av + m*m;
mmm_av = mmm_av+ pow(m,3);
cluster = cluster->next_L;
}
m_av = m_av/Tnc;
mm_av = mm_av/Tnc;
mmm_av = mmm_av/Tnc;
//===================================
fprintf(fp,"%lu\t%lf\t%d\t%llu\t%llu\t%llu etc.....\n",t_step,E,Tnc,m_av,mm_av,mmm_av,m_max,etc.....);
在一个总共有 100,000 个粒子的模拟中,我得到了如下代码
373926 0.225469 6 25000 48820678 109937352837987 . . .
392623 0.225469 6 25000 48820678 109937352837987 . . .
412254 0.205942 4 37500 194892454 179871291607140 . . .
432867 0.205942 4 37500 194892454 179871291607140 . . .
454510 0.205942 4 37500 194892454 179871291607140 . . .
477235 0.020043 3 50000 6148914690883261936 664306051917360 . .
501097 0.020043 3 50000 6148914690883261936 664306051917360 . .
526152 0.020043 3 50000 6148914690883261936 664306051917360 . .
552459 0.020043 3 50000 6148914690883261936 664306051917360 . .
580082 0.020043 3 50000 6148914690883261936 664306051917360 . .
609087 0.020043 3 50000 6148914690883261936 664306051917360 . .
639541 0.002030 2 75000 702942377 1247147318025000 . . .
671518 0.002030 2 75000 702942377 1247147318025000 . . .
705094 0.002030 2 75000 702942377 1247147318025000 . . .
740348 0.002030 2 75000 702942377 1247147318025000 . . .
我认为这与这个问题有些关系-> C : Printing big numbers
【问题讨论】:
-
您提供的代码中的
m是什么? -
您的 int 变量溢出。查看en.wikipedia.org/wiki/Integer_overflow的解释
-
使用
unsigned long而不是int。格式说明符不是您唯一需要更改的内容。 -
我认为
int a[] = ...应该是int m[] =... -
你为什么首先使用整数(任何大小)来表示像质量这样的物理量?
标签: c