CompareByDigits

Compara si los elementos de dos matrices/vectores coinciden con una precisión de dígitos significativos.

ulong vector::CompareByDigits(
  const vector&  vec,          // vector para comparación
  const int     digits         // número de dígitos significativos
   );
 
ulong matrix::CompareByDigits(
  const matrix&  mat,          // matriz para la comparación
  const int      digits        // número de dígitos significativos
   );

Parámetros

vector_b

[in]  Vector para la comparación.

digits

[in]  Número de dígitos significativos para la comparación.

epsilon

[in]  Precisión de la comparación. Si dos valores difieren en el módulo en una magnitud menor que la precisión especificada, se considerarán iguales.

Valor retornado

Retorna el número de elementos no coincidentes en las matrices o vectores comparandos, es decir, 0 si las matrices son iguales; en caso contrario, el valor será superior a 0.

Observación

Las operaciones de comparación == o != realizan una comparación por elementos exacta. Como sabemos, la comparación exacta de números reales tiene un uso limitado, por lo que hemos añadido el método de comparación con épsilon. Hay casos en los que dentro de una misma matriz hay elementos en el rango, por ejemplo, de 1e-20 hasta 1e+20. Para ello, se contempla la comparación por elementos, teniendo en cuenta los dígitos significativos.

Ejemplo:

   int    size_m=128;
   int    size_k=256;
   matrix matrix_a(size_m,size_k);
//--- rellenamos la 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;
           }
        }
     }
//--- obtenemos otra 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
  */