Section Fcalc_div.
Variable beta : radix.
Notation bpow e := (bpow beta e).
Variable fexp : Z -> Z.
(** Computes a mantissa of precision p, the corresponding exponent, and the position with respect to the real quotient of the input floating-point numbers.  The algorithm performs the following steps: - Shift dividend mantissa so that it has at least p2 + p digits. - Perform the Euclidean division. - Compute the position according to the division remainder.  Complexity is fine as long as p1 <= 2p and p2 <= p. *)
Definition Fdiv_core m1 e1 m2 e2 e :=
let (m1', m2') :=
if Zle_bool e (e1 - e2)%Z
then (m1 * Zpower beta (e1 - e2 - e), m2)%Z
else (m1, m2 * Zpower beta (e - (e1 - e2)))%Z in
let '(q, r) :=  Z.div_eucl m1' m2' in
(q, new_location m2' r loc_Exact).
Definition Fdiv (x y : float beta) :=
let (m1, e1) := x in
let (m2, e2) := y in
let e' := ((Zdigits beta m1 + e1) - (Zdigits beta m2 + e2))%Z in
let e := Z.min (Z.min (fexp e') (fexp (e' + 1))) (e1 - e2) in
let '(m, l) := Fdiv_core m1 e1 m2 e2 e in
(m, e, l).

Theorem Fdiv_correct :
forall x y,
(0 < F2R x)%R -> (0 < F2R y)%R ->
let '(m, e, l) := Fdiv x y in
(e <= cexp beta fexp (F2R x / F2R y))%Z /\
inbetween_float beta m e (F2R x / F2R y) l.