我被要求测试第 3 方提供的库。已知该库精确到n 个有效数字。任何不太重要的错误都可以安全地忽略。我想写一个函数来帮助我比较结果:
def nearlyequal( a, b, sigfig=5 ):
此函数的目的是确定两个浮点数(a 和 b)是否近似相等。如果 a==b(完全匹配)或者如果 a 和 b 在以十进制形式写入时舍入到sigfig有效数字时具有相同的值,则该函数将返回 True。
任何人都可以提出一个好的实施方案吗?我写了一个迷你单元测试。除非您可以在我的测试中看到错误,否则一个好的实现应该通过以下内容:
assert nearlyequal(1, 1, 5)
assert nearlyequal(1.0, 1.0, 5)
assert nearlyequal(1.0, 1.0, 5)
assert nearlyequal(-1e-9, 1e-9, 5)
assert nearlyequal(1e9, 1e9 + 1 , 5)
assert not nearlyequal( 1e4, 1e4 + 1, 5)
assert nearlyequal( 0.0, 1e-15, 5 )
assert not nearlyequal( 0.0, 1e-4, 6 )
补充笔记:
- 值 a 和 b 可能是 int、float 或 numpy.float64 类型。值 a 和 b 将始终属于同一类型。转换不会在函数中引入额外的错误,这一点至关重要。
- 让我们保留这个数字,因此转换为字符串或使用非数学技巧的函数并不理想。该程序将由数学家审核,他希望能够证明该函数完成了它应该做的事情。
- 速度...我必须比较很多数字,所以越快越好。
- 我有 numpy、scipy 和标准库。其他任何东西对我来说都很难得到,尤其是对于项目的一小部分。