【发布时间】:2022-01-02 01:49:32
【问题描述】:
我需要安全地检查我的复数是否为零(或非常相似)。如何处理浮点数?
我可以使用类似的东西吗:
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 作为结果。
【问题讨论】:
-
en.cppreference.com/w/cpp/types/numeric_limits/epsilon 返回机器epsilon,即1.0与浮点类型T可表示的下一个值的差值。见cppreference中的例子,当你增加时,浮点数变得不那么密集数字的大小,您需要考虑缩放
-
std::abs(a) < epsilon会不会比只比较真实的部分更好? -
这将使“足够接近”的区域变成正方形;
a + ai形式的数字将比a + 0i或0 + ai更远离实际零“零”。一个圆圈,即abs(a)的大小,不是更好吗? -
"检查我的复数是否为零" -->
x == 0.0就足够了。以线性方式与 epsilon 进行比较,将浮点数从浮点数中取出。发布真实用例以获得更多反馈。 -
... 此外,任何与零比较的“捏造”都会以假阴性换成假阳性,反之亦然,这些风险和回报取决于应用程序。因此,对此没有一般性的答案。而且你没有给出任何上下文,根本没有,没有说明正在执行什么计算或使用什么数据。所以你的问题没有答案。
标签: c++ floating-point comparison similarity complex-numbers