Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在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++ - Fatal编程技术网

在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的值不会溢出并返回到 零
  • 我如何检查我没有超过总和的最大值,即。, 双倍最大值
  • 在c++11中

    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)