Proof with auto with typeclass_instances.
intros x y Fx Fy.
case (Req_dec x 0); intros Zx.
(* *)
rewrite Zx, Rplus_0_l.
rewrite round_generic...
unfold Rdiv; rewrite Rmult_0_l.
rewrite Fy at 2.
unfold F2R; simpl; rewrite Rabs_mult.
rewrite (Rabs_pos_eq (bpow _)) by apply bpow_ge_0.
case (Z.eq_dec (Ztrunc (scaled_mantissa beta fexp y)) 0); intros Hm.
left.
rewrite Fy, Hm; unfold F2R; simpl; ring.
right.
apply Rle_trans with (1*bpow (cexp y))%R.
rewrite Rmult_1_l.
rewrite <- ulp_neq_0.
apply ulp_ge_ulp_0...
intros K; apply Hm.
rewrite K, scaled_mantissa_0.
apply (Ztrunc_Z2R 0).
apply Rmult_le_compat_r.
apply bpow_ge_0.
rewrite <- Z2R_abs.
apply (Z2R_le 1).
apply (Zlt_le_succ 0).
now apply Z.abs_pos.
(* *)
destruct (round_plus_mult_ulp x y Fx Fy Zx) as (m,Hm).
case (Z.eq_dec m 0); intros Zm.
left.
rewrite Hm, Zm; simpl; ring.
right.
rewrite Hm, Rabs_mult.
rewrite (Rabs_pos_eq (ulp _ _ _)) by apply ulp_ge_0.
apply Rle_trans with (1*ulp beta fexp (x/Z2R beta))%R.
right; ring.
apply Rmult_le_compat_r.
apply ulp_ge_0.
rewrite <- Z2R_abs.
apply (Z2R_le 1).
apply (Zlt_le_succ 0).
now apply Z.abs_pos.
Qed.
End Fprop_plus_mult_ulp.
Section Fprop_plus_ge_ulp.
Variable beta : radix.
Notation bpow e := (bpow beta e).
Variable rnd : R -> Z.
Context { valid_rnd : Valid_rnd rnd }.
Variable emin prec : Z.
Context { prec_gt_0_ : Prec_gt_0 prec }.

Theorem round_plus_ge_ulp_FLT : forall x y e,
generic_format beta (FLT_exp emin prec) x -> generic_format beta (FLT_exp emin prec) y ->
(bpow e <= Rabs x)%R ->
round beta (FLT_exp emin prec) rnd (x+y) = 0%R \/
(bpow (e - prec) <= Rabs (round beta (FLT_exp emin prec) rnd (x+y)))%R.