计算平均精度



我正在计算有效数字的个数,两个数字有相同的。然而,我所写的函数,将返回一个大的值,当数字相等。因此,平均结果不够具有代表性,如下所示。

代码如下:

#include <iostream>
#include <cmath>
double calc_error(double a,double x) {
  return std::abs(x-a)/std::abs(a);
}
int significant(double err) {
    int s = -1;
    do {
        ++s;
    } while(err < pow(5, -s));
    return s;
}
int main(void) {
  double sans[]={-250207683.634793,-1353198687.861288,2816966067.598196,-144344843844.616425, 323890119928.788757};
  double pans[]={-250207683.634692, -1353198687.861386, 2816966067.598891, -144344843844.617096, 323890119928.788757};
  double err[5];
  double avg_err = 0;
  int avg_significant = 0;
  std::cout<<"Serial Answer,Distributed Answer, Error, Significant digits"<<std::endl;
  for (int it=0; it<5; it++) {
    err[it]=calc_error(sans[it], pans[it]);
    avg_err += err[it];
    avg_significant += significant(err[it]);
    std::cout<<sans[it]<<","<<pans[it]<<","<<err[it]<<","<<significant(err[it])<<"n";
  }
  std::cout << "avg_error: " << avg_err/5 << ", avg_sign:" << avg_significant/5 << "n";
}

并检查输出:

Serial Answer,Distributed Answer, Error, Significant digits
-2.50208e+08,-2.50208e+08,4.03665e-13,18
-1.3532e+09,-1.3532e+09,7.24136e-14,19
2.81697e+09,2.81697e+09,2.46631e-13,19
-1.44345e+11,-1.44345e+11,4.65127e-15,21
3.2389e+11,3.2389e+11,0,463
avg_error: 1.45472e-13, avg_sign:108

在我的实际应用中,我有很多数字,因此我应该提供一些有代表性的东西。你会怎么做?在写这篇文章的时候,我想到了一个想法,那就是计算一下有多少情况(例如一对数字)有18位有效数字相等,有多少17位有效数字相等,等等,但我担心这种差异可能会很大。

根据您想要如何处理相同的值,有两种选择,一种是将显著值(0)作为特殊情况处理,然后返回0。

那么是否把这些0包含在平均值中就取决于你了;如果没有,只需除以有效函数不为0的数字,而不是5。

相关内容

  • 没有找到相关文章

最新更新