I'm getting a strange result using ocamlopt that seems to violate the basic axioms of integer division. Some context first: taostein@~/b2/f2: which ocamlopt /Users/taostein/.opam/4.02.1/bin/ocamlopt taostein@~/b2/f2: ocamlopt -o foo.opt foo.ml taostein@~/b2/f2: which ocamlc /Users/taostein/.opam/4.02.1/bin/ocamlc taostein@~/artcode/b2/f2: ocamlc -o foo foo.ml Built with ocamlopt, the following code throws an exception. Built with ocamlc it does not. let k1 = 1;; let rec f i k = if (((i / k1) * k1 + (i mod k1)) <> i) then (raise (Failure "violation of integer division axiom")) else (if (i < 10) then (f (i + 1) k) else ()) in f 0 1;; Now, if I change the above only on line 3 changing k1 to k, then it works fine, no problem. let k1 = 1;; let rec f i k = if (((i / k) * k + (i mod k)) <> i) then (raise (Failure "violation of integer division axiom")) else (if (i < 10) then (f (i + 1) k) else ()) in f 0 1;; No exception in either ocamlc or ocamlopt. Using ocamlopt, it seems 1 mod 1 = 1. This is problematic. Tao Stein / 石涛