Hermitian 矩阵并在 C++ 中签名为零

Hermitian matrix and signed zero in c++

我只是想检查矩阵是否为厄密矩阵。设 A[ ][ ] 是一个二维数组。 C[ ][ ] 是 A[ ][ ] 的共轭矩阵。 T[ ][ ] 是 C[ ][ ] 的 t运行spose 矩阵。现在我要检查是否 T[ ][ ]==A[ ][ ]。我编译了程序,在输入一个有效的厄尔米特矩阵后,它说该矩阵不是厄尔米特矩阵。我找到了背后的原因。编译器将 0==-0 评估为 false。但是在我的朋友 pc 编译器中说矩阵是 Hermitian。我们俩 运行 相同的代码。这背后的原因是什么? 我要给你举个例子。我有一个元素 A[0][0]=5。经过共轭和t运行sposing,这个元素变成了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;
} 

你可以直接替换

typedef complex<double> comp;

typedef complex<int> comp;

或者,如果您想继续使用双精度数(从您的示例中我看不出任何原因),您可以使用此函数来比较两个复数:

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++ comparison of two double values not working properly