为什么在go标准库中直接比较浮点数?[已关闭]

x7yiwoj4  于 2023-02-14  发布在  Go
关注(0)|答案(1)|浏览(116)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

昨天关门了。
Improve this question
在golang标准源代码中,文件:源代码/数学/尺寸.go

func max(x, y float64) float64 {
    // special cases
    switch {
    case IsInf(x, 1) || IsInf(y, 1):
        return Inf(1)
    case IsNaN(x) || IsNaN(y):
        return NaN()
    case x == 0 && x == y:
        if Signbit(x) {
            return y
        }
        return x
    }
    if x > y {
        return x
    }
    return y
}

相关:https://floating-point-gui.de/errors/comparison/

dbf7pr2w

dbf7pr2w1#

您链接到的页面似乎建议您应该避免比较浮点数。原因是如果您根据两个浮点数中的哪一个大于另一个来做两件截然不同的事情,那么如果这两个数字几乎相等但不完全相等,您可能会感到惊讶,因为舍入误差可能意味着其中一个比另一个大,这在某种程度上是您无法预料的。
请注意,只有在比较两个非常接近的浮点数时,您可以做两件非常不同的事情时,这才是一个问题。
max的这种实现之所以可以接受,是因为当浮点数彼此非常接近时,您最终会执行两个彼此也非常接近的操作(返回其中一个),因此不会出现任何不连续性问题。
注意,你仍然会得到意想不到的行为,比如max(0.15 + 0.15, 0.1 + 0.2) == 0.3可能是false,但这不是max函数的问题,问题在于你对结果的处理。

相关问题