Compare two float variables in C++

Pan*_*apa 1 c++ floating-point

I have read multiple articles regarding floating point variables comparison, but failed to understand and get the required knowledge from those articles. So, here I am posting this question.

What is the good way to compare two float variables? Below is the code snippet:

#define EPSILON_VALUE 0.0000000000000001

bool cmpf(float A, float B)
{
  return (fabs(A - B) < EPSILON_VALUE);
}

int main()
{
  float a = 1.012345679, b = 1.012345678;

  if(cmpf(a, b))cout<<"same"<<endl;
  else cout<<"different"<<endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

The output: same although both the float variables hold different values.

Eri*_*hil 6

没有比较包含先前操作错误的浮点数的通用解决方案。必须使用的代码是特定于应用程序的。因此,要获得正确的答案,您必须更具体地描述您的情况。

潜在的问题是使用错误数据执行正确的计算通常是不可能的。如果要计算两个确切的数学值xy的某个函数,但您拥有的唯一数据是一些不精确计算的值xy,通常不可能计算出完全正确的结果。例如,假设您想知道x + y的总和是多少,但您只知道x3和y4,但是您不知道真正的确切xy是多少。这样就无法计算x + y

如果你知道,xy大约 XŸ,那么你可以计算的近似X通过增加+ Y xy。当要计算的函数(+在此示例中)具有一个合理的导数时,该工程就可以工作:用一个合理的导数稍微更改一个函数的输入会稍微改变其输出。当您要计算的函数具有不连续性或较大的导数时,此操作将失败。例如,如果您想使用近似值来计算x(在实际域中)的平方根,xx由于先前的舍入误差而可能为负,则计算sqrt(x)可能会产生异常。同样,比较不平等或顺序是一个不连续的函数:输入的微小变化可以完全改变答案(从假到真,反之亦然)。

常见的坏建议是与“宽容”进行比较。此方法将假阴性(如果比较精确的数学值,则不正确地拒绝满足比较的数字)换为假阳性(不正确地接受不满足比较的数字)。

适用对象是否可以接受错误接受取决于应用程序。因此,没有通用的解决方案。

设置的公差级别,甚至是计算公差的性质,都取决于数据,误差和先前的计算。因此,即使可以与公差进行比较,公差的使用量和计算方法也取决于应用程序。没有通用的解决方案。