CompareByDigits

按有效位数精度比较两个矩阵/向量的元素。

ulong vector::CompareByDigits(
  const vector& vec,          // 欲比较的向量
  const int     digits        // 有效位数
   );
 
ulong matrix::CompareByDigits(
  const matrix& mat,          // 欲比较的矩阵
  const int     digits        // 有效位数
   );

参数

vector_b

[输入]  欲比较的向量。

digits

[输入] 进行比较采用的有效位数。

epsilon

[输入] 比较精度。 如果两个值的绝对值相差小于指定的精度,则认为它们相等。

返回值

所比较的矩阵或向量的不匹配元素数量:如果矩阵相等,则为 0,否则大于 0。

注意

比较运算符 == 或 != 执行精确的元素级比较。 众所周知,实数的精确比较用途有限,因此增加了 epsilon 比较方法。 一个矩阵也许包含某个范围内的元素,例如从 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=0i<size_mi++)
     {
      for(int j=0j<size_kj++)
        {
         if(i==j)
            matrix_a[i][j]=1.0+i;
         else
           {
            value+=1.0;
            matrix_a[i][j]=value/1e+20;
           }
        }
     }
//--- 获取其它矩阵
   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);
 
 
  /*
  比较 矩阵 128 x 256  errors_epsilon=128  errors_digits=32768
  */