如何安全地将 std::complex<double> 与零以一定的精度 Epsilon 进行比较?

How to safely compare std::complex<double> with Zero with some precision Epsilon?

我需要安全地检查我的复数是否为零(或与它非常相似)。我该如何处理浮点数?

我可以使用类似的东西吗:

std::complex<double> a;
if(std::abs(std::real(a)) <= std::numerical_limits<double>::epsilon() && std::abs(std::imag(a)) <= std::numerical_limits<double>::epsilon())
{
//...
}

我会将值除以 a 并且不想得到 INF 作为结果。

I need to check is my complex number a zero. How can I do it for floating point numbers?

您可以将它与值为 0 的浮点文字进行比较。您不能将整数文字与 std::complex<double> 一起使用。示例:

a == 0.0

Can I use something like ...

您所展示的内容并未比较复数 是否为 零;它比较复数是否接近零。这可能是一个合理的操作,例如,如果数字是已知误差幅度的计算结果,并且您想知道结果是否在误差范围内。但它是一个单独的操作

这是否是比较数字是否接近零的好方法取决于用例。比如epsilon不一定是“near”的最佳阈值。您可能要考虑的另一件事是您是否应该将 std::abs(a) 与阈值进行比较,而不是分别比较组件,即您是否应该使用欧氏距离而不是曼哈顿距离。

您是否尝试过 <cmath> 中的 std::fpclassify

if (std::fpclassify(a.real()) == FP_ZERO) {}

检查复数的实部和虚部是否都为0:

if (a == 0.0) {}

正如@eerorika 在我之前很久提到的那样。您拒绝的回答。
浮点精度、舍入、升旗、次正规都是实现定义的(参见:[basic.fundamental], [support.limits.general], and ISO C 5.2.4.2.2)。