2024 年 Clojure 调查问卷 中分享您的想法!

欢迎!请访问 关于 页面以了解该平台更多详细信息。

0 投票
Java Interop

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 投票
by

由 alexmiller 发表的评论:

">{{mod}} 是基于 {{rem}} 的 - 从表面上来看,{{mod}} 似乎没有对任何溢出情况给予适当的考虑,我怀疑这是许多问题的根源。

0 投票
by

由 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 报告)
...