比较浮点变量

可能重复:
最有效的浮动和双重比较方式
比较浮点值有多危险?

我有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()而不是==来比较浮点数。