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

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

0
Java 互操作

clojure.core/mod 函数在小正浮点被除数和小正整数除数的情况下工作如预期。但今天我在做一些边缘情况测试时遇到了以下无法解释的行为

`
user=> (def big Double/MAX_VALUE)

'user/big

user=> (mod big 10)
0.0
user=> (mod big 100)
0.0
user=> (mod big 1000)
1.9958403095347198E292
user=> (mod big 999)
-Infinity
user=> (mod big 998)
0.0
user=> (mod big 997)
1.9958403095347198E292
user=> (mod big 996)
0.0
user=> (mod big 995)
0.0
user=> (mod big 994)
0.0
user=> (mod big 1001)
1.9958403095347198E292
user=> (mod big 1002)
0.0
user=> (mod big 1003)
0.0
user=> (mod big 1004)
-Infinity
user=> (mod big 1005)
0.0
`

不知道这是否是从 Java 程序错误中继承下来的。我看不出来选择的值有什么特别之处,我怀疑如果是进行扫描,很容易找到其他错误。

4 个答案

0

由 alexmiller 发布的评论

{{mod}} 基于 {{rem}} - 看起来 {{mod}} 并没有正确处理溢出情况,我认为这是许多问题的根源。

0

由 gfredericks 发布的评论

Test.check 建议的 (mod 6.7772677936779424E16 23) => -8.0 接近最小值。

0
by

评论者:vaguery

实际上,刚刚核实,{{rem}} 返回相同的结果。因此,{{(rem Double/MAX_VALUE 1001)}} 的值为 {{1.9958403095347198E292}},而且 (rem 6.7772677936779424E16 23) => -8.0

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