Clojure在功能时会减少溢出,但直接传递到REPP中时不会减少溢出



我在调试溢出的溢出方面遇到了很大的麻烦,显然只有在函数中使用该语句时才会发生。

这是我拥有的功能:

(defn sum-records
    [senset votemap]
    (let [voteset (select-keys votemap senset)]
        (reduce (fn [v1 v2] (mapv + v1 v1)) (vals voteset))))

问题似乎来自reduce。但是,当我在数据中自行运行该行时,它的工作原理非常好。我已经检查了以确保我正在使用AT测试的数据确实与功能中voteset的数据相同。我什至已经在该功能中插入了println语句以验证这一点。

我真的被困在这里,非常感谢您的任何帮助!

您可能有一个整数溢出:

 (reduce (fn [v1 v2] (mapv + v1 v1)) (repeat 1000 (range 10)))
 => ArithmeticException integer overflow  clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)

您必须确保输入数据是其他的,或在+函数中施放到BIGINT,或使用@CloJuromostly指出的,该 '支持任意精度。

所有这些方法都起作用:

  (reduce (fn [v1 v2] (mapv +' v1 v1)) (repeat 1000 (range 0 10)))
   => [0N 535754303593133660474212524...
  (reduce (fn [v1 v2] (mapv + v1 v1)) (repeat 1000 (range 0N 10N)))
   => [0N 535754303593133660474212524...
  (reduce (fn [v1 v2] (mapv + v1 v1)) (repeat 1000 (map bigint (range 10))))
   => [0N 5357543035931336604742125245300009052...
  (reduce (fn [v1 v2] (mapv #(+ (bigint %1) (bigint %2)) v1 v1)) (repeat 1000 (range 10)))
   => [0N 53575430359313366...

最新更新