CompareByDigits

2つの行列/ベクトルの要素を有効数字の精度で比較します。

ulong vector::CompareByDigits(
  const vector& vec,         // 比較するベクトル
  const int    digits        // 有効数字の数
  );
 
ulong matrix::CompareByDigits(
  const matrix& mat,         // 比較する行列
  const int    digits        // 有効数字の数
  );

パラメータ

vector_b

[in] 比較するベクトル

digits

[in] 比較する有効数字の数

epsilon

[in] 比較の精度。2つの値の絶対値の差が指定された精度よりも小さい場合、それらは等しいと見なされます。

戻り値

比較される行列/ベクトルの不一致要素の数(行列が等しい場合は0、そうでない場合は0より大きくなる)

注意事項

比較演算子「==」または「!=」は、正確な要素単位の比較を実行します。実数の正確な比較は用途が限られていることが知られているため、イプシロン比較法が追加されました。たとえば、1つの行列に1e-20から1e+20までの範囲の要素が含まれる場合があります。このような行列は、有効数字までの要素ごとの比較を使用して処理できます。

  int   size_m=128;
  int   size_k=256;
  matrix matrix_a(size_m,size_k);
//--- 行列に書き込む
  double value=0.0;
  for(int i=0; i<size_m; i++)
    {
    for(int j=0; j<size_k; j++)
       {
        if(i==j)
          matrix_a[i][j]=1.0+i;
        else
          {
          value+=1.0;
          matrix_a[i][j]=value/1e+20;
          }
       }
    }
//--- あと1つの行列を取得する
  matrix matrix_c = matrix_a * -1;
 
  ulong errors_epsilon=matrix_a.Compare(matrix_c,1e-15);
  ulong errors_digits=matrix_a.CompareByDigits(matrix_c,15);
 
  printf("Compare matrix %d x %d  errors_epsilon=%I64u  errors_digits=%I64u",size_m,size_k,errors_epsilon,errors_digits);
 
 
 /*
Compare matrix 128 x 256 errors_epsilon=128 errors_digits=32768
 */