规范如下:
如果它们的最后数字不同,它仍然认为实数相等 二进制数字。
我想在Go中实现这种比较float64数据类型的浮点数的方法。不幸的是,没有为浮点数定义按位运算符。有没有办法在Go语言中实现这种比较浮点数的方式?
答案 0 :(得分:3)
这看起来像是数学包中以下函数的完美用例:
func equal(x, y float64) bool {
return math.Nextafter(x, y) == y
}
Nextafter将x后面的下一个可表示的float64值返回y。
特殊情况是:
Nextafter(x,x)= x
Nextafter(NaN,y)= NaN
Nextafter(x,NaN)= NaN
答案 1 :(得分:2)
如果您想知道两个float64
值是否相邻(也就是说,它们之间没有float64
值):
func almostEqual(a, b float64) bool {
ai, bi := int64(math.Float64bits(a)), int64(math.Float64bits(b))
return a == b || -1 <= ai-bi && ai-bi <= 1
}
大多数情况下说它们的尾数最低位不一样。
如果a
或b
是NaN,零或无穷大,此代码不起作用,但如果您愿意,可以添加特殊情况。
请参阅https://randomascii.wordpress.com/2012/01/23/stupid-float-tricks-2/