Section Double_round_sqrt.
Definition double_round_sqrt_hyp fexp1 fexp2 :=
(forall ex, (2 * fexp1 ex <= fexp1 (2 * ex))%Z)
/\ (forall ex, (2 * fexp1 ex <= fexp1 (2 * ex - 1))%Z)
/\ (forall ex, (fexp1 (2 * ex) < 2 * ex)%Z ->
(fexp2 ex + ex <= 2 * fexp1 ex - 2)%Z).

(* Specifications: *)
Lemma ln_beta_sqrt_disj :
forall x,
0 < x ->
(ln_beta x = 2 * ln_beta (sqrt x) - 1 :> Z)%Z
\/ (ln_beta x = 2 * ln_beta (sqrt x) :> Z)%Z.
Lemma double_round_sqrt_aux :
forall fexp1 fexp2 : Z -> Z,
Valid_exp fexp1 -> Valid_exp fexp2 ->
double_round_sqrt_hyp fexp1 fexp2 ->
forall x,
0 < x ->
(fexp2 (ln_beta (sqrt x)) <= fexp1 (ln_beta (sqrt x)) - 1)%Z ->
generic_format beta fexp1 x ->
/ 2 * ulp beta fexp2 (sqrt x) < Rabs (sqrt x - midp fexp1 (sqrt x)).
Lemma double_round_sqrt :
forall fexp1 fexp2 : Z -> Z,
Valid_exp fexp1 -> Valid_exp fexp2 ->
forall (choice1 choice2 : Z -> bool),
double_round_sqrt_hyp fexp1 fexp2 ->
forall x,
generic_format beta fexp1 x ->
double_round_eq fexp1 fexp2 choice1 choice2 (sqrt x).
Lemma ln_beta_sqrt_disj :
forall x,
0 < x ->
(ln_beta x = 2 * ln_beta (sqrt x) - 1 :> Z)%Z
\/ (ln_beta x = 2 * ln_beta (sqrt x) :> Z)%Z.
Lemma double_round_sqrt_aux :
forall fexp1 fexp2 : Z -> Z,
Valid_exp fexp1 -> Valid_exp fexp2 ->
double_round_sqrt_hyp fexp1 fexp2 ->
forall x,
0 < x ->
(fexp2 (ln_beta (sqrt x)) <= fexp1 (ln_beta (sqrt x)) - 1)%Z ->
generic_format beta fexp1 x ->
/ 2 * ulp beta fexp2 (sqrt x) < Rabs (sqrt x - midp fexp1 (sqrt x)).
Lemma double_round_sqrt :
forall fexp1 fexp2 : Z -> Z,
Valid_exp fexp1 -> Valid_exp fexp2 ->
forall (choice1 choice2 : Z -> bool),
double_round_sqrt_hyp fexp1 fexp2 ->
forall x,
generic_format beta fexp1 x ->
double_round_eq fexp1 fexp2 choice1 choice2 (sqrt x).