jtb*_*tbr 4 c++ floating-point
我知道这里有很多关于为什么浮点相等比较通常是一个坏主意的问题。我理解浮点表示问题、舍入问题、将浮点无声地提升为双精度、依赖位级别算术的危险等。但在我看来,这应该没问题,而且我发现的任何问题似乎都没有涵盖这一点:
static const float MARKER = -500.0f; // some value well outside the range of valid values
std::vector<float> some_floats = {MARKER, 0.5f, 100.0f, 9.5f, MARKER, 0.f};
for (size_t i = 0; i< some_floats.size(); ++i) {
if (some_floats[i] == MARKER) {
std::cout << i << std::endl;
} else {
// do some math
}
}
Run Code Online (Sandbox Code Playgroud)
输出如预期:
0
4
Run Code Online (Sandbox Code Playgroud)
如果我-Wfloat-equal启用了(在 gcc 中,但在其他编译器中类似),它会将比较行标记为危险:
comparing floating point with == or != is unsafe。这里几乎所有的答案都说不要使用 == 或 !=, period。但我不明白为什么这里有问题。我只设置该常量一次,然后在其他使用它的地方重复使用它,并且永远不会对该常量进行任何操作(例如算术)。我错过了什么吗?0.0f即使没有设置为常数,又怎么样?
只要您有信心MARKER并且其副本不会被算术函数或其他东西改变,那么进行简单的比较就没有问题。
也许考虑不-Wfloat-equal全局使用但在本地禁用警告:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wfloat-equal"
/* your code */
#pragma GCC diagnostic pop
Run Code Online (Sandbox Code Playgroud)
或便携式等效项:https://www. Fluentcpp.com/2019/08/30/how-to-disable-a-warning-in-cpp/
| 归档时间: |
|
| 查看次数: |
774 次 |
| 最近记录: |