浮点断言里出现rel和abs,容易被读成两项都必须满足。pytest的approx文档给出的关系却是“或者”:同时指定相对与绝对容差时,只要满足其中一种,两个数字就会被视为在允许误差内相等。理解这一点,需要把容差之间的关系与容差取值分别看待。
官方先用0.1加0.2与0.3的比较解释问题:人直觉认为相等的数,在浮点表示下未必通过严格相等比较。approx的用途,是在一定容差内进行比较。这个背景说明它改变的是断言接受差异的条件,并没有宣布底层数字已经变成完全相同的表示。
默认相对容差是预期值的一百万分之一,即1e-6。文档又为接近零的情形设置默认绝对容差1e-12,因为以零为参照谈相对接近,会出现只有零本身符合的情况。两者分别从相对比例与绝对差值表达允许范围;这些默认数值是接口说明,不能当成某个工程项目的合理误差标准。
参数组合还会改变判定口径。若只写abs而没有写rel,官方明确说完全不考虑相对容差。也就是说,符合默认相对容差并不再提供另一条通过路径。若两项都显式指定,则恢复为满足任意一项即可,而不是把两项改成同时成立。
原文的三个例子把差别集中在同一对数上:预期值为1、比较值为1加1e-8。默认approx给出True;仅指定abs为1e-12时给出False;同时指定rel为1e-6和abs为1e-12,又给出True。这里转述的是文档列出的结果,本文没有运行测试,也没有把这一组数用作读者项目的验收条件。
因此,审阅一条浮点断言,不能只摘下“允许误差”四个字。它使用默认参数、只给绝对容差,还是明确给出两项,都会影响绿色结果所表达的内容。保留expected与实际参数组合,才能解释为什么相同数字在两种写法下结果不同。本篇只采用当前读取的pytest stable参考文档容差段,不推断真实套件覆盖程度,也不为测量、财务或生产系统选择阈值。
信息来源
本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。