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,所以另一个操作数从转换float为double,并且乘法以double格式执行.具有任何float值的1000的乘积可以准确表示double,因此没有舍入误差(假设IEEE 754 32位和64位二进制浮点).然后我们trunc用来比较小数点后的(原始)第三位数字.
我对提供这个答案犹豫不决,因为我不确定这是OP真正想要的.通常,当人们向Stack Overflow提出比较"小数点后三位"的请求时,他们并没有完全考虑过这个问题.完整正确的答案可能需要等到我们澄清之后.
此外,以上仅适用于正数.如果值可能为负,则应对其符号执行先前测试,false如果它们不同则应返回.(否则,-.0009将被报告为等于+.0009.)
对于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的代码与此代码相同.
即使转换为字符串也无济于事,我们可以找到无法正确转换为字符串的数字.
那么,解决方案是什么?这很容易,我们必须定义我们程序的范围和所需的准确性.我们不能在计算机世界中拥有无限的精确度.每个计算机科学家应该知道的浮点运算