diff --git a/src_colibri2/theories/FP/dom_interval.ml b/src_colibri2/theories/FP/dom_interval.ml
index 74e7ba821bc28d222ccc98f81fbfe1a88eb04fc9..bc154d4da8e30f09f26ba81c55200966f1295413 100644
--- a/src_colibri2/theories/FP/dom_interval.ml
+++ b/src_colibri2/theories/FP/dom_interval.ml
@@ -20,7 +20,7 @@
 
 open Colibri2_popop_lib
 open Colibri2_core
-open Colibri2_stdlib.Std
+(* open Colibri2_stdlib.Std *)
 
 let debug = Debug.register_info_flag
   ~desc:"for intervals for the arithmetic theory"
@@ -33,7 +33,7 @@ let dom = Dom.Kind.create (module struct type t = D.t let name = "ARITH" end)
 include (Dom.Lattice(struct
     include D
     let equal (x : t) (y : t) = Stdlib.(=) x y
-    let pp _ _ = ()
+    let pp fmt x = Format.fprintf fmt "%s" (D.to_string x)
     let key = dom
     let inter _ d1 d2 = inter d1 d2
     let is_singleton _ d =
@@ -41,39 +41,39 @@ include (Dom.Lattice(struct
   end
 ))
 
-let is_zero_or_positive d n =
+(* let is_zero_or_positive d n =
   match Egraph.get_dom d dom n with
   | None -> false
   | Some p -> match D.is_comparable D.zero p with
     | D.Le | D.Lt -> true
-    | D.Ge | D.Gt | D.Uncomparable -> false
+    | D.Ge | D.Gt | D.Uncomparable -> false *)
 
-let is_not_zero d n =
+(* let is_not_zero d n =
   match Egraph.get_dom d dom n with
   | None -> false
-  | Some p -> D.absent Q.zero p
+  | Some p -> D.absent Q.zero p *)
 
-let is_strictly_positive d n =
+(* let is_strictly_positive d n =
   match Egraph.get_dom d dom n with
   | None -> false
   | Some p -> match D.is_comparable D.zero p with
     | D.Lt -> true
-    | D.Le | D.Ge | D.Gt | D.Uncomparable -> false
+    | D.Le | D.Ge | D.Gt | D.Uncomparable -> false *)
 
-let is_strictly_negative d n =
+(* let is_strictly_negative d n =
   match Egraph.get_dom d dom n with
   | None -> false
   | Some p -> match D.is_comparable D.zero p with
     | D.Gt -> true
-    | D.Le | D.Ge | D.Lt | D.Uncomparable -> false
+    | D.Le | D.Ge | D.Lt | D.Uncomparable -> false *)
 
-let is_integer d n =
+(* let is_integer d n =
   match Egraph.get_dom d dom n with
   | None -> false
-  | Some p -> D.is_integer p
+  | Some p -> D.is_integer p *)
 
 
-module ChoLRA = struct
+(* module ChoLRA = struct
   let make_decision node v env =
     Debug.dprintf4 Debug.decision
       "[LRA] decide %a on %a" D.pp v Node.pp node;
@@ -94,9 +94,9 @@ module ChoLRA = struct
     print_cho = "Decision made by dom_interval.ml";
     }
 
-end
+end *)
 
-let choice = ChoLRA.choice
+(* let choice = ChoLRA.choice *)
 
 let neg_cmp = function
   | `Lt -> `Ge
@@ -110,22 +110,23 @@ let com_cmp = function
   | `Ge -> `Le
   | `Gt -> `Lt
 
-let backward = function
+(* let backward = function
   | `Lt -> D.lt'
   | `Gt -> D.gt'
   | `Le -> D.le'
-  | `Ge -> D.ge'
+  | `Ge -> D.ge' *)
 
 (** {2 Initialization} *)
 let converter d (f:Ground.t) =
   let r = Ground.node f in
   let reg n = Egraph.register d n in
   let open Monad in
-  let setb = setv Boolean.dom in
-  let getb = getv Boolean.dom in
+  (* let setb = setv Boolean.dom in
+  let getb = getv Boolean.dom in *)
   let set = updd upd_dom in
   let get = getd dom in
-  let cmp test cmp a b =
+  let getm = getv Rounding_mode.key in
+  (* let cmp test cmp a b =
     reg a; reg b;
     attach d (
       setb r (let* va = get a and+ vb = get b in
@@ -135,58 +136,73 @@ let converter d (f:Ground.t) =
       set a  (let+ vb = get b and+ vr = getb r in
               backward (if vr then cmp else (neg_cmp cmp)) vb)
     );
-  in
+  in *)
   match Ground.sem f with
-  | { app = {builtin = Expr.Base; _ }; tyargs = _; args = _; ty }
-    when Ground.Ty.equal ty Ground.Ty.real ->
-    (* Egraph.register_decision d (ChoLRA.choice r) *) (* not useful for now *)
-    ()
-  | { app = {builtin = Expr.Base; _ }; tyargs = _; args = _; ty }
-    when Ground.Ty.equal ty Ground.Ty.int ->
-    upd_dom d r D.integers
-  | { app = {builtin = Expr.Add}; tyargs = []; args; _ } ->
-    let (a,b) = IArray.extract2_exn args in
-    reg a; reg b;
-    attach d (
-      set r (let+ va = get a and+ vb = get b in D.add va vb) &&
-      set a (let+ vb = get b and+ vr = get r in D.minus vr vb) &&
-      set b (let+ va = get a and+ vr = get r in D.minus vr va)
-    );
-  | { app = {builtin = Expr.Sub}; tyargs = []; args; _ } ->
-    let (a,b) = IArray.extract2_exn args in
-    reg a; reg b;
+  (* | { app = {builtin = Expr.Real_to_fp (8, 24); _}; args; _} ->
+    let m, r = IArray.extract2_exn args in
+    !< (Farith.B32.of_q !>>m !>>>r) *)
+  (* | { app = {builtin = Expr.Plus_infinity (8, 24); _}; args; _} ->
+    assert (IArray.is_empty args);
+    !< (Farith.B32.infp) *)
+  (* | { app = {builtin = Expr.Minus_infinity (8, 24); _}; args; _} ->
+    assert (IArray.is_empty args);
+    !< (Farith.B32.infm) *)
+  (* | { app = {builtin = Expr.NaN (8, 24); _}; args; _} ->
+    assert (IArray.is_empty args);
+    !< (Farith.B32.(nan true Z.one)) *)
+  (* | { app = {builtin = Expr.Plus_zero (8, 24); _}; args; _} ->
+    assert (IArray.is_empty args);
+    !< (Farith.B32.zerop) *)
+  (* | { app = {builtin = Expr.Minus_zero (8, 24); _}; args; _} ->
+    assert (IArray.is_empty args);
+    !< (Farith.B32.zero true) *)
+  | { app = {builtin = Expr.Fp_add (8, 24); _}; args; _} ->
+    let m, a, b = IArray.extract3_exn args in
+    reg m; reg a; reg b;
     attach d (
-      set r (let+ va = get a and+ vb = get b in D.minus va vb) &&
-      set a (let+ vb = get b and+ vr = get r in D.add vr vb) &&
-      set b (let+ va = get a and+ vr = get r in D.minus va vr)
-    );
-  | { app = {builtin = Expr.Minus}; tyargs = []; args; _ } ->
+      set r (let+ vm = getm m and+ va = get a and+ vb = get b in D.add vm va vb)
+    )
+  (* | { app = {builtin = Expr.Fp_sub (8, 24); _}; args; _} ->
+    let m, a, b = IArray.extract3_exn args in
+    !< (Farith.B32.sub !>>m !>a !>b) *)
+  (* | { app = {builtin = Expr.Fp_mul (8, 24); _}; args; _} ->
+    let m, a, b = IArray.extract3_exn args in
+    !< (Farith.B32.mul !>>m !>a !>b) *)
+  (* | { app = {builtin = Expr.Fp_abs (8, 24); _}; args; _} ->
     let a = IArray.extract1_exn args in
-    reg a;
+    !< (Farith.B32.abs !>a) *)
+  (* | { app = {builtin = Expr.Fp_div (8, 24); _}; args; _} ->
+    let m, a, b = IArray.extract3_exn args in
+    if Farith.B32.(eq !>b (zero true) || eq !>b (zero false)) then `Uninterp
+    else !< (Farith.B32.div !>>m !>a !>b) *)
+  (* | { app = {builtin = Expr.Fp_eq (8, 24); _}; args; _} -> *)
+    (* let a, b = IArray.extract2_exn args in
+    reg a; reg b;
     attach d (
-      set r (let+ va = get a in D.mult_cst Q.minus_one va) &&
-      set a (let+ vr = get r in D.mult_cst Q.minus_one vr)
-    );
-  | { app = {builtin = Expr.Lt}; tyargs = []; args; _ } ->
-    let a,b = IArray.extract2_exn args in
-    cmp (function | Uncomparable | Le -> None | Lt -> Some true | Ge | Gt -> Some false) `Lt a b
-  | { app = {builtin = Expr.Leq}; tyargs = []; args; _ } ->
-    let a,b = IArray.extract2_exn args in
-    cmp (function | Uncomparable | Ge -> None | Lt | Le -> Some true | Gt -> Some false) `Le a b
-  | { app = {builtin = Expr.Geq}; tyargs = []; args; _ } ->
-    let a,b = IArray.extract2_exn args in
-    cmp (function | Uncomparable | Le -> None | Lt -> Some false  | Ge | Gt -> Some true) `Ge a b
-  | { app = {builtin = Expr.Gt}; tyargs = []; args; _ } ->
-    let a,b = IArray.extract2_exn args in
-    cmp (function | Uncomparable | Ge -> None | Lt | Le -> Some false  | Gt -> Some true) `Gt a b
+      set a (let+ va = get a and+ vb = get b and+ vr = getb r in if vr then (D.inter va vb) else va) &&
+      set b (let+ va = get a and+ vb = get b and+ vr = getb r in if vr then &D.inter va vb else vb)
+    ) *)
+    
+  (* | { app = {builtin = Expr.Fp_leq (8, 24); _}; args; _} ->
+    let a, b = IArray.extract2_exn args in
+    !<< (Farith.B32.le !>a !>b) *)
+  (* | { app = {builtin = Expr.Fp_lt (8, 24); _}; args; _} ->
+    let a, b = IArray.extract2_exn args in
+    !<< (Farith.B32.lt !>a !>b) *)
+  (* | { app = {builtin = Expr.Fp_geq (8, 24); _}; args; _} ->
+    let a, b = IArray.extract2_exn args in
+    !<< (Farith.B32.ge !>a !>b) *)
+  (* | { app = {builtin = Expr.Fp_gt (8, 24); _}; args; _} ->
+    let a, b = IArray.extract2_exn args in
+    !<< (Farith.B32.gt !>a !>b) *)
   | _ -> ()
 
 let init env =
