testthat::expect_equal公差设置不生效问题咨询
问题分析与解决方案
这不是testthat的bug,而是对tolerance参数的认知偏差——testthat的expect_equal()默认使用相对公差,而非你直觉中的绝对公差。
具体计算验证
你的实际值与预期值的绝对差为:0.00020237234 - 0.00020237230 = 4e-10
当使用默认或手动设置tolerance=1e-8时,testthat会按照以下逻辑判断是否通过:绝对差 <= tolerance * max(绝对值(实际值), 绝对值(预期值))
代入数值计算允许的最大差异:1e-8 * 0.00020237234 ≈ 2.0237e-12
显然4e-10远大于2.0237e-12,因此测试失败。
为什么tolerance=1e-6能通过?
当设置tolerance=1e-6时,允许的相对差异为:1e-6 * 0.00020237234 ≈ 2.0237e-10
由于R中十进制数转二进制浮点数存在微小精度偏差,你的实际差异可能恰好略小于这个值,因此测试通过。但这种设置属于“碰巧覆盖需求”,并非针对绝对差的合理配置。
正确的解决方案
方案1:使用绝对公差判断
如果你想基于固定数值的差异判断,设置scale=1,此时tolerance代表允许的最大绝对差异:
expect_equal(Gamma, 0.0002023723, tolerance = 1e-9, scale = 1)
这个设置下,允许的绝对差是1e-9,你的4e-10远小于该值,测试会正常通过。
方案2:调整相对公差适配需求
计算所需的相对公差:4e-10 / 0.00020237234 ≈ 1.9765e-6,因此设置tolerance=2e-6也能通过测试:
expect_equal(Gamma, 0.0002023723, tolerance = 2e-6)
内容的提问来源于stack exchange,提问作者user3517677
相关产品推荐
相关产品推荐

