这与问题1555有关,但涉及的数据类型不同,因此潜在问题可能也不同。
`rem`在bigint和float之间似乎返回极其不正确的结果。请注意使用`10000`作为除数与使用`1e4`之间的巨大差异
user> (rem 9037601485536036300227801N 10000)
7801N
user> (long (rem 9037601485536036300227801N 1e4))
1073741824
test.check
提供了一个更清晰的示例,展示了明显不正确的结果
user> (rem 9007199254740993N 2)
1N
user> (rem 9007199254740993N 2.0)
0.0
以下是重现此结果的生成测试
(clojure.test.check/quick-check
100 (prop/for-all [l gen/size-bounded-bigint
r (gen/fmap inc gen/nat)]
(== (rem l (double r))
(rem l (long r)))))