-  Daemon.attach_reg_value env
+  (* Daemon.attach_reg_value env
     Float32.key
     (fun d value ->
        let v = Float32.value value in
        let s = D.singleton v in
        Egraph.set_dom d dom (Float32.node value) s
-    );
+    ); *)
   Ground.register_converter env converter
\ No newline at end of file
diff --git a/src_colibri2/theories/FP/dom_interval/extracted.ml b/src_colibri2/theories/FP/dom_interval/extracted.ml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src_colibri2/theories/FP/dom_interval/interval_32.ml b/src_colibri2/theories/FP/dom_interval/interval_32.ml
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src_colibri2/theories/FP/float32.ml b/src_colibri2/theories/FP/float32.ml
index 9e42756c13cd597094b4a1ce907f7649a887edc0..44de3600c9cf5093c0f11da4159c38eb97e1fb7f 100644
--- a/src_colibri2/theories/FP/float32.ml
+++ b/src_colibri2/theories/FP/float32.ml
@@ -214,7 +214,6 @@ let converter d (f:Ground.t) =
     cmp Farith.B32.eq a b; attach_interp d f;
   | _ -> ()
 
-
 let init env =
   Ground.register_converter env converter;
   init_ty env;
diff --git a/src_colibri2/theories/FP/interval_32.ml b/src_colibri2/theories/FP/interval_32.ml
index 242614930f9cc57fbce2750c3cd3ba046a549212..7d3103857bd3c53ffa94b528a0997301970c3fda 100644
--- a/src_colibri2/theories/FP/interval_32.ml
+++ b/src_colibri2/theories/FP/interval_32.ml
@@ -1,4 +1,3 @@
-
 (** val negb : bool -> bool **)
 
 let negb = function
