【发布时间】:2017-04-25 08:00:24
【问题描述】:
我对在代码中执行浮点相等比较的问题有点熟悉。
目前我在 (GCC, Clang) 上编译的代码库启用了以下选项:-Wfloat-equal
在代码库中有以下示例比较:
template <typename FloatType>
void foo(FloatType v) {
if (v == FloatType(1)) {
...
}
else if (v == FloatType(0)) {
....
}
}
foo函数调用如下:
double d = 123.98;
float f = 123.98f;
foo(d);
foo(f);
考虑到 1 和 0 的特殊情况,它们每个都有精确的浮点表示 (double, float) 并且代码显然是在完全相等之后,而不是在某个次要的附近区别——
有没有办法重写代码,使其不会引发相关的 Wfloat-equal 诊断,并且还可以移植并支持浮点和双精度类型?
【问题讨论】:
-
您可以使用 GCC 的
#pragma GCC diagnostic push/pop/ignored来禁用这些行的诊断。 -
你可以随时使用
memcmp -
那你为什么要把
-Wfloat-equal传递给编译器呢? -
如果你使用memcmp,记住0可以用两种不同的位模式来表示。
-
@MarcGlisse 这是一个在构建过程中使用的选项——我无法控制它。
标签: c++ gcc floating-point compare clang