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

欢迎!请参阅关于页面以获取更多关于此如何工作的信息。

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 Bug的继承。我在选择的值中看不到任何特殊之处,并且我怀疑在扫描之下可能很容易找到其他问题。

4 答案

0

评论由:alexmiller发布

{{mod}}基于{{rem}} - 从表面上看,{{mod}}似乎没有正确处理任何溢出情况,我怀疑这是许多此类问题的根源。

0

评论由:gfredericks发布

Test.check表明(mod 6.7772677936779424E16 23) => -8.0可能是最小的。

0

评论者:vaguery

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

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