当前位置: 首页 > news >正文

Catch2 中对浮点数进行比较

在 Catch2 中对浮点数进行比较

在 Catch2 测试框架中,对浮点数进行比较需要使用专门的浮点比较宏,因为直接使用 == 比较浮点数可能会由于精度问题导致测试失败。以下是 Catch2 中浮点数比较的方法:

基本浮点比较

#include <catch2/catch.hpp>

TEST_CASE("Floating point comparisons") {
    double a = 0.1 + 0.2;
    
    // 近似相等比较
    REQUIRE(a == Approx(0.3));
    
    // 也可以这样写
    REQUIRE(a == 0.3_a);  // C++14 用户定义字面量语法
}

高级浮点比较选项

TEST_CASE("Advanced floating point comparisons") {
    double x = 1.23456;
    
    // 设置相对误差容限
    REQUIRE(x == Approx(1.23).epsilon(0.01));
    
    // 设置绝对误差容限(当值接近0时有用)
    REQUIRE(x == Approx(1.23).margin(0.01));
    
    // 同时设置相对和绝对容限
    REQUIRE(x == Approx(1.23).epsilon(0.01).margin(0.001));
    
    // 设置比例因子(默认1.0)
    REQUIRE(x == Approx(1.23).scale(100.0));
}

比较两个浮点数的相对误差

TEST_CASE("Relative error comparison") {
    double computed = 100.0;
    double expected = 101.0;
    
    // 允许1%的相对误差
    REQUIRE(computed == Approx(expected).epsilon(0.01));
}

注意事项

  1. Approx 默认的 epsilon 值是 std::numeric_limits<float>::epsilon()*100
  2. 比较时会同时考虑相对误差和绝对误差
  3. 对于接近0的值,相对误差比较可能不适用,此时应使用 margin 设置绝对误差容限
  4. Catch2 v3.x 版本中这些功能仍然可用,但语法可能略有不同

Catch2 v3.x 中的浮点比较

在 Catch2 v3.x 中,语法基本保持一致:

#include <catch2/catch_all.hpp>

TEST_CASE("Floating point in Catch2 v3") {
    double a = 0.1 + 0.2;
    REQUIRE_THAT(a, Catch::Matchers::WithinRel(0.3));
    // 或
    REQUIRE(a == Catch::Approx(0.3));
}

使用这些专门的浮点比较方法可以避免由于浮点精度问题导致的测试失败,使测试更加健壮。

相关文章:

  • Kingbase逻辑备份与恢复标准化实施文档
  • AI图像生成
  • MCU选型的五大维度--助力嵌入式产品设计
  • QT样式表实现一键换肤
  • Windows下 Eigen3 安装
  • 定制一款国密浏览器(4):修改浏览器logo
  • C++23 多维下标运算符:探索 P2128R6 提案
  • AI领域再突破,永洪科技荣获“2025人工智能+创新案例”奖
  • SpringBoot集成阿里云文档格式转换实现pdf转换word,excel
  • GO语言入门-反射5(结构体的Tag)
  • 第二章 Python爬虫篇—数据解析与提取
  • Python学习笔记(三)
  • Active Directory 域服务
  • <C#>在 .NET 开发中,依赖注入, 注册一个接口的多个实现
  • react从零开始的基础课
  • 【VSCode配置】运行springboot项目和vue项目
  • 精准测试背后的关键技术:电机试验平台(北重数控滑台设计专业)
  • STM32 模块化开发指南 · 第 2 篇 如何编写高复用的外设驱动模块(以 UART 为例)
  • 程序化广告行业(77/89):融资、并购与上市全景洞察
  • UE的AI判断队伍归属的机制:IGenericTeamAgentInterface接口
  • 电脑系统重装wordpress/郑州seo公司排名
  • 大连网站排名/互动营销是什么意思
  • 如何创新网站建设模式/seo快速排名优化方式
  • 网站建设实验报告手写/网站优化排名的方法
  • 徐家汇网站建设/网站设计模板
  • 如何推销企业建设网站/上海正规seo公司