1 
589ccf9f

Corentin Lauverjat

(* (a, b, c) means a * 10^b. c is the original string *)

2 


type t = Num.num * int * string

3 



4 


let pp fmt (c, e, s) =

5 


Format.fprintf fmt "%s%s"

6 


s

7 


(if String.get s (1 + String.length s) = '.' then "0" else "")

8 



9 


let pp_ada fmt (c, e, s) =

10 


Format.fprintf fmt "%s.0*1.0e%i" (Num.string_of_num c) e

11 



12 


let create m e s = Num.num_of_string m, e, s

13 


let create_num n s = n, 0, s

14 



15 


let to_num (c, e, s) =

16 


let num_10 = Num.num_of_int 10 in

17 


Num.(c // (num_10 **/ (num_of_int e)))

18 



19 


let rec to_q (c, e, s) =

20 


if e = 0 then

21 


Q.of_string (Num.string_of_num c)

22 


else

23 


if e > 0 then Q.div (to_q (c,e1,s)) (Q.of_int 10)

24 


else (* if exp<0 then *)

25 


Q.mul

26 


(to_q (c,e+1,s))

27 


(Q.of_int 10)

28 



29 


let to_string (_, _, s) = s

30 



31 


let eq r1 r2 =

32 


Num.eq_num (to_num r1) (to_num r2)

33 



34 



35 


let num_binop op r1 r2 =

36 


let n1 = to_num r1 and n2 = to_num r2 in

37 


op n1 n2

38 



39 


let arith_binop op r1 r2 =

40 


let r = num_binop op r1 r2 in

41 


create_num r (Num.string_of_num r)

42 



43 


let add = arith_binop (Num.(+/))

44 


let minus = arith_binop (Num.(/))

45 


let times = arith_binop (Num.( */))

46 


let div = arith_binop (Num.(//))

47 



48 


let uminus (c, e, s) = Num.minus_num c, e, "" ^ s

49 



50 


let lt = num_binop (Num.(</))

51 


let le = num_binop (Num.(<=/))

52 


let gt = num_binop (Num.(>/))

53 


let ge = num_binop (Num.(>=/))

54 


let diseq = num_binop (Num.(<>/))

55 


let eq = num_binop (Num.(=/))

56 



57 


let zero = Num.num_of_int 0, 0, "0.0"

58 



59 


let is_zero r = Num.eq_num (to_num r) (Num.num_of_int 0)

60 


let is_one r = Num.eq_num (to_num r) (Num.num_of_int 1)
