我想知道将浮点数与小数点后三位进行比较的最快方法是什么。说我有这样的事情

float lhs = 2.567xxxx
float rhs = 2.566xxxx

以上应该是不同的,如果它是这样的
float lhs = 2.566xxxx
float rhs = 2.566xxxx

他们应该是一样的

更新:

我正在尝试以下
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;

然而,它正在返回true。

最佳答案

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

trunc(1000. * lhs) == trunc(1000. * rhs);

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

我犹豫要不要提供这个答案,因为我不确定这是 OP 真正想要的。通常,当人们来到 Stack Overflow 并要求比较“小数点后三位”时,他们并没有完全考虑问题。一个完整的正确答案可能要等到我们澄清。

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

关于c++ - 比较浮点数到小数点后三位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18686269/

10-10 09:05