到目前为止,我已经看到很多关于浮点数相等的帖子.对于"我们应该如何决定x和y是否相等?"这样的问题的标准答案.是
abs(x - y) < epsilon
其中epsilon是一个固定的小常数.这是因为"操作数"x和y通常是涉及舍入误差的某些计算的结果,因此标准相等运算符==不是我们的意思,我们应该问的是x和y是否接近,不相等.
现在,我觉得如果x与y"几乎相等",那么x*10 ^ 20也应该与y*10 ^ 20"几乎相等",因为相对误差应该是相同的(但是"相对的" "到底是什么?" 但是对于这些大数字,上述测试将失败,即该解决方案不会"扩展".
你会如何处理这个问题?我们应该重新调整数字还是重新调整epsilon?怎么样?(或者我的直觉是错的吗?)
这是一个相关的问题,但我不喜欢它接受的答案,因为reinterpret_cast对我来说似乎有点棘手,我不明白发生了什么.请尝试提供简单的测试.
这一切都取决于具体的问题领域.是的,在一般情况下使用相对误差会更正确,但由于它涉及额外的浮点除法,因此效率可能会大大降低.如果您知道问题中数字的大致比例,则可以使用绝对误差.
本页概述了许多用于比较浮点数的技术.它还涉及许多重要问题,例如具有次正规,无穷大和NaN的问题.这是一个很好的阅读,我强烈建议你一直阅读.
作为替代解决方案,为什么不只是舍入或截断数字然后进行直接比较呢?通过提前设置有效位数,可以确定该范围内的准确性。