From 6f6ff0e39eb6d771ef5336394079646ccdc18bd5 Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Tue, 7 Nov 2017 15:44:40 +0100 Subject: Use Zarith instead of Num for computing numbers --- dataType.ml | 127 +++++++++++++++++------------------------------------------- 1 file changed, 36 insertions(+), 91 deletions(-) (limited to 'dataType.ml') diff --git a/dataType.ml b/dataType.ml index 2fcbd0d..b6c4fd0 100755 --- a/dataType.ml +++ b/dataType.ml @@ -21,97 +21,40 @@ end module Num = struct - type t = - | NAN - | N of Num.num - - let nan = NAN - - let of_num n = N n - - let zero = Num.num_of_int 0 - - let to_num = function - | NAN -> zero - | N n -> n - - let eq v1 v2 = match v1, v2 with - | N n1, N n2 -> Num.eq_num n1 n2 - | _, _ -> false - - let neq a b = not (eq a b) - - let lt v1 v2 = match v1, v2 with - | N n1, N n2 -> Num.lt_num n1 n2 - | N x, NAN -> Num.lt_num x (zero) - | NAN, N x -> Num.lt_num (zero) x - | NAN, NAN -> false - - let le v1 v2 = match v1, v2 with - | N n1, N n2 -> Num.le_num n1 n2 - | N x, NAN -> Num.le_num x (zero) - | NAN, N x -> Num.le_num (zero) x - | NAN, NAN -> false - - let gt v1 v2 = match v1, v2 with - | N n1, N n2 -> Num.gt_num n1 n2 - | N x, NAN -> Num.gt_num x (zero) - | NAN, N x -> Num.gt_num (zero) x - | NAN, NAN -> false - - let ge v1 v2 = match v1, v2 with - | N n1, N n2 -> Num.ge_num n1 n2 - | N x, NAN -> Num.ge_num x (zero) - | NAN, N x -> Num.ge_num (zero) x - | NAN, NAN -> false - - let add v1 v2 = match v1, v2 with - | N n1, N n2 -> N (Num.add_num n1 n2) - | n1, NAN -> n1 - | NAN, n1 -> n1 - - let mult v1 v2 = match v1, v2 with - | N n1, N n2 -> N (Num.mult_num n1 n2) - | _, _ -> N zero - - let div v1 v2 = match v1, v2 with - | N n1, N n2 -> N (Num.div_num n1 n2) - | _, N _ -> N zero - | _, _ -> raise Division_by_zero - - let sub v1 v2 = match v1, v2 with - | N n1, N n2 -> N (Num.sub_num n1 n2) - | v, NAN -> v - | NAN, N n -> N (Num.minus_num n) - - let pow v1 v2 = match v1, v2 with - | N n1, N n2 -> N (Num.power_num n1 n2) - | _, NAN -> N (Num.num_of_int 1) - | NAN, _ -> N zero - - let rnd () = N ( - Num.div_num - (Num.num_of_int @@ Int32.to_int @@ Random.int32 Int32.max_int) - (Num.num_of_int @@ Int32.to_int @@ Int32.max_int) - ) - - let min v1 v2 = match v1, v2 with - | N n1, N n2 -> N (Num.min_num n1 n2) - | NAN, x -> x - | x, NAN -> x - - let max v1 v2 = match v1, v2 with - | N n1, N n2 -> N (Num.max_num n1 n2) - | NAN, x -> x - | x, NAN -> x - - let abs = function - | NAN -> NAN - | N n1 -> N (Num.abs_num n1) - - let neg = function - | NAN -> NAN - | N n1 -> N (Num.minus_num n1) + let rnd () = + let value = Random.bits () in + Q.make (Z.of_int value) (Z.of_int (1 lsl 30)) + + include Q + + let eq = Q.equal + + let neq a b = not (Q.equal a b) + + let mult = Q.mul + + let floor f = Q.of_bigint (Q.to_bigint f) + + let ge = Q.geq + + let ge = Q.geq + + let le = Q.leq + + let pow t q_factor = + let factor = Q.to_int q_factor + and num = Q.num t + and den = Q.num t in + + Q.make (Z.pow num factor) (Z.pow den factor) + + let gcd t1 t2 = + Q.of_bigint @@ Z.gcd (Q.to_bigint t1) (Q.to_bigint t2) + + let lcm t1 t2 = + Q.of_bigint @@ Z.lcm (Q.to_bigint t1) (Q.to_bigint t2) + + let is_integer t = (Q.den t) == Z.one end @@ -135,3 +78,5 @@ module String = struct include Comparable end + +module Date = Date.Make(Num) -- cgit v1.2.3