【问题标题】:comparing float variable [duplicate]比较浮点变量[重复]
【发布时间】:2012-10-26 07:59:27
【问题描述】:

可能重复:
Most effective way for float and double comparison
How dangerous is it to compare floating point values?

我有const float M = 0.000001;float input;。我不想对它们进行平等检查。但我知道直接检查有副作用M != input。那么,我的问题是如何比较两个浮点值而没有副作用?

【问题讨论】:

  • “副作用”是什么意思?比较浮点数在该术语的通常含义中没有副作用。
  • M != input 不是(没有任何)副作用。
  • 你可以在这里找到一篇关于浮点比较的优秀文章:Comparing floating point numbers。基本上,根据您的要求,您可以使用 - epsilon - absolute error:当大约。值的范围是预先知道的 - epsilon - 相对误差:当大约。预先不知道值的范围 - 使用整数表示:当速度至关重要时。

标签: c++ c


【解决方案1】:
const double epsilon = 1e-12; 

if(fabs(input - M) < epsilon) //input == M
{
    //...
}
if(fabs(input - M) >= epsilon) // input != M
{
    //...
}

epsilon 的值越小,比较就越准确,因此它告诉您两个值不相等而您希望它们被视为相等的可能性就越大。 epsilon 的值越大,它告诉您结果相等的概率就越大,而实际上您希望它们不相等。应根据手头任务的具体情况选择 epsilon 的值。

【讨论】:

  • 可能值得指出的是,epsilon 的实际值取决于应用程序,您应该插入一个使它们“足够相等”以供您使用的值。
  • @user1802858 将比较运算符切换为&gt;=
【解决方案2】:

比较浮点数时,您必须比较它们是否“接近”而不是“相等”。根据您的需要,有多种方法可以定义“关闭”。然而,一个典型的方法可能是这样的:

namespace FloatCmp {

const float Eps = 1e-6f;

bool eq(float a, float b, float eps = Eps) {
  return fabs(a - b) < eps;
}

//etc. for neq, lt, gt, ...

}

然后,使用FloatCmp::eq() 而不是== 来比较浮点数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2012-07-17
    • 2013-07-02
    相关资源
    最近更新 更多