对double进行重载比较以允许出现数字错误

Overloading comparison for double to allow for numerical error

本文关键字:许出现 数字 错误 比较 double 重载      更新时间:2023-10-16

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

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

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

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

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

不能重载标准类型(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"替换为"floating"。

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

你可以:

  • 使用比较函数(根据您自己的建议)
  • 围绕具有所需运算符的double成员编写一个包装类