评论者:jafingerhut
我认为在具有最多 8 个键的映射中查找浮点值是一种实现上的意外。
之所以在大映射和哈希集中失败,是因为双精度浮点数(double 1.0)和单精度浮点数(float 1.0)的哈希值不同。
user=> (hash (float 1.0)) 1065353216 user=> (hash 1.0) 1072693248
所有如 1.0 这样的值默认为双精度类型。请注意,如果您强制将映射的键设置为浮点类型,即使在映射有超过 8 个键的情况下,查找也能成功
user=> (get {(float 1.0) "a" 2.0 "b" 3.0 "c" 4.0 "d" 5.0 "e" 6.0 "f" 7.0 "g" 8.0 "h" 1 "i"} (float 1)) "a"
我的猜测是,除了一小部分映射意外地返回成功查找外,这里的工作都是按照设计进行的。
我认为使用小型地图(ArrayMap实现)查找时找不到(float 1)匹配的原因可能是因为小型地图的实现将查找键与数组中所有键顺序比较,使用clojure.core /=(或其Java等价函数),
用户=> (= (float 1) (double 1)) 真的