Section Fcalc_sqrt.
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 square root of the input floating-point number.  The algorithm performs the following steps: - Shift the mantissa so that it has at least 2p-1 digits; shift it one digit more if the new exponent is not even. - Compute the square root s (at least p digits) of the new mantissa, and its remainder r. - Compute the position according to the remainder: -- r == 0  =>  Eq, -- r <= s  =>  Lo, -- r >= s  =>  Up.  Complexity is fine as long as p1 <= 2p-1. *)
Definition Fsqrt_core m1 e1 e :=
let d1 := Zdigits beta m1 in
let m1' := (m1 * Zpower beta (e1 - 2 * e))%Z in
let (q, r) := Z.sqrtrem m1' in
let l :=
if Zeq_bool r 0 then loc_Exact
else loc_Inexact (if Zle_bool r q then Lt else Gt) in
(q, l).

Theorem Fsqrt_core_correct :
forall m1 e1 e,
(0 < m1)%Z ->
(2 * e <= e1)%Z ->
let '(m, l) := Fsqrt_core m1 e1 e in
inbetween_float beta m e (sqrt (F2R (Float beta m1 e1))) l.