CompareByDigits

Сравнивает элементы двух матриц/векторов на совпадение с точностью значащих цифр.

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]  Точность сравнения. Если два значения отличаются по модулю меньше, чем заданная точность, то они считаются равными.

Возвращаемое значение

Возвращает количество несовпавших элементов у сравниваемых матриц или векторов, то есть 0, если матрицы равны, в противном случае значение больше 0.

Примечание

Операции сравнения == или != производят точное поэлементное сравнение. Как известно, точное сравнение вещественных чисел имеет ограниченное применение, поэтому был добавлен метод сравнения с эпсилоном. Бывают случаи, когда в пределах одной матрицы существуют элементы в диапазоне, например, от 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);
 
 
  /*
  Compare matrix 128 x 256  errors_epsilon=128  errors_digits=32768
  */