CompareByDigits

Confrontare gli elementi di due matrici/ vettori con la precisione delle cifre significative.

ulong vector::CompareByDigits(
  const vector& vec,          // vettore da confrontare
  const int     digits        // numero di cifre significative
   );
 
ulong matrix::CompareByDigits(
  const matrix& mat,          // matrice da confrontare
  const int     digits        // numero di cifre significative
   );

Parametri

vector_b

[in] Vettore da confrontare.

digits

[in] Numero di cifre significative da confrontare.

epsilon

[in] Precisione di confronto. Se due valori differiscono in valore assoluto di meno della precisione specificata, sono considerati uguali.

Valore Restituito

Numero di elementi non corrispondenti delle matrici o dei vettori confrontati: 0 se le matrici sono uguali, maggiore di 0 altrimenti.

Note

Gli operatori di confronto == o != eseguono un confronto esatto. È noto che il confronto esatto dei numeri reali è di uso limitato, quindi è stato aggiunto il metodo di confronto epsilon. Può accadere che una matrice possa contenere elementi in un intervallo, ad esempio da 1e-20 a 1e+20. Tali matrici possono essere elaborate utilizzando il confronto degli elementi fino a cifre significative.

Esempio

   int    size_m=128;
   int    size_k=256;
   matrix matrix_a(size_m,size_k);
//-- riempire la matrice
   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;
           }
        }
     }
//-- ottenere un'altra matrice
   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
  */