重载比较为double以允许数值错误

时间:2013-06-23 17:42:09

标签: c++ double numeric

在我的C ++项目中,由于数字错误,我经常遇到不精确的结果。是否有可能以某种方式重新定义标准比较运算符(==<=>=<>),以便它们不能完全比较但是在可接受的错误范围内(例如1e-12)?

(如果是的话,这样做是个好主意吗?)

(当然可以编写比较函数,但人们可以直观地使用运算符。)

3 个答案:

答案 0 :(得分:3)

要重载运算符,某些参数必须是用户定义的类型。内置的固定且不可更改。

但即使你能做到这也不是一件好事。帮自己一个忙,并提供自定义比较“运算符”作为一组函数,选择一个暗示他们使用的策略的名称。如果没有正确的指示,表示严格或使用DBL_EPSILON或2 * DBL_EPSILON或某些任意线性或缩放公差,您就不能指望代码阅读器知道。

答案 1 :(得分:2)

您无法为标准类型(intfloatchar等)重载运算符

你当然可以声明一个类型:

class Float
{
    private:
       float f;
    public:
       Float(float v) : f(v) {} 
       ... bunch of other constructors. 
       friend bool operator==(Float &a, Float &b);
       ... more operators here.
       float operator float() { return f; }
};

bool operator==(Float &a, Float &b) { return (fabs(b.f-a.f) < epsilon); }
bool operator==(Float &a, const float &b) { return (fabs(b-a.f) < epsilon); }
       ... several other operator declarations - need on also make operator

(上面的代码是“作为一个想法”,没有经过测试,也许需要更多工作才能“好”)。

当然,你需要一些丑陋的typedef或宏来代替代码中的“Float”和“Float”。

答案 2 :(得分:1)

不,您不能为内置类型重载运算符。 不,改变运营商的语义(一般来说)不是一个好主意。

你可以:

  • 使用比较功能(正如您自己建议的那样)。
  • 围绕具有您想要的运算符的double成员编写包装类。