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的错误。我没有看出这些值有什么特殊之处,怀疑如果扫描的话会很容易找到其他错误。

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](https://clojure.atlassian.net/browse/CLJ-1960)(由 alex+import 报告)
...