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

Hel*_*oCW 6 kotlin

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

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

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

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

DPM*_*DPM 4

为了进一步扩展我的评论并使其更加准确,文档为您提供了关键。

数学.cos(双精度)

计算结果与准确结果的误差必须在 1 ulp 以内。结果必须是半单调的。

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

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

由此可见,计算不会停止的唯一方法是这些数字之一的输入将为您提供另一个数字。但由于该函数是半单调的,这意味着这种情况不可能发生。否则,您会将两者中较高的值作为输入,将较低的值作为输出,而较低的值将较高的值作为输出。半单调意味着它只朝一个方向发展(说得非常简单,但有些不准确)。