Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Clojure - Calculate with big numbers

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)).

like image 899
Sawny Avatar asked Oct 10 '12 19:10

Sawny


3 Answers

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))
like image 62
mtyaka Avatar answered Jan 27 '23 12:01

mtyaka


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

(reduce * (range 1N 1001N))
like image 33
Hamza Yerlikaya Avatar answered Jan 27 '23 13:01

Hamza Yerlikaya


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)))
like image 29
noahlz Avatar answered Jan 27 '23 12:01

noahlz