@@ -146,7 +145,7 @@ module Pos =
     compare_cont Eq
  end
 
-module Z =
+module MyZ =
  struct
   (** val double : z -> z **)
 
@@ -321,12 +320,12 @@ type spec_float =
 (** val emin : z -> z -> z **)
 
 let emin prec0 emax0 =
-  Z.sub (Z.sub (Zpos (XI XH)) emax0) prec0
+  MyZ.sub (MyZ.sub (Zpos (XI XH)) emax0) prec0
 
 (** val fexp : z -> z -> z -> z **)
 
 let fexp prec0 emax0 e =
-  Z.max (Z.sub e prec0) (emin prec0 emax0)
+  MyZ.max (MyZ.sub e prec0) (emin prec0 emax0)
 
 (** val digits2_pos : positive -> positive **)
 
@@ -429,7 +428,7 @@ let shr_record_of_loc m = function
 
 let shr mrs e n = match n with
 | Zpos p ->
-  ((iter_pos shr_1 p mrs), (Z.add e n))
+  ((iter_pos shr_1 p mrs), (MyZ.add e n))
 | _ -> (mrs, e)
 
 (** val shr_fexp :
@@ -438,15 +437,15 @@ let shr mrs e n = match n with
 
 let shr_fexp prec0 emax0 m e l =
   shr (shr_record_of_loc m l) e
-    (Z.sub
+    (MyZ.sub
       (fexp prec0 emax0
-        (Z.add (zdigits2 m) e)) e)
+        (MyZ.add (zdigits2 m) e)) e)
 
 (** val shl_align :
     positive -> z -> z -> positive * z **)
 
 let shl_align mx ex ex' =
