通过忽略golang中的最后一位来比较浮点数

时间:2017-09-10 02:58:27

标签: go floating-point

规范如下:

  

如果它们的最后数字不同,它仍然认为实数相等   二进制数字。

我想在Go中实现这种比较float64数据类型的浮点数的方法。不幸的是,没有为浮点数定义按位运算符。有没有办法在Go语言中实现这种比较浮点数的方式?

2 个答案:

答案 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

https://play.golang.org/p/unRkkoe6wb

答案 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
}

大多数情况下说它们的尾数最低位不一样。

如果ab是NaN,零或无穷大,此代码不起作用,但如果您愿意,可以添加特殊情况。

请参阅https://randomascii.wordpress.com/2012/01/23/stupid-float-tricks-2/