如何处理 c++ 中接近零的值?

How do I handle values close to zero in c++?

本文关键字:接近 c++ 何处理 处理      更新时间:2023-10-16

我正在尝试编写一个采用初始的迭代函数

double t = /*formula 1*/;

然后计算

for (auto i = 0; i < bigNumber; ++i)
{
temp = /*formula 2*/;
t = t*temp;
}

这工作正常,除非初始t太小以至于C++自动将其设置为零(实际上不应该为零(。

当然,t将永远保持为零,因为我们将其乘以自身,这就是问题所在。

我尝试通过将t设置为等于一些非常小但非零的数字来解决这个问题,以防C++将其设置为零,但这不起作用,因为那样,我最终会遇到相反的问题,因为一旦我们迭代了足够多的次数,t最终就会爆炸。

如何解决此问题?

可能值得一提:

第一个公式(公式1(涉及类似exp(-verybignumber)的东西,第二个公式涉及像pow(i, -1)这样的东西,这意味着随着迭代次数的增加,它变得非常小。

正如您刚刚发现的那样,浮点运算并非微不足道。这与C++无关,而是与IEEE 754标准有关。

您需要确保的一件事是保持在正常数字范围内。也就是说,确保整个计算过程中的值不会变得太小或太大。

在某些情况下,这很容易,也许重新缩放输入数据就足够了。在其他情况下,也许您必须重新考虑您的方程式(步骤(以避免这种情况。

有时你可以简单地使用更大的类型,例如long double甚至__float128(四边形,检查libquadmath(。

其他解决方案是使用任意精度的数字(使用GMP和MPFR等库;不要尝试自己作为初学者(甚至符号计算。这完全取决于您需要的性能。

请注意,在处理浮点运算时还有许多其他陷阱。