3

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

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

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

4

3 回答 3

3

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

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

于 2013-06-23T17:53:37.817 回答
2

您不能重载标准类型的运算符(int, float,char等)

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

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”。

于 2013-06-23T17:52:01.377 回答
1

不,您不能为内置类型重载运算符。不,更改运算符的语义(通常)不是一个好主意。

您可以:

  • 使用比较功能(正如您自己建议的那样)。
  • 围绕具有所需运算符的成员编写包装类double
于 2013-06-23T17:51:58.323 回答