You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pytest.approx的rel参数设计逻辑、计算规则与适用场景是什么

rel参数的容差计算规则

你提到的容差计算逻辑基本正确,pytest内部对rel(相对容差)的判断逻辑为:
当两个数a和b对比时,满足以下条件即判定相等:
abs(a - b) <= max(rel * max(abs(a), abs(b)), abs)
其中abs是传入的绝对容差参数,默认值为1e-12。

对应你给出的示例:
a=1e-6,b=2e-6,差值为1e-6;当rel=1e-6时,max(abs(a),abs(b))为2e-6,乘以rel后允许的误差上限为2e-12,远小于实际差值1e-6,因此返回False。
而当使用abs=1e-6时,允许的误差上限为1e-6,刚好等于实际差值,因此返回True。


设计rel参数的意义

rel即相对容差,核心是解决绝对容差无法适配不同量级数值校验的问题:

  • 绝对容差abs是固定的误差范围,不管对比的数值是1e-9还是1e9,都只允许固定的误差,在数值量级跨度大的场景下非常不灵活。
  • 相对容差rel的误差范围会随对比数值的量级自动缩放,数值越大允许的绝对误差越大,数值越小允许的绝对误差越小,更符合大多数场景下对「精度」的认知。

rel参数的适用场景

  • 数值量级跨度大的测试场景:比如电商系统的订单金额测试,金额范围可能从几元到上百万元,用rel=1e-3就可以统一满足「误差不超过千分之一」的要求,不需要为不同金额段设置不同的abs参数。
  • 精度要求符合相对误差规范的场景:很多工程、科研、金融领域的精度要求本身就是以相对误差定义的,比如传感器精度要求不超过0.1%,直接设置rel=1e-3即可直接对应需求,不需要额外换算。
  • 极大/极小数值的测试场景:比如校验1e9量级的数值时,abs=1e-6的设置完全没有实际意义,哪怕数值差了1,绝对误差远大于1e-6,但相对误差仅为1e-9,完全符合精度要求,此时用rel会更合理。

内容的提问来源于stack exchange,提问作者anilbey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:45:03