在浏览了这里的几篇文章并进行了搜索之后,有很多比较 float 的好方法。
我有可用的 Boost 库,所以我想使用它。 但是,我无法获得一个简单的示例来说明如何在比较两个 float 时获取 bool 返回值。
例如,他们展示了这样的例子: http://www.boost.org/doc/libs/1_50_0/libs/test/doc/html/utf/testing-tools/reference.html
但这不会返回 bool 值。
伪代码示例:
double a = 1.0;
double b = 0.5+0.5;
double percentage = 0.00001; //0.001 %
//Now I want to use the boost library to do something like this:
bool isClose = check_is_close(a, b, percentage);
我只是找不到如何取回 bool 值的方法。
几年来我主要使用 Java、Python 和 Matlab 工作,所以 C++ 现在对我来说有点像一门外语。
请帮忙!
最佳答案
您必须了解您所指的是 boost 单元测试辅助工具,因此在测试域之外依赖它可能不是一个好主意。
作为旁注,在许多情况下,只需将 float 比较在绝对距离的 epsilon 范围内(例如 1e-6)就足够了。否则,当然,当需要更高的精度时,相对于比较量大小的相对距离是必要的。
But that doesn't return a boolean
是的,它返回 boost::test_tools::predicate_result
但您可以评估并将其转换为 bool 值。
尽管对 boost 测试工具有评论,但如果您确实更喜欢以您提到的方式使用测试库,这里有一个示例:
#include <iostream>
#include <boost/test/floating_point_comparison.hpp>
int main() {
bool b = boost::test_tools::check_is_close(
0.01, 0.015, boost::test_tools::percent_tolerance(49.0));
std::cout << std::boolalpha << b << std::endl; // false
b = boost::test_tools::check_is_close(
0.01, 0.015, boost::test_tools::percent_tolerance(51.0));
std::cout << std::boolalpha << b << std::endl; // true, 51% tolerance is enough to ignore the difference
}
如果您需要实现更简单的比较,您始终可以按照以下方式自行推出:
#include <cmath>
bool is_close(double a, double b, double epsilon = 1e-5) {
return std::fabs(a - b) < epsilon;
}
关于c++ - 使用 Boost float 比较获取 bool 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21868358/