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

欢迎!有关此工作方式的信息,请参阅关于页面。

0
Java 互操作
这个问题与 CLJ-1036 密切相关,但有建议要创建一个新的问题。

问题在于对于浮点数 {{f}} 和双精度数 {{d}},我们可以有 {{(= f d)}} 但没有 {{(= (hash f) (hash d))}} 的现象,这破坏了哈希/等价一致性的一项基本假设,导致出现如下奇怪的情况(来自 Immo Heikkinen 发给 Clojure 邮件列表的邮件)


(= (float 0.5) (double 0.5))
=> true
(= #{(float 0.5)} #{(double 0.5)})
=> true
(= {:a (float 0.5)} {:a (double 0.5)})
=> true
(= #{{:a (float 0.5)}} #{{:a (double 0.5)}})
=> false


解决这个问题的一种方法是对浮点数和/或双精度数的哈希进行微调,但这种建议显然已被拒绝。

另一种方法是修改 {{=}},使其在浮点数/双精度数比较中永远不会返回 true。实际上,决不应该使用 {{=}} 来比较浮点数与双精度数,因此这种更改应该对恢复哈希/等价一致性的影响最小。

1 答案

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