比较两个double或两个float值的最有效方法是什么?
简单地这样做是不正确的:
bool CompareDoubles1 (double A, double B)
{
return A == B;
}
Run Code Online (Sandbox Code Playgroud)
但是像这样:
bool CompareDoubles2 (double A, double B)
{
diff = A - B;
return (diff < EPSILON) && (-diff < EPSILON);
}
Run Code Online (Sandbox Code Playgroud)
似乎浪费处理.
有谁知道更聪明的浮动比较器?
就在今天,我遇到了我们正在使用的第三方软件,在他们的示例代码中,有以下几点:
// Defined in somewhere.h
static const double BAR = 3.14;
// Code elsewhere.cpp
void foo(double d)
{
if (d == BAR)
...
}
Run Code Online (Sandbox Code Playgroud)
我知道浮点数及其表示的问题,但它让我想知道是否有float == float可能会好的情况?我不是在问它什么时候可行,而是在它有意义和有效的时候.
还有,电话foo(BAR)怎么样?它总是比较相同,因为它们都使用相同的static const BAR吗?
我们都知道(对吗?!),不应该通过测试equality(operator==)来比较浮点值.
但是,如果我真的想确定两个是否float小号a和b是二进制的平等?如果他们不被允许为NaN(或其他"特殊价值"),这是"安全的"吗?我可以依靠operator==这种方式运作吗?
最近我开始讨论浮点比较.我的观点总是不==直接比较两个浮点数.
有人指出,事实并非如此,有些情况下使用==完全没问题.我可以想到典型的情况,我在其中检查IEEE 754文字,+-INF或者+-0,除此之外,我不能想到这不会导致问题的情况.
所以我的问题是:使用浮点比较时有哪些情况==?
我在ARM64上遇到了一个非常奇怪的浮点精度问题.我有一个非常简单的C++代码,看起来像这样:
float sx = some_float_number_1;
float sy = some_float_number_2;
float ex = some_float_number_3;
float ey = some_float_number_4;
float px = ex;
float py = ey;
float d1 = (ex - sx) * (py - sy);
float d2 = (px - sx) * (ey - sy);
float d = d1 - d2;
float t = (ex - sx) * (py - sy) - (px - sx) * (ey - sy);
//32-bit output: d == t == 0
//64-bit output: d == …Run Code Online (Sandbox Code Playgroud)