c++ - 使用 Boost float 比较获取 bool 返回值

标签 c++ boost floating-point boost-test

在浏览了这里的几篇文章并进行了搜索之后,有很多比较 float 的好方法。

比如Boost库: http://www.boost.org/doc/libs/1_34_0/libs/test/doc/components/test_tools/floating_point_comparison.html

我有可用的 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/

相关文章:

boost - 无法使用基于 qnx7.0 的 qcc 为 boost_1.68.0 构建 libboost_filesystem.a

C++ 私有(private)访问其他类的成员

c++ - OpenGL 深度无法按预期工作

c++ - 静态多维数组,编译时维度定义

c++ - 理解 C++ 映射为什么不使用 clear() 释放堆内存?

c++ - Boost IPC 好用吗?

c++ - 在一行中读取文件并写入 cout

c++ - C++ 标准是否对 float 的表示做了任何规定?

c - 在C中添加不同类型的变量

floating-point - OCaml 中的 80 位扩展精度浮点