CompareByDigits

두 행렬/벡터의 요소를 significant digits precision로 비교합니다.

ulong vector::CompareByDigits(
  const vector& vec,          // 비교할 벡터
  const int     digits        // significant digits의 수
   );
 
ulong matrix::CompareByDigits(
  const matrix& mat,          // 비교할 행렬
  const int     digits        // significant digits의 수
   );

매개 변수

vector_b

[in]  비교할 벡터

digits

[in] 비교할 significant digits의 수

epsilon

[in] 비교 정밀도 두 값의 절대값 차이가 지정된 정밀도보다 작은 경우 동일한 것으로 간주됩니다.

반환값

비교 중인 행렬 또는 벡터의 일치하지 않는 요소 수: 행렬이 같으면 0, 그렇지 않으면 0보다 큽니다.

참조

비교 연산자 == or !=는 정확한 요소별 비교를 실행합니다. 실수의 정확한 비교는 제한적으로 사용되는 것으로 알려져 있으므로 엡실론 비교 방법이 추가되었습니다. 하나의 행렬이 예를 들어 1e-20에서 1e+20까지의 범위에 있는 요소를 포함할 수 있는 경우가 있습니다. 이러한 행렬은 significant digits까지 요소별 비교를 사용하여 처리할 수 있습니다.

   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;
           }
        }
     }
//--- get another matrix
   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
  */