CompareByDigits
So sánh các phần tử của hai ma trận/vector với độ chính xác dựa trên số chữ số có nghĩa.
cpp
ulong vector::CompareByDigits(
const vector& vec, // vector để so sánh
const int digits // số chữ số có nghĩa
);
ulong matrix::CompareByDigits(
const matrix& mat, // ma trận để so sánh
const int digits // số chữ số có nghĩa
);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Tham số
vec
[in] Vector để so sánh.
mat
[in] Ma trận để so sánh.
digits
[in] Số chữ số có nghĩa để so sánh.
Giá trị trả về
Số lượng các phần tử không khớp của các ma trận hoặc vector được so sánh: 0 nếu các ma trận bằng nhau, lớn hơn 0 nếu không.
Ghi chú
Các toán tử so sánh ==
hoặc !=
thực hiện so sánh chính xác từng phần tử. Được biết rằng việc so sánh chính xác các số thực có hạn chế, vì vậy phương pháp so sánh epsilon đã được thêm vào. Có thể xảy ra trường hợp một ma trận chứa các phần tử trong một khoảng, ví dụ từ 1e-20
đến 1e+20
. Những ma trận như vậy có thể được xử lý bằng cách so sánh từng phần tử đến các chữ số có nghĩa.
Ví dụ
cpp
int size_m=128;
int size_k=256;
matrix matrix_a(size_m,size_k);
//--- điền ma trận
double value=0.0;
for(int i=0; i<size_m; i++)
{
for(int j=0; j<size_k; j++)
{
if(i==j)
matrix_a[i][j]=1.0+i;
else
{
value+=1.0;
matrix_a[i][j]=value/1e+20;
}
}
}
//--- lấy một ma trận khác
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
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29