将浮点数与三位小数进行比较

Mis*_*tyD 3 c++ floating-point

我想知道将浮点数比较到三位小数的最快方法.我有类似的东西

float lhs = 2.567xxxx
float rhs = 2.566xxxx
Run Code Online (Sandbox Code Playgroud)

上面应该是不同的,如果它是这样的

float lhs = 2.566xxxx
float rhs = 2.566xxxx
Run Code Online (Sandbox Code Playgroud)

它们应该是一样的

更新:

我正在尝试以下方面

double trunc(double d)
{
    return (d>0) ? floor(d) : ceil(d) ; 
}


bool comparedigits(float a , float b)
{
    if (trunc(1000.0 * a) == trunc(1000.0 * b))
    {
        return true;
    }
    return false;
}

    float g = 2.346;
    float h= 2.34599;
    bool t = comparedigits(g,h) ; //Not the same and should return false;
Run Code Online (Sandbox Code Playgroud)

然而它正在回归真实.

Eri*_*hil 10

为了阻止错误的答案的冲击,因为它们允许舍入来改变结果,这里是一个没有舍入问题的答案,因为它double用于算术:

trunc(1000. * lhs) == trunc(1000. * rhs);
Run Code Online (Sandbox Code Playgroud)

这是因为1000.有类型double,所以另一个操作数从转换floatdouble,并且乘法以double格式执行.具有任何float值的1000的乘积可以准确表示double,因此没有舍入误差(假设IEEE 754 32位和64位二进制浮点).然后我们trunc用来比较小数点后的(原始)第三位数字.

我对提供这个答案犹豫不决,因为我不确定这是OP真正想要的.通常,当人们向Stack Overflow提出比较"小数点后三位"的请求时,他们并没有完全考虑过这个问题.完整正确的答案可能需要等到我们澄清之后.

此外,以上仅适用于正数.如果值可能为负,则应对其符号执行先前测试,false如果它们不同则应返回.(否则,-.0009将被报告为等于+.0009.)


mas*_*oud 5

对于x1000可以尝试的可以放入整数的浮点值:

if (static_cast<int>(lhs*1000.0) == static_cast<int>(rhs*1000.0))
{
   // Values are near
}
else
{
   // They are not identical (maybe!)
}
Run Code Online (Sandbox Code Playgroud)

表示浮动值时要小心计算机的准确性.


重要更新

始终存在可能使代码失败的数字,Eric Postpischil的代码与此代码相同.

即使转换为字符串也无济于事,我们可以找到无法正确转换为字符串的数字.

那么,解决方案是什么?这很容易,我们必须定义我们程序的范围和所需的准确性.我们不能在计算机世界中拥有无限的精确度.每个计算机科学家应该知道的浮点运算

  • +1但请注意,这仅适用于不超过`int`范围的浮点值.这可能是OP的有效假设. (2认同)