可能重复:
浮点和双重比较的最有效方法
比较浮点值有多危险?
我有const float M = 0.000001;
和float input;
。我不想对它们进行平等检查。但我知道直接检查有副作用M != input
。那么,我的问题是如何比较两个浮点值而没有副作用?
可能重复:
浮点和双重比较的最有效方法
比较浮点值有多危险?
我有const float M = 0.000001;
和float input;
。我不想对它们进行平等检查。但我知道直接检查有副作用M != input
。那么,我的问题是如何比较两个浮点值而没有副作用?
const double epsilon = 1e-12;
if(fabs(input - M) < epsilon) //input == M
{
//...
}
if(fabs(input - M) >= epsilon) // input != M
{
//...
}
epsilon 的值越小,比较就越准确,因此它告诉您两个值不相等而您希望它们被视为相等的可能性就越大。epsilon 的值越大,它告诉您结果相等的可能性就越大,而实际上您希望它们不相等。应根据手头任务的具体情况选择 epsilon 的值。
比较浮点数时,您必须比较它们是否“接近”而不是“相等”。有多种方法可以根据您的需要定义“关闭”。然而,一个典型的方法可能是这样的:
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()
而不是==
比较浮点数。