计算数组c++的平均值
calculating the mean of an array c++
当我试图用两种方法计算数组的平均值时,遇到了一个问题。以下是代码:
float sum1, sum2, tmp, mean1, mean2;
double sum1_double, sum2_double, tmp_double;
int i, j;
int Nt=29040000; //array size
int piecesize=32;
int Npiece=Nt/piecesize;
float* img;
float* d_img;
double* img_double;
img_double = (double*)calloc(Nt, sizeof(double));
cudaHostAlloc((void**)&img, sizeof(float)*Nt, cudaHostAllocDefault);
cudaMalloc((void**)&d_img, sizeof(float)*Nt);
...
//Some calculation is done in GPU and the results are stored in d_img;
...
cudaMemcpy(img, d_img, Nt*sizeof(float), cudaMemcpyDeviceToHost);
for (i=0;i<Nt;i++) img_double[i]=(double)img[i];
//Method 1
sum1=0;
for (i=0;i<Nt;i++)
{ sum1 += img[i]; }
sum1_double=0;
for (i=0;i<Nt;i++)
{ sum1_double += img_double[i]; }
//Method 2
sum2=0;
for (i=0;i<Npiece;i++)
{ tmp=0;
for (j=0;j<piecesize;j++)
{ tmp += img[i*piecesize+j];}
sum2 += tmp;
}
sum2_double=0;
for (i=0;i<Npiece;i++)
{ tmp_double=0;
for (j=0;j<piecesize;j++)
{ tmp_double += img_double[i*piecesize+j];}
sum2_double += tmp_double;
}
mean1=sum1/(float)Nt;
mean2=sum2/(float)Nt;
mean1_double=sum1_double/(double)Nt;
mean2_double=sum2_double/(double)Nt;
cout<<setprecision(15)<<mean1<<endl;
cout<<setprecision(15)<<mean2<<endl;
cout<<setprecision(15)<<mean1_double<<endl;
cout<<setprecision(15)<<mean2_double<<endl;
输出:
132.221862792969 129.565872192383 129.565938340543 129.565938340543
两种方法得到的结果,mean1=129.6,mean2=132.2,有显著差异。我可以知道为什么吗?
提前感谢!
原因是浮点运算不精确。当你累加整数时,当abs(值(大于224时,float就变得不精确了(我假设这里是IEEE-754 32位(。例如,float无法精确存储16777217(根据舍入模式,它将变为16777216或16777218(。
假设您的第二次计算是更精确的计算,因为由于单独的tmp
累积,损失的精度较小。
将sum1
、sum2
、tmp
变量更改为long long int
,希望两种计算都能得到相同的结果。
注意:我假设您的img
存储整数数据。如果它存储浮动,那么没有简单的方法可以完美地解决这个问题。一种方法是对sum1
、sum2
和tmp
使用double
而不是float
。差异会存在,但会小得多。还有一些技术可以比简单的求和更精确地计算CCD_ 12。就像卡汉总结。
相关文章:
- 计算数组c++的平均值
- 计算平均值,不包括上次得分
- 彩色图像的卤化物处理平均值
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 按平均值替换数组中的元素
- 如何返回多个矢量对象的平均值?C++
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 制作具有平均值的随机数生成器
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 如何使用对象制作分数列表并获得平均值
- 浮点格式数组的平均值
- 在二叉搜索树C++中计算平均值
- C 复合赋值运算符 ^= 平均值
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- 我可以计算多线程数的平均值吗?
- 计算另一个图像像素满足条件的像素值的平均值
- 做一个unordered_multimap键的平均值是更好的方法吗?
- 使用数学地板找到平均值
- 从文件中读取成绩并将平均值输出到另一个文件C++