CompareByDigits

Compara os elementos de duas matrizes/vetores para verificar se correspondem com uma precisão de dígitos significativos.

ulong vector::CompareByDigits(
  const vector&  vec,          // vetor de comparação
  const int     digits         // número de dígitos significativos
   );
 
ulong matrix::CompareByDigits(
  const matrix&  mat,          // matriz de comparação
  const int      digits        // número de dígitos significativos
   );

Parâmetros

vector_b

[in]  Vetor de comparação.

digits

[in]  Número de dígitos significativos para comparação.

epsilon

[in]  Precisão da comparação. Se a diferença absoluta entre dois valores for menor do que a precisão especificada, eles serão considerados iguais.

Valor retornado

Retorna o número de elementos diferentes entre as matrizes ou vetores comparados, ou seja, 0 se as matrizes forem iguais, caso contrário, o valor será maior que 0.

Observação

Os operadores de comparação == ou != produzem uma comparação exata elemento por elemento. É conhecido que a comparação exata de números reais tem sua aplicação limitada, por isso foi adicionado o método de comparação com epsilon. Existem casos em que dentro da mesma matriz existem elementos no intervalo, por exemplo, de 1e-20 a 1e+20. Para isso, é fornecida uma comparação elemento a elemento, levando em consideração dígitos significativos.

Exemplo:

   int    size_m=128;
   int    size_k=256;
   matrix matrix_a(size_m,size_k);
//--- preenchemos a matriz
   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;
           }
        }
     }
//--- obtemos outra matriz
   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
  */