Эрмитова матрица и нулевой знак в с ++
Я просто хочу проверить, является ли матрица эрмитовой или нет. Пусть A[ ][ ] является 2D-массивом. C[ ][ ] - сопряженная матрица A[ ][ ]. T[ ][ ] - транспонированная матрица C[ ][ ]. Теперь я должен проверить, если T[ ][ ]==A[ ][ ]. Я скомпилировал программу и после ввода действительной эрмитовой матрицы он сказал, что матрица не эрмитова. Я нашел причину этого. Компилятор оценил 0==-0 в ложь. Но у моих друзей компилятор ПК сказал, что матрица эрмитова. Мы оба запустили один и тот же код. В чем причина этого? Я собираюсь привести вам пример. У меня есть элемент A[0][0]=5. После сопряжения и транспонирования этот элемент стал 5-0i (часть комплексного числа минус ноль). Таким образом, мой компьютер не смог оценить равенство 5 и 5-0i. Как преодолеть эту проблему?
#include<iostream>
#include<complex>
using namespace std;
int main() {
typedef complex<double> comp;
comp A[3][3]={{2,comp(2,1),4},{comp(2,-1),3,comp(0,1)},{4,comp(0,-1),1}};
comp C[3][3]; comp T[3][3];
int a=0;
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
C[i][j]=conj(A[i][j]); }}
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
T[i][j]=C[j][i]; }}
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
if(T[i][j]==A[i][j])
a=a+1;
else a=0; }}
if(a==9)
cout << "Hermitian" << endl;
else cout << "Not Hermitian" << endl;
return 0;
}
1 ответ
Вы могли бы просто заменить
typedef complex<double> comp;
с
typedef complex<int> comp;
Или, если вы хотите продолжать использовать double(из вашего примера я не вижу причин, почему), вы можете использовать эту функцию для сравнения двух комплексных чисел:
bool double_equals(complex<double> a, complex<double> b, double epsilon = 0.001)
{
bool retval = false;
if ((std::abs(a.real() - b.real()) < epsilon) && (std::abs(a.imag() - b.imag()) < epsilon))
retval = true;
return retval;
}
Также смотрите: C++ сравнение двух двойных значений не работает должным образом