12

I want to calculate !1000 in clojure, how can I do this without getting a integer-overflow exception?

My factorial code is right now: (reduce * (range 1 1001)).

Sawny
  • 1,404
  • 2
  • 14
  • 31

3 Answers3

24

You could use the *' operator which supports arbitrary precision by automatically promoting the result to BigInt in case it would overflow:

(reduce *' (range 1 1001))
mtyaka
  • 8,670
  • 1
  • 38
  • 40
6

Put N at the end of the number which makes it a bigint,

(reduce * (range 1N 1001N))
Hamza Yerlikaya
  • 49,047
  • 44
  • 147
  • 241
2

Coerce the parameters to clojure.lang.BigInt

(reduce * (range (bigint 1) (bigint 1001)))

I.e. if you are working with an third-party library that doesn't use *'

(defn factorial' [n]
   (factorial (bigint n)))
noahlz
  • 10,202
  • 7
  • 56
  • 75