我在调试溢出的溢出方面遇到了很大的麻烦,显然只有在函数中使用该语句时才会发生。
这是我拥有的功能:
(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...