一般单元测试中的浮点比较
Floating point comparison in general unit tests
我知道这个问题已经讨论了很多。我在网上搜索了一下,自己想出了一个算法。我想知道它是否可以作为一个默认实现,在一般的单元测试(而不是一些严肃/专业的数字测试)中运行良好。
bool equal_to(double x, double y) {
using limits = std::numeric_limits<double>;
auto mag_x = std::abs(x);
auto mag_y = std::abs(y);
if (mag_x < mag_y) {
std::swap(x, y);
std::swap(mag_x, mag_y);
}
auto eps = limits::epsilon() * mag_x;
auto lb = x - eps;
auto ub = x + eps;
return lb < y && y < ub;
}
只是发现了一个缺陷。最后一个语句应该是
return (x == y) || (lb < y && y < ub);
在equal_to(0, 0);
不,这还不够。您的eps
太低,可能应该乘以用于生成x
和y
的步骤数(尽管这些错误通常会取消,但这并不能保证)。
此外,灾难性的取消可能会放大您的舍入效应。如果x
大约是0.1,因为它被计算为10.0 - 9.9
,那么您应该使用limits::epsilon * (10+9.9)
。你过于乐观了100倍。
相关文章:
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 用于交叉编译和CMake的预处理器宏的单元测试
- C++ 用于单元测试的模板模板
- 提升 1.64 单元测试编译失败
- 单元测试欧拉到四元数实现失败
- 运行 C++ 单元测试时LNK2005链接错误
- 禁用自动捕获 Googletest 单元测试中的C++异常
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- 使用 Google Test 对自定义断言函数进行单元测试
- 如何将我的 CMake 项目配置为运行所有单元测试?
- 在单元测试中,如何在不使用 operator== 的情况下比较两个对象,这可能会错过新成员?
- 如何最好地将C++中的两个数组与单元测试进行比较,以验证它们是否匹配
- CATCH 单元测试C++比较 std::array
- 如何在VS2013上比较两个迭代器进行单元测试
- 如何在提升单元测试中比较字符*与字符串
- 如何在Qt单元测试中比较数组
- 一般单元测试中的浮点比较
- 在c++中创建未命名容器,以便在单元测试中进行临时比较