使用float32作为映射键返回意外结果
package main
import "fmt"
func main() {
result := make(map[float32]map[float32]float32)
var t1 float32 = 1586238540
var t2 float32 = 1586238600
result[t1] = map[float32]float32{1:1,2:2}
result[t2] = map[float32]float32{3:3,4:4}
fmt.Println(result[t1])
fmt.Println(result[t2])
}map[3:3 4:4]
map[3:3 4:4]Go版本:go version go1.14 linux/amd64
将result改为map[float64]map[float32]float32和t1,t2相应地给出了正确的结果。
为什么会有这种奇怪的行为?
发布于 2020-04-07 07:34:24
一个32位浮点数有一个23位尾数,隐含在最高的1位前。所以尾数代表的最大值是2平方⁴-1= 16777215.换句话说,只有-16777215到16777215之间的整数才能被精确地表示为32位浮点数的。
您的两个值1586238540和1586238600超出了该范围,并且都被截断为相同的值1586238592。这个被截断的值被用作地图的键。
发布于 2020-04-07 07:47:28
https://play.golang.org/p/Fx78BbmnXIE、1586238540和1586238600在内存中相同
发布于 2020-04-07 07:58:45
如果将此添加到代码中
fmt.Println(t1)
fmt.Println(t2)您将把1.5862386e+09看作两者的结果,因为对于float32来说,这个值太大了。使用float64,您将看到正确的值打印
1.58623854e+09
1.5862386e+09有关更多信息,维基百科
https://stackoverflow.com/questions/61074776
复制相似问题