在我的 C++ 项目中,由于数值错误,我经常遇到不精确的结果。是否有可能以某种方式重新定义标准比较运算符(==
, <=
, >=
, <
, >
),以便它们不进行精确比较但在可接受的错误范围内(例如1e-12
)?
(如果是,这样做是个好主意吗?)
(当然可以编写比较函数,但人们直观地使用运算符。)
要重载运算符,某些参数必须是用户定义的类型。内置的是固定不变的。
但即使你可以,这也不是一件好事。帮自己一个忙,并提供您的自定义比较“运算符”作为一组函数,选择一个暗示他们使用的策略的名称。如果没有适当的指示,您不能指望代码阅读器知道相等意味着严格或 DBL_EPSILON 或 2*DBL_EPSILON 或一些任意线性或缩放容差。
您不能重载标准类型的运算符(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”。
不,您不能为内置类型重载运算符。不,更改运算符的语义(通常)不是一个好主意。
您可以:
double
。