gpt4 book ai didi

c++ - 比较 float 的相等计算输出

转载 作者:行者123 更新时间:2023-11-30 04:42:03 28 4
gpt4 key购买 nike

两个计算的输出应该与下面描述的相同,但即使考虑到机器精度,它们也会不相等。有什么办法可以使它们相等?

#include <iostream>
#include <limits>
#include <math.h>

bool definitelyGreaterThan(double a, double b, double epsilon)
{
return (a - b) > ( (std::fabs(a) < std::fabs(b) ? std::fabs(b) : std::fabs(a)) * epsilon);
}

bool definitelyLessThan(double a, double b, double epsilon)
{
return (b - a) > ( (std::fabs(a) < std::fabs(b) ? std::fabs(b) : std::fabs(a)) * epsilon);
}

int main ()
{
double fig1, fig2;
double m1 = 235.60242, m2 = 126.734781;
double n1 = 4.2222, n2 = 2.1111;
double p1 = 1.245, p2 = 2.394;
fig1 = (m1/m2) * (n1/n2) - p1 * 6.0 / p2;

m1 = 1.2*m1, m2 = 1.2*m2; // both scaled equally, numerator and denominator
n1 = 2.0*n1, n2 = 2.0*n2;
p1 = 3.0*p1, p2 = 3.0*p2;

fig2 = (m1/m2) * (n1/n2) - p1 * 6.0 / p2; // same as above

double epsilon = std::numeric_limits<double>::epsilon();
std::cout << "\n fig1 " << fig1 << " fig2 " << fig2 << " difference " << fig1 - fig2 << " epl " << epsilon;

std::cout << "\n if(fig1 < fig2) " << definitelyLessThan(fig1, fig2, epsilon)
<< "\n if(fig1 > fig2) " << definitelyGreaterThan(fig1, fig2, epsilon) << "\n";
}

输出为-

fig1 0.597738 fig2 0.597738 difference 8.88178e-16 epl 2.22045e-16
if(fig1 < fig2) 0
if(fig1 > fig2) 1

两个数字之间的差异大于机器精度。

关键问题是是否有任何通用方法来处理这些方面,或者解决方案是否必须依赖于应用程序?

最佳答案

有两件事需要考虑:

  • 首先,可能的舍入误差(由有限的机器精度引入)与用于计算该值的操作次数成比例。例如,存储 m1/m2 的结果可能会引入一些舍入误差(取决于实际值),将此值乘以某个值也会乘以该舍入误差,并在此基础上添加另一个可能的舍入误差(通过存储该结果)。
  • 其次,浮点值不是线性存储的(相反,它们使用指数和尾数格式):实际值越大,该值与下一个可表示值之间的差异就越大(因此也可能的舍入误差)。 std::numeric_limits<T>::epsilon()仅说明 1.0 之间的区别和下一个可表示的值,所以如果您的值不完全是 1.0 ,则此 epsilon 并不完全代表该值的机器精度(意思是:此值与下一个可表示值之间的差异)。

因此,回答您的问题:解决方案是选择一个取决于应用程序的合理最大舍入误差,允许两个值仍然被视为相等。由于此允许的舍入误差取决于预期值和操作次数(当然还有应用程序本身可接受的值),因此不可能有真正通用的解决方案。

关于c++ - 比较 float 的相等计算输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58949582/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com