使用reduce函数的Clojure整数溢出

问题描述 投票:0回答:1

不幸的是,我的代码给了我一个整数溢出异常。

(defn even-fib-sum [n]
   (reduce + 
      (filter even? 
         (take n (map first (iterate (fn [[x y]] [y (+ x y)]) [0 1]))))))

当我调用函数并传递值 4000000 时出现问题

(even-fib-sum 4000000) -> throws exception

(even-fib-sum 40) -> 82790070 
clojure
1个回答
7
投票

使用

+'
而不是
+
来将自动促销添加到大整数

(reduce +' 
   (filter even? 
     (take n (map first (iterate (fn [[x y]] [y (+' x y)]) [0 1])))))

Cloujure 默认使用 long 并将溢出视为错误。在该语言的早期阶段,自动升级是默认设置,直到人们普遍认为溢出 long 几乎总是一个错误,除非人们明确知道他们想要它,所以它被更改了,并且

+'
添加 *'
-'
运算符是为了人们明确选择它们的情况

© www.soinside.com 2019 - 2024. All rights reserved.