2024 Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面,了解更多关于如何使用本站的信息。

0
Java互操作 作者

在从map中获取浮点数的值时,如果map中包含的值超过8个,则找不到该值。

例如

(get {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)) => nil
(get {1.0 "a" 2.0 "b" 3.0 "c" 4.0 "d" 5.0 "e" 6.0 "f" 7.0 "g" 8.0 "h"} (float 1)) => "a"

5 答案

0
作者

评论由:ashercoren

问题不仅限于maps。

以下是一个与Set的例子
(contains? #{1.0 1.1} (float 1)) => true
(contains? #{1.0 1.1 1.2} (float 1)) => false

0
作者

评论由:jafingerhut

我认为在map中查找float是一个实现上的意外。

之所以在大map和哈希集中失败,是因为(double 1.0)和(float 1.0)的哈希值不同。

user=> (hash (float 1.0)) 1065353216 user=> (hash 1.0) 1072693248

所有类似于1.0的值默认为double类型。请注意,如果您强制将map的键设置为float类型,则即使map中包含的值超过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"

我的猜测是,除了使用小map时的意外之外,其他所有内容都按设计工作。

我认为用小地图(ArrayMap)查找匹配查找项(float 1)可能没有找到匹配的原因,可能是因为小地图的实现是一个数组映射,其中查找键按顺序与数组中的所有键进行比较,使用 clojure.core/=( 或其Java等价实现),以及

用户=> (= (float 1) (double 1)) true

0

评论由:jafingerhut

附加说明:CLJ-1649 是由希望浮点数和双精度数应该具有一致的哈希和 = 的人创建的。您可以在门票的描述中了解更多信息。尚未作出判断,是否会在Clojure中更改此类更改,但如果有Rich在门票CLJ-1036上的任何评论是任何指示,它似乎不太可能更改。

一般建议:如果可能,请勿在Clojure代码中混合浮点数和双精度数。

0

评论由:ashercoren

感谢@Andy!

0
参考:https://clojure.atlassian.net/browse/CLJ-2305(由 alex+import 报告)
...