如何删除浮点变量的operator ==(和!=)

时间:2016-11-15 14:33:10

标签: c++

由于浮点的不稳定性得到比较,我希望在使用比较运算符时至少有一个警告。

示例:

float a,b;
a == b; // Here the warning shall be thrown

我怎么能意识到这一点?

我想过载如下:

inline bool operator==(const float& a, const float& b)
{
    #warning "Usage of equal on floating point variables not allowed."
    return false;
}

我没有明确说明,但似乎禁止覆盖此运算符,因为MSVC抛出C2803并且gcc抛出"必须有类或枚举类型的参数" (也在Global overloading of == and != for floating-points中描述)。即使有可能,编译器在遇到#error语句时也会抛出错误,即使没有使用它。

1 个答案:

答案 0 :(得分:1)

使用自定义运算符重载的方法不起作用,因为如果所有参数都有内置类型,C ++标准禁止自定义运算符重载。

如果你正在使用GCC(或clang / MinGW),你可以使用-Wfloat-equal启用有关这些比较的警告。这是你能得到的最接近的事情。

即使可以完全禁用它们,也不是一个坏主意。有时它们是有用且完全安全的。特别是如果没有计算。

请考虑以下代码:

float f = 0;

if (a >= -1 && a <= 1)
    f = std::asin(a);

// ...

if (f != 0)
    std::cout << "asin = " << f << '\n';
else
    std::cout << "Out of range.\n";

即使==float一起使用,也完全安全。