diff options
| author | Sébastien Dailly <sebastien@chimrod.com> | 2017-11-07 15:44:40 +0100 | 
|---|---|---|
| committer | Sébastien Dailly <sebastien@chimrod.com> | 2017-11-08 14:05:56 +0100 | 
| commit | 6f6ff0e39eb6d771ef5336394079646ccdc18bd5 (patch) | |
| tree | f06907f88972e8e87c5924de8eb225362a4a775b /dataType.ml | |
| parent | 50c16c8fc79d349f9db9d7975d1ae4e57050b648 (diff) | |
Use Zarith instead of Num for computing numbers
Diffstat (limited to 'dataType.ml')
| -rwxr-xr-x | dataType.ml | 127 | 
1 files changed, 36 insertions, 91 deletions
| 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)
 | 
