aboutsummaryrefslogtreecommitdiff
path: root/dataType.ml
diff options
context:
space:
mode:
Diffstat (limited to 'dataType.ml')
-rwxr-xr-xdataType.ml127
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)