对double进行重载比较以允许出现数字错误
Overloading comparison for double to allow for numerical error
在我的C++项目中,由于数值错误,我经常遇到不精确的结果。是否可以以某种方式重新定义标准比较运算符(==
、<=
、>=
、<
、>
),使它们不进行精确比较,但在可接受的误差范围内(例如1e-12
)?
(如果是,这样做是个好主意吗?)
(当然,人们可以编写比较函数,但人们直观地使用运算符。)
若要重载运算符,某些参数必须是用户定义的类型。内置的是固定不变的。
但即使你可以,这也不是一件好事。帮你自己一个忙,提供你的自定义比较"运算符"作为一组函数,选择一个暗示他们使用的策略的名称。在没有适当指示的情况下,你不能指望代码阅读器知道相等意味着严格,或者DBL_EPSILON或2*DBL_EPSIL或一些任意的线性或缩放公差。
不能重载标准类型(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"替换为"floating"。
否,不能重载内置类型的运算符。不,改变运算符的语义(一般来说)不是一个好主意。
你可以:
- 使用比较函数(根据您自己的建议)
- 围绕具有所需运算符的
double
成员编写一个包装类
相关文章:
- 我想做一个彼此不同但重复出现的数字
- 整数区间(或 int 数组)中每个数字的出现次数
- 如何计算给定数字在二叉树中出现的次数?
- 查找数组中给定数字的出现次数
- 使用用户定义的函数查找数字的幂时出现问题
- 如何使数组以单词而不是数字的形式出现
- 子数组中两个数字的相同出现(连续)
- 如何使用 c++ 中的 int* count(const string&s)计算字符串中每个数字的出现次数?
- 如何可视化这些未出现的数字.(C++)
- 计算数字范围内特定数字的出现次数
- 计算字符串S中所有数字的出现数量
- 显示从 1 到 9 的数字在二维数组中出现的次数
- 快速读取带有数字 c++ 的二进制文件时出现问题
- 向量中出现第 N 个数字
- 连续两次写入数字时出现逻辑错误 (C++)
- 在C++中使用限制和非常大的数字时出现问题
- 删除数组中所有出现的数字 C++
- 编写模式识别'函数以查找特定顺序出现的数字?C++
- 有没有办法让一个函数在第二次出现数字时做一些不同的事情
- 对double进行重载比较以允许出现数字错误