比较浮点数的相等计算输出

时间:2019-11-20 08:15:16

标签: c++ floating-point compare

两个计算的输出应该与下面描述的相同,但是即使考虑到机器精度,它们的输出也不相等。如何使他们平等?

id, name, types

,输出为-

SELECT JSON_EXTRACT(types, '$.*') FROM person where types is not null and JSON_EXTRACT(types, '$.*') like "%M3CDgTUx7UXSv0nj1pRSHf8gqLrJv4nMEP0l0A7X%"

两个数字之间的差大于机器精度。

关键问题是是否有通用的方法来处理这些方面或解决方案必须依赖于应用程序?

1 个答案:

答案 0 :(得分:1)

有两点要考虑:

  • 首先,可能的舍入误差(由有限的机器精度引起)随用于计算该值的操作数成比例。例如,存储sapply的结果可能会引入一些舍入误差(取决于实际值),将该值乘以某值还会使该舍入误差相乘,并在该值之上添加另一个可能的舍入误差(通过存储结果)。
  • 第二个浮点值不是线性存储的(相反,它们使用指数和尾数格式):实际值越大,该值与下一个可表示值之间的差就越大(因此也可能的舍入误差)。 m1/m2仅说明std::numeric_limits<T>::epsilon()与下一个可表示的值之间的差,因此,如果您的值不完全等于1.0,则此epsilon不能完全表示机器精度(表示:此值以及该值的下一个可表示的值。

因此,回答您的问题:解决方案是选择一个依赖于应用程序的合理最大舍入误差,该误差允许两个值仍然被认为相等。由于允许的舍入误差取决于预期值和操作数(当然,以及应用程序本身可以接受的操作数),因此不可能实现真正的通用解决方案。