埃尔米特矩阵和 c++ 中的有符号零
Hermitian matrix and signed zero in c++
我只是想检查矩阵是否是埃尔米特矩阵。设 A[ ][ ] 是一个二维数组。C[ ][ ] 是 A[ ][ ] 的共轭矩阵。T[ ][ ] 是 C[ ][ ] 的转置矩阵。现在我必须检查 T[ ][ ]==A[ ][ ]。我编译了程序,输入一个有效的埃尔米特矩阵后,它说矩阵不是埃尔米特矩阵。我找到了背后的原因。编译器将 0==-0 计算为 false。但是在我的朋友PC编译器说矩阵是埃尔米特矩阵。我们都运行相同的代码。这背后的原因是什么? 我给大家举个例子。我有一个元素 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;
}
你可以替换
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++ 比较无法正常工作
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 检查TCHAR数组输入是否为带符号整数C++
- 用符号版本替换对函数的所有调用
- 未解析的外部符号_MsiLocateComponentW@12.
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号