intros x p H.
cut (Fcanonic radix b (Fnormalize radix b precision p));
[ intros tmp; Casec tmp; intros Fs | idtac ].
3: apply FnormalizeCanonic; auto with arith.
3: apply
RoundedModeBounded with (radix := radix) (P := Closest b radix) (r := x);
auto.
3: apply ClosestRoundedModeP with (precision := precision); auto.
apply
Rle_trans with (Rabs p * (/ 2%nat * (radix * / Zpos (vNum b))))%R;
[ idtac | apply RmaxLess1 ].
apply ClosestErrorBoundNormal_aux; auto.
apply Rle_trans with (/ 2%nat * Fulp b radix precision p)%R.
replace (Rabs (x - FtoRradix p)) with
(/ 2%nat * (2%nat * Rabs (x - FtoRradix p)))%R.
apply Rmult_le_compat_l; auto with real.
apply ClosestUlp; auto.
rewrite <- Rmult_assoc; rewrite Rinv_l; simpl in |- *; auto with real.
elim Fs; intros H1 H2; elim H2; intros; clear H2.
unfold Fulp in |- *; rewrite H0; apply RmaxLess2.
Qed.

(* Specifications: *)
Theorem ClosestErrorBoundNormal :
forall (x : R) (p : float),
Closest b radix x p ->
Fnormal radix b (Fnormalize radix b precision p) ->
(Rabs (x - p) <= Rabs p * (/ 2%nat * powerRZ radix (Zsucc (- precision))))%R.