-  match Z.sub ex' ex with
+  match MyZ.sub ex' ex with
   | Zneg d -> ((shift_pos d mx), ex')
   | _ -> (mx, ex)
 
@@ -485,7 +484,7 @@ let sFcompare f1 f2 =
        Some
          (if s1
           then if s2
-               then (match Z.compare e1 e2 with
+               then (match MyZ.compare e1 e2 with
                      | Eq ->
                        compOpp
                          (Pos.compare_cont Eq
@@ -495,7 +494,7 @@ let sFcompare f1 f2 =
                else Lt
           else if s2
                then Gt
-               else (match Z.compare e1 e2 with
+               else (match MyZ.compare e1 e2 with
                      | Eq ->
                        Pos.compare_cont Eq m1
                          m2
@@ -537,12 +536,12 @@ let sFleb f1 f2 =
 (** val cond_Zopp : bool -> z -> z **)
 
 let cond_Zopp b m =
-  if b then Z.opp m else m
+  if b then MyZ.opp m else m
 
 (** val cond_incr : bool -> z -> z **)
 
 let cond_incr b m =
-  if b then Z.add m (Zpos XH) else m
+  if b then MyZ.add m (Zpos XH) else m
 
 (** val round_sign_DN :
     bool -> location -> bool **)
@@ -638,7 +637,7 @@ type mode =
 let choice_mode m sx mx lx =
   match m with
   | Mode_NE ->
-    cond_incr (round_N (negb (Z.even mx)) lx)
+    cond_incr (round_N (negb (MyZ.even mx)) lx)
       mx
   | Mode_ZR -> mx
   | Mode_DN ->
@@ -664,17 +663,17 @@ let binary_overflow prec0 emax0 m s =
   if overflow_to_inf m s
   then S754_infinity s
   else S754_finite (s,
-         (Z.to_pos
-           (Z.sub
-             (Z.pow (Zpos (XO XH)) prec0)
-             (Zpos XH))), (Z.sub emax0 prec0))
+         (MyZ.to_pos
+           (MyZ.sub
+             (MyZ.pow (Zpos (XO XH)) prec0)
+             (Zpos XH))), (MyZ.sub emax0 prec0))
 
 (** val binary_fit_aux :
     z -> z -> mode -> bool -> positive -> z
     -> spec_float **)
 
 let binary_fit_aux prec0 emax0 mode0 sx mx ex =
-  if Z.leb ex (Z.sub emax0 prec0)
+  if MyZ.leb ex (MyZ.sub emax0 prec0)
   then S754_finite (sx, mx, ex)
   else binary_overflow prec0 emax0 mode0 sx
 
@@ -703,7 +702,7 @@ let binary_round_aux prec0 emax0 mode0 sx mx ex lx =
 let shl_align_fexp prec0 emax0 mx ex =
   shl_align mx ex
     (fexp prec0 emax0
-      (Z.add (Zpos (digits2_pos mx)) ex))
+      (MyZ.add (Zpos (digits2_pos mx)) ex))
 
 (** val binary_round :
     z -> z -> mode -> bool -> positive -> z
@@ -761,9 +760,9 @@ let bplus prec0 emax0 m x y =
      | B754_infinity _ -> y
      | B754_nan -> B754_nan
      | B754_finite (sy, my, ey) ->
-       let ez = Z.min ex ey in
+       let ez = MyZ.min ex ey in
        binary_normalize prec0 emax0 m
-         (Z.add
+         (MyZ.add
            (cond_Zopp sx (Zpos
              (fst (shl_align mx ex ez))))
            (cond_Zopp sy (Zpos
@@ -885,7 +884,22 @@ let iadd' prec0 emax0 m i1 i2 =
 let iadd =
   iadd'
 
-module Intv32 =
+module Intv32 : sig
+
+  type t
+
+  val inter : t -> t -> t option
+
+  val add : Farith.mode -> t -> t -> t
+
+  val top : t
+
+  val bot : t option
+
+  val is_singleton : t -> Farith.B32.t option
+
+  val to_string : t -> string
+end =
  struct
   (** val prec : z **)
 
@@ -897,21 +911,21 @@ module Intv32 =
   let emax =
     Zpos (XO (XO (XO (XO (XO (XO (XO XH)))))))
 
-  type float32 = float0
-
   type t = interval
 
-  type t_opt = interval_opt
-
-  (** val inter : t -> t -> t_opt **)
-
   let inter x y =
     inter prec emax x y
 
   (** val add : mode -> t -> t -> t **)
 
-  let add =
-    iadd prec emax
+  let add m =
+    iadd prec emax (match m with
+      | Farith.DN -> Mode_DN
+      | Farith.NA -> Mode_NA
+      | Farith.NE -> Mode_NE
+      | Farith.UP -> Mode_UP
+      | Farith.ZR -> Mode_ZR
+    )
 
   (** val top : t **)
 
@@ -927,10 +941,72 @@ module Intv32 =
   (** val is_singleton :
       t -> float32 option **)
 
+  let rec pos_to_Z (p : positive) =
+    match p with
+    | XH -> Z.one
+    | XO p' -> Z.shift_left (pos_to_Z p') 1
+    | XI p' -> Z.succ (Z.shift_left (pos_to_Z p') 1)
+  
+  let z_to_Z z =
+    match z with
+    | Z0 -> Z.zero
+    | Zpos p -> pos_to_Z p
+    | Zneg p -> Z.neg (pos_to_Z p)
+  
+  (* let pos_of_Z z =
+    let rem = ref z in
+    if Z.equal a
+
+  let z_of_Z z =
+    let rem = ref z in
+    let two = Z.(add one one) in
+    if Z.equal z
+    let (q, r) = Z.ediv_rem !rem two in *)
+    
+  (*
+    while rem <> 0 :
+      let (q, r) = diveucl rem
+      if r = 0 then
+        append O
+      else
+        append I
+      rem = q
+  *)
+
+  (* let b_of_B32 (f : Farith.B32.t) =
+    match Farith.B32.classify f with
+    | Farith.Zero s -> B754_zero s
+    | Farith.Infinity s -> B754_infinity s
+    | Farith.NaN (_, _) -> B754_nan
+    | Farith.Finite (s, m, e) -> B754_finite (s, _, _) *)
+  
+  let b_to_B32 f =
+    match f with
+    | B754_nan -> Farith.B32.default_nan
+    | B754_zero s -> Farith.B32.zero s
+    | B754_infinity s -> Farith.B32.infinity s
+    | B754_finite (s, m, e) ->
+      let m' = if s then Z.neg (pos_to_Z m) else (pos_to_Z m) in
+      let e' = z_to_Z e in
+      Farith.B32.finite NE m' e'
+
   let is_singleton = function
-  | Inan -> Some B754_nan
+  | Inan -> Some Farith.B32.default_nan
   | Intv (a, b, n) ->
     if (&&) (beqb prec emax a b) (negb n)
-    then Some a
+    then Some (b_to_B32 a)
     else None
- end
\ No newline at end of file
+
+  let to_string = function
+    | Inan -> "{ NaN }"
+    | Intv (a, b, nan) ->
+      if nan then
+        Format.sprintf "[%a, %a] + NaN"
+          Farith.B32.pp (b_to_B32 a)
+          Farith.B32.pp (b_to_B32 b)
+      else
+        Format.sprintf "[%a, %a]"
+          Farith.B32.pp (b_to_B32 a)
+          Farith.B32.pp (b_to_B32 b)
+ end
+
diff --git a/src_common/ieee/coq/.nia.cache b/src_common/ieee/coq/.nia.cache
deleted file mode 100644
index e1ba0d8848ad382d95a2522bd2936fc77bc7bf09..0000000000000000000000000000000000000000
Binary files a/src_common/ieee/coq/.nia.cache and /dev/null differ
diff --git a/src_common/ieee/coq/.nra.cache b/src_common/ieee/coq/.nra.cache
index d4eace0958b03eb6573f516a098d386cece26252..d98ef9c4b6c6b430155da61742d938534ee28064 100644
Binary files a/src_common/ieee/coq/.nra.cache and b/src_common/ieee/coq/.nra.cache differ
diff --git a/src_common/ieee/coq/B32.v b/src_common/ieee/coq/B32.v
new file mode 100644
index 0000000000000000000000000000000000000000..3575fe4bcd9185540dce3c6eb06069fc9ca2334e
--- /dev/null
+++ b/src_common/ieee/coq/B32.v
@@ -0,0 +1,116 @@
+From Flocq Require Import Core.Core IEEE754.BinarySingleNaN IEEE754.Bits.
+Require Import QArith.
+Require Import Qreals.
+Require Import Reals.
+Require Import ZBits.
+Require Import Lia Lra.
+Require Coq.Arith.Wf_nat.
+Require Import Extraction.
+From F Require Import Qextended Rextended.
+
+
+Module B32.
+
+Definition prec : Z := 24.
+Definition emax : Z := 128.
+
+Definition mw : Z := 23.
+Definition ew : Z := 8.
+
+Definition t : Type := binary_float prec emax.
+
+Lemma Hprec : Prec_gt_0 prec.
+  Proof. unfold Prec_gt_0, prec; lia. Qed.
+
+Lemma Hemax : Prec_lt_emax prec emax.
+  Proof. unfold Prec_lt_emax, prec, emax; lia. Qed.
+
+Lemma Hmw : (0 < mw)%Z. unfold mw; lia. Qed.
+
+Lemma Hew : (0 < ew)%Z. unfold ew; lia. Qed.
+
+Definition add : mode -> t -> t -> t := @Bplus _ _ Hprec Hemax.
+Definition sub : mode -> t -> t -> t := @Bminus _ _ Hprec Hemax.
+Definition mult : mode -> t -> t -> t := @Bmult _ _ Hprec Hemax.
+Definition div : mode -> t -> t -> t := @Bmult _ _ Hprec Hemax.
+Definition sqrt : mode -> t -> t := @Bsqrt _ _ Hprec Hemax.
+Definition abs : t -> t := Babs.
+
+Definition le : t -> t -> bool := Bleb.
+Definition lt : t -> t -> bool := Bltb.
+Definition eq : t -> t -> bool := Beqb.
+Definition ge : t -> t -> bool := fun x y => Bleb y x.
+Definition gt : t -> t -> bool := fun x y => Bltb y x.
+
+Definition of_bits (b : Z) : t :=
+  match Bits.binary_float_of_bits mw ew Hmw Hew Hemax b with
+  | Binary.B754_nan _ _ _ _ _ => B754_nan
+  | Binary.B754_zero _ _ s => B754_zero s
+  | Binary.B754_infinity _ _ s => B754_infinity s
+  | Binary.B754_finite _ _ s m e H => B754_finite s m e H
+  end.
+
+Definition pl_cst := (Zaux.iter_nat xO (Z.to_nat (Z.pred mw)) xH)%Z.
+
+Lemma pl_valid : (Z.pos (Digits.digits2_pos pl_cst) <? prec)%Z = true.
+Proof.
+  assert (G:forall n, Digits.digits2_Pnat (Zaux.iter_nat xO n xH)%Z = n).
+  - induction n.
+    * reflexivity.
+    * rewrite iter_nat_S; simpl.
+      rewrite IHn; reflexivity.
+  - rewrite Digits.Zpos_digits2_pos.
+    rewrite <- Digits.Z_of_nat_S_digits2_Pnat.
+    unfold pl_cst, prec, mw.
+    rewrite G;clear G.
+    rewrite Nat2Z.inj_succ.
+    rewrite Z2Nat.id; [rewrite Z.ltb_lt | ]; lia.
+Qed.
+
+Definition to_bits (f : t) : Z :=
+  match f with
+  | B754_nan =>
+    Bits.bits_of_binary_float mw ew (Binary.B754_nan prec emax true pl_cst pl_valid) 
+  | B754_zero s => Bits.bits_of_binary_float mw ew (Binary.B754_zero prec emax s)
+  | B754_infinity s => Bits.bits_of_binary_float mw ew (Binary.B754_infinity prec emax s)
+  | B754_finite s m e H => Bits.bits_of_binary_float mw ew (Binary.B754_finite prec emax s m e H)
+  end.
+
+Definition of_q (m : mode) (q : Qx) : t :=
+  match Qx_classify q with
+  | Qx_ZERO _ _ _ _ => B754_zero false
+  | Qx_INF _ _ _ => B754_infinity false
+  | Qx_MINF _ _ _ => B754_infinity true
+  | Qx_UNDEF _ _ _ => B754_nan
+  | Qx_NZERO _ _ _ _ _ =>
+    match num q with
+    | Z0 => B754_nan (** absurd *)
+    | Z.pos pn =>
+      SF2B _ (proj1 (Bdiv_correct_aux _ _ Hprec Hemax m false pn 0%Z false (Z.to_pos (den q)) 0%Z))
+    | Z.neg nn =>
+      SF2B _ (proj1 (Bdiv_correct_aux _ _ Hprec Hemax m true nn 0%Z false (Z.to_pos (den q)) 0%Z))
+    end
+  end.
+
+Lemma of_q_correct : forall m q, Q2Rx q = B2Rx (of_q m q).
+Proof.
+  intros m q.
+  unfold of_q, Q2Rx; destruct (Qx_classify q).
+  - rewrite e, e0. reflexivity.
+  - rewrite e, e0. reflexivity.
+  - rewrite e, e0. reflexivity.
+  - rewrite e, e0.
+    destruct (Z.pos pq =? 0)%Z; try reflexivity.
+    unfold Q2R; simpl.
+    now rewrite Rmult_0_l.
+  - rewrite e.
+    destruct (Z.pos pq =? 0)%Z eqn:E1, (num q =? 0)%Z eqn:E2.
+    + rewrite Z.eqb_eq in E1; rewrite E1;
+      rewrite Z.eqb_eq in E2; rewrite E2.
+      reflexivity.
+    + admit.
+    + admit.
+    + admit.
+Admitted.
+
+End B32.
\ No newline at end of file
diff --git a/src_common/ieee/coq/Domains.v b/src_common/ieee/coq/Domains.v
deleted file mode 100644
index bc8a7dd20bbda41ad4fba923bba509e003feb5ec..0000000000000000000000000000000000000000
--- a/src_common/ieee/coq/Domains.v
+++ /dev/null
@@ -1,29 +0,0 @@
-From Flocq Require Import IEEE754.BinarySingleNaN.
-From Coq Require Import ZArith.
-
-Definition Powerset (A : Type) := A -> Prop.
-
-Notation "𝓟( A )" := (Powerset A).
-
-Module Type Fformat.
-  Parameter prec : Z.
-  Parameter emax : Z.
-  Axiom Hprec : FLX.Prec_gt_0 prec.
-  Axiom Hemax : Prec_lt_emax prec emax.
-End Fformat.
-
-Module Fdom (F : Fformat).
-
-  Parameter Dom : Type.
-
-  Parameter γ : Dom -> 𝓟(binary_float F.prec F.emax).
-
-  Parameter add : Dom -> Dom -> Dom.
-
-  Axiom add_correct :
-    forall (m : mode) (d1 d2 : Dom) (x y : binary_float F.prec F.emax),
-      γ d1 x ->
-      γ d1 y ->
-      γ (add d1 d2) (@Bplus F.prec F.emax F.Hprec F.Hemax m x y).
-
-End Fdom.
diff --git a/src_common/ieee/coq/Interval.v b/src_common/ieee/coq/Interval.v
index 222f99b4d9ebd8fead85d1612e8c22d8a9e6949a..45217ccf5e2fba22886184ff5d59d8208a35c582 100644
--- a/src_common/ieee/coq/Interval.v
+++ b/src_common/ieee/coq/Interval.v
@@ -1,6 +1,6 @@
 From Flocq Require Import IEEE754.BinarySingleNaN.
 From Coq Require Import QArith Psatz Reals Extraction.
-Require Import  F.Utils F.Domains F.Correction_thms F.Rextended.
+Require Import  F.Utils F.Correction_thms F.Rextended.
 
 (*********************************************************
        Interval arithmetic over floatting points
diff --git a/src_common/ieee/coq/Colibri2_interval.v b/src_common/ieee/coq/Intv32.v
similarity index 100%
rename from src_common/ieee/coq/Colibri2_interval.v
rename to src_common/ieee/coq/Intv32.v
diff --git a/src_common/ieee/coq/Qextended.v b/src_common/ieee/coq/Qextended.v
new file mode 100644
index 0000000000000000000000000000000000000000..4b0181fff170e6acbeaca0ecbfd4523a08da8b51
--- /dev/null
+++ b/src_common/ieee/coq/Qextended.v
@@ -0,0 +1,66 @@
+From Coq Require Import ZArith Reals Qreals Extraction.
+From F Require Import Rextended.
+
+(** * A type of rationals suitable for conversions from and to fp
+  and compatible with zarith Q
+*)
+
+Record Qx := Qxmake {
+  num : Z.t; den : Z.t;
+  Hden1 : (0 <=? den)%Z = true;
+  Hden2 : (if den =? 0 then orb (orb (num =? -1) (num =? 0)) (num =? 1) else Z.gcd num den =? 1)%Z = true
+}.
+
+Lemma Hden2' :
+  forall q, (den q = 0 -> num q = -1 \/ num q = 0 \/ num q = 1)%Z.
+Proof.
+  intros q H.
+  rewrite <- !Z.eqb_eq in *.
+  assert (H2 := Hden2 q).
+  rewrite H in H2.
+  destruct (num q =? -1)%Z; destruct (num q =? 0)%Z; destruct (num q =? 1)%Z;
+  tauto.
+Qed.
+
+Definition Qx_zero := Qxmake 0%Z 1%Z (refl_equal _) (refl_equal _).
+Definition Qx_undef := Qxmake 0%Z 0%Z (refl_equal _) (refl_equal _).
+Definition Qx_inf := Qxmake 1%Z 0%Z (refl_equal _) (refl_equal _).
+Definition Qx_minus_inf := Qxmake (-1)%Z 0%Z (refl_equal _) (refl_equal _).
+Definition Qx_half := Qxmake (1)%Z 2%Z (refl_equal _) (refl_equal _).
+
+Inductive Qx_kind (q : Qx) := (* cf Q of Zarith *)
+  | Qx_INF:  (num q = 1)%Z  -> (den q = 0)%Z -> Qx_kind q
+  | Qx_MINF: (num q = -1)%Z -> (den q = 0)%Z -> Qx_kind q
+  | Qx_UNDEF: (num q = 0)%Z -> (den q = 0)%Z -> Qx_kind q
+  | Qx_ZERO: (num q = 0)%Z  -> forall pq, (den q = Z.pos pq)%Z -> Qx_kind q
+  | Qx_NZERO: forall nq (s:{num q = Z.pos nq} + {num q = Z.neg nq}) pq, (den q = Z.pos pq)%Z -> Qx_kind q.
+
+Extraction Implicit Qx_ZERO [pq].
+Extraction Implicit Qx_NZERO [nq s pq].
+
+Lemma Qx_classify (q: Qx) : Qx_kind q.
+Proof.
+  intros.
+    case_eq (den q); [intros Hd | intros pd Hd| intros nd Hd].
+  - case_eq (num q); [intros Hn | intros pn Hn| intros nn Hn].
+    * exact (Qx_UNDEF q Hn Hd).
+    * assert (H: num q = ( 1)%Z) by (destruct (Hden2' q Hd) as [H|[H|H]]; rewrite Hn in *;
+                                       [discriminate H| discriminate H | assumption ]).
+      exact (Qx_INF q H Hd).
+    * assert (H: num q = (-1)%Z) by (destruct (Hden2' q Hd) as [H|[H|H]]; rewrite Hn in *;
+                                       [assumption| discriminate H | discriminate H]).
+      exact (Qx_MINF q H Hd).
+  - case_eq (num q); [intros Hn | intros nq Hn| intros nq Hn].
+    * exact (Qx_ZERO  q Hn pd Hd).
+    * exact (Qx_NZERO q nq (left Hn) pd Hd).
+    * exact (Qx_NZERO q nq (right Hn) pd Hd).
+  - assert (A := Hden1 q).
+    rewrite Hd in A.
+    discriminate A.
+Defined.
+
+Definition Q2Rx q : Rx :=
+  if (den q =? 0)%Z then
+    if (num q =? 0)%Z then Real (0%R)
+    else Inf (num q <? 0)%Z
+  else Real (Q2R (Qmake (num q) (Z.to_pos (den q)))).
\ No newline at end of file
diff --git a/src_common/ieee/coq/_CoqProject b/src_common/ieee/coq/_CoqProject
index f7a97e9b7ce5f2476de2a49da004050fad8cf0ab..1666423c122b9987c7290808db6bdac441dd9065 100644
--- a/src_common/ieee/coq/_CoqProject
+++ b/src_common/ieee/coq/_CoqProject
@@ -1,8 +1,9 @@
 -R ./ F
-./Domains.v
 ./Interval.v
-./Colibri2_interval.v
+./Intv32.v
 ./Tactics.v
 ./Rextended.v
+./Qextended.v
 ./Utils.v
+./B32.v
 ./Correction_thms.v
\ No newline at end of file