gpt4 book ai didi

c++ - ARR[0]/N+ARR[1]/N...+ARR[N-1]/N 或 (ARR[0]+ARR[1]...+ARR[ N-1])/N 加倍?

转载 作者:行者123 更新时间:2023-11-30 04:00:51 26 4
gpt4 key购买 nike

什么是计算一组数字平均值的更准确方法,ARR[0]/N+ARR[1]/N...+ARR[N-1]/N(ARR[0]+ARR[1]...+ARR[N-1])/N? (ARR 是一组数字,N 是该组数字的计数)

假设我有一组数字,每个数字的范围从 0.01.0(它们是双\ float ),并且有数千个甚至数百万个。

我对递归平均等新方法持开放态度(将双胞胎平均放入数组中,然后再次对其进行平均,直到它输出单胞元数组)。

最佳答案

如果接近零的值非常接近于零,则求和中的四舍五入(可能是向上或向下舍入误差)或任何范围内的数字(如果对大量数字求和)都会出现问题。解决此问题的一种方法是使用仅添加具有相同指数的数字的求和函数(直到您调用 getsum() 以获得总和,它使指数尽可能接近)。执行此操作的示例 C++ 类(注意代码是使用 Visual Studio 编译的,在 uint64_t 可用之前编写)。

//  SUM contains an array of 2048 IEEE 754 doubles, indexed by exponent,
// used to minimize rounding / truncation issues when doing
// a large number of summations

class SUM{
double asum[2048];
public:
SUM(){for(int i = 0; i < 2048; i++)asum[i] = 0.;}
void clear(){for(int i = 0; i < 2048; i++)asum[i] = 0.;}
// getsum returns the current sum of the array
double getsum(){double d = 0.; for(int i = 0; i < 2048; i++)d += asum[i];
return(d);}
void addnum(double);
};

void SUM::addnum(double d) // add a number into the array
{
size_t i;

while(1){
// i = exponent of d
i = ((size_t)((*(unsigned long long *)&d)>>52))&0x7ff;
if(i == 0x7ff){ // max exponent, could be overflow
asum[i] += d;
return;
}
if(asum[i] == 0.){ // if empty slot store d
asum[i] = d;
return;
}
d += asum[i]; // else add slot to d, clear slot
asum[i] = 0.; // and continue until empty slot
}
}

使用求和类的示例程序:

#include <iostream>
#include <iomanip>
using namespace std;

static SUM sum;

int main()
{
double dsum = 0.;
double d = 1./5.;
unsigned long i;

for(i = 0; i < 0xffffffffUL; i++){
sum.addnum(d);
dsum += d;
}
cout << "dsum = " << setprecision(16) << dsum << endl;
cout << "sum.getsum() = " << setprecision(16) << sum.getsum() << endl;
cout << "0xffffffff * 1/5 = " << setprecision(16) << d * (double)0xffffffffUL << endl;

return(0);
}

关于c++ - ARR[0]/N+ARR[1]/N...+ARR[N-1]/N 或 (ARR[0]+ARR[1]...+ARR[ N-1])/N 加倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26088099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com