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

欢迎!有关如何操作更多信息,请参阅关于页面。

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

问题在于对于一个浮点数{{f}}和一个double{{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报告)
...