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 双精度/MAX_VALUE 1001)}}为1.9958403095347198E292,而(rem 6.7772677936779424E16 23) => -8.0

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