我可以比较Kotlin中两个浮点数是否相等吗?

以下代码来自https://kotlinlang.org/docs/reference/functions.html?q=&p=0

此代码计算余弦的固定点,这是一个数学常数。 它只需从1.0开始重复调用Math.cos,直到结果不再变化,产生0.7390851332151607的结果。

在我看来,我们无法比较两个浮点数是否相等,所以我认为if (x == y)的结果总是为false,对吗?

 private fun findFixPoint(): Double { var x = 1.0 while (true) { val y = Math.cos(x) if (x == y) return y x = y } } 

为了进一步扩大我的意见和更加精确,文件给你的关键。

Math.cos(双)

计算结果必须在精确结果的1 ulp以内。 结果必须是半单调的。

ulp是编码的浮点数与下一个可以在数据类型中编码的数字(在本例中为double)之间的差异。

如果结果必须在1 ulp以内,这意味着结果可以是最多两个浮点值之一。

因此,计算不会停止的唯一方法就是如果这些数字中的一个的输入将给你另一个数字。 但是由于函数是半单调的,意味着不可能发生。 否则,你将有两个较高的价值作为输入给你的较低值作为输出,而较低的价值给你一个更高的输出。 半单调意味着它只能朝一个方向走(说得很简单,有些不准确)。

在我看来,我们无法比较两个浮点数是否相等,所以我认为if(x == y)的结果总是为false,对吗?

不,这是错的。 你可以比较两个浮点数是否相等,但是大多是没有意义的。 因为浮点定义不准确。 即使两个不同的计算在数学中也有相同的结果,由于舍入误差,在程序中并不需要相等。 它仍然可能是一个平等的机会。