在C+中检查平均值计算中的双精度溢出+; < >我必须在C++中实现标准偏差和方差。< /P> #include <iostream> #include <string> #include <math.h> class StdDeviation { private: int max; double value[100]; double mean; public: double CalculateMean() { double sum = 0; for(int i = 0; i < max; i++) sum += value[i]; // Question 1. at bottom. return (sum / max); } double CalculateVariane() { mean = CalculateMean(); double temp = 0; for(int i = 0; i < max; i++) { temp += (value[i] - mean) * (value[i] - mean) ; } return temp / max; } double CalculateSampleVariane() { mean = CalculateMean(); double temp = 0; for(int i = 0; i < max; i++) { temp += (value[i] - mean) * (value[i] - mean) ; } return temp / (max - 1); } int SetValues(double *p, int count) { if(count > 100) return -1; max = count; for(int i = 0; i < count; i++) value[i] = p[i]; return 0; } double GetStandardDeviation() { return sqrt(CalculateVariane()); } double GetSampleStandardDeviation() { return sqrt(CalculateSampleVariane()); } }; #包括 #包括 #包括 类标准差 { 私人: int max; 双值[100]; 双均值; 公众: 双重计算 { 双和=0; 对于(int i=0;i
以下是我的问题:在C+中检查平均值计算中的双精度溢出+; < >我必须在C++中实现标准偏差和方差。< /P> #include <iostream> #include <string> #include <math.h> class StdDeviation { private: int max; double value[100]; double mean; public: double CalculateMean() { double sum = 0; for(int i = 0; i < max; i++) sum += value[i]; // Question 1. at bottom. return (sum / max); } double CalculateVariane() { mean = CalculateMean(); double temp = 0; for(int i = 0; i < max; i++) { temp += (value[i] - mean) * (value[i] - mean) ; } return temp / max; } double CalculateSampleVariane() { mean = CalculateMean(); double temp = 0; for(int i = 0; i < max; i++) { temp += (value[i] - mean) * (value[i] - mean) ; } return temp / (max - 1); } int SetValues(double *p, int count) { if(count > 100) return -1; max = count; for(int i = 0; i < count; i++) value[i] = p[i]; return 0; } double GetStandardDeviation() { return sqrt(CalculateVariane()); } double GetSampleStandardDeviation() { return sqrt(CalculateSampleVariane()); } }; #包括 #包括 #包括 类标准差 { 私人: int max; 双值[100]; 双均值; 公众: 双重计算 { 双和=0; 对于(int i=0;i,c++,C++,以下是我的问题: 如何确保double的值不会溢出并返回到 零 我如何检查我没有超过总和的最大值,即。, 双倍最大值 在c++11中 double CalculateMean() { double sum = 0; for(int i = 0; i < max; i++) { sum += value[i]; if(isinf(sum)) { //handle error
double CalculateMean()
{
double sum = 0;
for(int i = 0; i < max; i++)
{
sum += value[i];
if(isinf(sum))
{
//handle error
}
}
return (sum / max);
}
double CalculateMean()
{
双和=0;
对于(int i=0;i
见:
但是,如果迭代计算前缀的平均值,则可以完全避免问题(对于平均值计算):
double CalculateMean()
{
double mean = 0;
for(int i = 0; i < max; i++)
{
mean *= ((double)i/(double)(i+1));
mean += value[i]/(i+1);
}
return mean;
}
double CalculateMean()
{
双平均值=0;
对于(int i=0;i
现在,如果值中有一个infinte值,那么mean只能等于无穷大,以开头,您确定溢出是一个问题吗?双精度最大值为1.7*10308。您正在求平方和,但如果您的值不超过~10150,则即使如此,您仍然是安全的。你真的有这样的价值观吗 更严重的问题是舍入错误
double
保留约17位有效数字(精确地说是52位有效二进制数字)。如果添加指数不同的数字,则较小数字的下半部分仅影响超出结果精度的数字。极端情况下,1E20+1==1E20
,因为要表示为不同的数字,需要20个有效数字,而您没有这些数字。当您可能有很多小数字而很少有大数字时,建议先添加小数字。double avg=0;
double avg = 0;
for (int i = 0; i < max; ++i)
avg += value[i] / max;
对于(int i=0;i
请重新格式化您的代码好吗?@leppie:“平均”和“平均”是一样的。然而,有问题的代码接着计算方差和标准差,这涉及到平方根和,这不能同样简化,因为它的平方和有更高的量级。@Eladian感谢您的帮助。你们能不能告诉我,在第二个函数中,溢出只能发生在两个值之间。我无法遵循这里给出的算法。你能用简单的例子解释一下吗。Thanks@Jan当前位置当你抢先一步时,我正要改正自己。我习惯于表示几何平均:)@venkysmarty:Simple。所提出的第二种算法,正如Jan所指出的,是一种我们只能用于平均值计算而不能用于其他算法的方法,迭代地计算前缀的平均值。也就是说,在第i次迭代中,我们得到了元素1…i的平均值。这是因为平均值(v[1],…,v[i])平均值(v[1],…,v[i-1])*(i-1)/i+v[i]/i。这正是我的第二种方法现在所做的,因为它意味着(v)