是否有处理浮点不准确的通用最佳实践策略?
我正在从事的项目试图通过将所有内容包装在一个包含浮点值并重载运算符的 Unit 类中来解决这些问题。如果数字“足够接近”,则数字被认为是相等的,> 或 < 之类的比较是通过与稍低或稍高的值进行比较来完成的。
我理解封装处理此类浮点错误的逻辑的愿望。但是鉴于这个项目有两种不同的实现方式(一种基于被比较的数字的比率,一种基于绝对差异)并且我被要求查看代码,因为它没有做正确的事情,该策略似乎成为一个坏人。
那么尝试确保处理程序中所有浮点不准确的最佳策略是什么?
最佳答案
一般情况下,您希望数据尽可能不透明。行为和数据是两个应该分开的问题。
在我看来,最好的方法是根本不开设单元类(class)。如果您必须拥有它们,那么请避免重载运算符,除非它必须始终以一种方式工作。通常它不会,即使你认为它会。如评论中所述,例如,它打破了严格的弱排序。
我认为处理它的明智方法是创建一些不与其他任何东西绑定(bind)的具体比较器。
struct RatioCompare {
bool operator()(float lhs, float rhs) const;
};
struct EpsilonCompare {
bool operator()(float lhs, float rhs) const;
};
编写算法的人可以在他们的容器或算法中使用这些。这允许代码重用,而无需要求任何人使用特定策略。
std::sort(prices.begin(), prices.end(), EpsilonCompare());
std::sort(prices.begin(), prices.end(), RatioCompare());
通常试图重载运算符以避免这些事情的人会提示“良好的默认值”等。如果编译器立即告诉您没有默认值,则很容易修复。如果客户告诉您,在您数百万行的价格计算中有什么地方不对劲,那么追踪起来就有点困难了。如果有人在某个时候更改了默认行为,这可能会特别危险。
关于c++ - 处理浮点不准确的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7532049/