diff options
Diffstat (limited to 'flocq/Appli/Fappli_rnd_odd.v')
-rw-r--r-- | flocq/Appli/Fappli_rnd_odd.v | 1022 |
1 files changed, 0 insertions, 1022 deletions
diff --git a/flocq/Appli/Fappli_rnd_odd.v b/flocq/Appli/Fappli_rnd_odd.v deleted file mode 100644 index 273c1000..00000000 --- a/flocq/Appli/Fappli_rnd_odd.v +++ /dev/null @@ -1,1022 +0,0 @@ -(** -This file is part of the Flocq formalization of floating-point -arithmetic in Coq: http://flocq.gforge.inria.fr/ - -Copyright (C) 2010-2013 Sylvie Boldo -#<br /># -Copyright (C) 2010-2013 Guillaume Melquiond - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 3 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -COPYING file for more details. -*) - -(** * Rounding to odd and its properties, including the equivalence - between rnd_NE and double rounding with rnd_odd and then rnd_NE *) - -Require Import Reals Psatz. -Require Import Fcore. -Require Import Fcalc_ops. - -Definition Zrnd_odd x := match Req_EM_T x (Z2R (Zfloor x)) with - | left _ => Zfloor x - | right _ => match (Zeven (Zfloor x)) with - | true => Zceil x - | false => Zfloor x - end - end. - - - -Global Instance valid_rnd_odd : Valid_rnd Zrnd_odd. -Proof. -split. -(* . *) -intros x y Hxy. -assert (Zfloor x <= Zrnd_odd y)%Z. -(* .. *) -apply Zle_trans with (Zfloor y). -now apply Zfloor_le. -unfold Zrnd_odd; destruct (Req_EM_T y (Z2R (Zfloor y))). -now apply Zle_refl. -case (Zeven (Zfloor y)). -apply le_Z2R. -apply Rle_trans with y. -apply Zfloor_lb. -apply Zceil_ub. -now apply Zle_refl. -unfold Zrnd_odd at 1. -(* . *) -destruct (Req_EM_T x (Z2R (Zfloor x))) as [Hx|Hx]. -(* .. *) -apply H. -(* .. *) -case_eq (Zeven (Zfloor x)); intros Hx2. -2: apply H. -unfold Zrnd_odd; destruct (Req_EM_T y (Z2R (Zfloor y))) as [Hy|Hy]. -apply Zceil_glb. -now rewrite <- Hy. -case_eq (Zeven (Zfloor y)); intros Hy2. -now apply Zceil_le. -apply Zceil_glb. -assert (H0:(Zfloor x <= Zfloor y)%Z) by now apply Zfloor_le. -case (Zle_lt_or_eq _ _ H0); intros H1. -apply Rle_trans with (1:=Zceil_ub _). -rewrite Zceil_floor_neq. -apply Z2R_le; omega. -now apply sym_not_eq. -contradict Hy2. -rewrite <- H1, Hx2; discriminate. -(* . *) -intros n; unfold Zrnd_odd. -rewrite Zfloor_Z2R, Zceil_Z2R. -destruct (Req_EM_T (Z2R n) (Z2R n)); trivial. -case (Zeven n); trivial. -Qed. - - - -Lemma Zrnd_odd_Zodd: forall x, x <> (Z2R (Zfloor x)) -> - (Zeven (Zrnd_odd x)) = false. -Proof. -intros x Hx; unfold Zrnd_odd. -destruct (Req_EM_T x (Z2R (Zfloor x))) as [H|H]. -now contradict H. -case_eq (Zeven (Zfloor x)). -(* difficult case *) -intros H'. -rewrite Zceil_floor_neq. -rewrite Zeven_plus, H'. -reflexivity. -now apply sym_not_eq. -trivial. -Qed. - - - - -Section Fcore_rnd_odd. - -Variable beta : radix. - -Notation bpow e := (bpow beta e). - -Variable fexp : Z -> Z. - -Context { valid_exp : Valid_exp fexp }. -Context { exists_NE_ : Exists_NE beta fexp }. - -Notation format := (generic_format beta fexp). -Notation canonic := (canonic beta fexp). -Notation cexp := (canonic_exp beta fexp). - - -Definition Rnd_odd_pt (x f : R) := - format f /\ ((f = x)%R \/ - ((Rnd_DN_pt format x f \/ Rnd_UP_pt format x f) /\ - exists g : float beta, f = F2R g /\ canonic g /\ Zeven (Fnum g) = false)). - -Definition Rnd_odd (rnd : R -> R) := - forall x : R, Rnd_odd_pt x (rnd x). - - -Theorem Rnd_odd_pt_sym : forall x f : R, - Rnd_odd_pt (-x) (-f) -> Rnd_odd_pt x f. -Proof with auto with typeclass_instances. -intros x f (H1,H2). -split. -replace f with (-(-f))%R by ring. -now apply generic_format_opp. -destruct H2. -left. -replace f with (-(-f))%R by ring. -rewrite H; ring. -right. -destruct H as (H2,(g,(Hg1,(Hg2,Hg3)))). -split. -destruct H2. -right. -replace f with (-(-f))%R by ring. -replace x with (-(-x))%R by ring. -apply Rnd_DN_UP_pt_sym... -apply generic_format_opp. -left. -replace f with (-(-f))%R by ring. -replace x with (-(-x))%R by ring. -apply Rnd_UP_DN_pt_sym... -apply generic_format_opp. -exists (Float beta (-Fnum g) (Fexp g)). -split. -rewrite F2R_Zopp. -replace f with (-(-f))%R by ring. -rewrite Hg1; reflexivity. -split. -now apply canonic_opp. -simpl. -now rewrite Zeven_opp. -Qed. - - -Theorem round_odd_opp : - forall x, - (round beta fexp Zrnd_odd (-x) = (- round beta fexp Zrnd_odd x))%R. -Proof. -intros x; unfold round. -rewrite <- F2R_Zopp. -unfold F2R; simpl. -apply f_equal2; apply f_equal. -rewrite scaled_mantissa_opp. -generalize (scaled_mantissa beta fexp x); intros r. -unfold Zrnd_odd. -case (Req_EM_T (- r) (Z2R (Zfloor (- r)))). -case (Req_EM_T r (Z2R (Zfloor r))). -intros Y1 Y2. -apply eq_Z2R. -now rewrite Z2R_opp, <- Y1, <-Y2. -intros Y1 Y2. -absurd (r=Z2R (Zfloor r)); trivial. -pattern r at 2; replace r with (-(-r))%R by ring. -rewrite Y2, <- Z2R_opp. -rewrite Zfloor_Z2R. -rewrite Z2R_opp, <- Y2. -ring. -case (Req_EM_T r (Z2R (Zfloor r))). -intros Y1 Y2. -absurd (-r=Z2R (Zfloor (-r)))%R; trivial. -pattern r at 2; rewrite Y1. -rewrite <- Z2R_opp, Zfloor_Z2R. -now rewrite Z2R_opp, <- Y1. -intros Y1 Y2. -unfold Zceil; rewrite Ropp_involutive. -replace (Zeven (Zfloor (- r))) with (negb (Zeven (Zfloor r))). -case (Zeven (Zfloor r)); simpl; ring. -apply trans_eq with (Zeven (Zceil r)). -rewrite Zceil_floor_neq. -rewrite Zeven_plus. -destruct (Zeven (Zfloor r)); reflexivity. -now apply sym_not_eq. -rewrite <- (Zeven_opp (Zfloor (- r))). -reflexivity. -apply canonic_exp_opp. -Qed. - - - -Theorem round_odd_pt : - forall x, - Rnd_odd_pt x (round beta fexp Zrnd_odd x). -Proof with auto with typeclass_instances. -cut (forall x : R, (0 < x)%R -> Rnd_odd_pt x (round beta fexp Zrnd_odd x)). -intros H x; case (Rle_or_lt 0 x). -intros H1; destruct H1. -now apply H. -rewrite <- H0. -rewrite round_0... -split. -apply generic_format_0. -now left. -intros Hx; apply Rnd_odd_pt_sym. -rewrite <- round_odd_opp. -apply H. -auto with real. -(* *) -intros x Hxp. -generalize (generic_format_round beta fexp Zrnd_odd x). -set (o:=round beta fexp Zrnd_odd x). -intros Ho. -split. -assumption. -(* *) -case (Req_dec o x); intros Hx. -now left. -right. -assert (o=round beta fexp Zfloor x \/ o=round beta fexp Zceil x). -unfold o, round, F2R;simpl. -case (Zrnd_DN_or_UP Zrnd_odd (scaled_mantissa beta fexp x))... -intros H; rewrite H; now left. -intros H; rewrite H; now right. -split. -destruct H; rewrite H. -left; apply round_DN_pt... -right; apply round_UP_pt... -(* *) -unfold o, Zrnd_odd, round. -case (Req_EM_T (scaled_mantissa beta fexp x) - (Z2R (Zfloor (scaled_mantissa beta fexp x)))). -intros T. -absurd (o=x); trivial. -apply round_generic... -unfold generic_format, F2R; simpl. -rewrite <- (scaled_mantissa_mult_bpow beta fexp) at 1. -apply f_equal2; trivial; rewrite T at 1. -apply f_equal, sym_eq, Ztrunc_floor. -apply Rmult_le_pos. -now left. -apply bpow_ge_0. -intros L. -case_eq (Zeven (Zfloor (scaled_mantissa beta fexp x))). -(* . *) -generalize (generic_format_round beta fexp Zceil x). -unfold generic_format. -set (f:=round beta fexp Zceil x). -set (ef := canonic_exp beta fexp f). -set (mf := Ztrunc (scaled_mantissa beta fexp f)). -exists (Float beta mf ef). -unfold Fcore_generic_fmt.canonic. -rewrite <- H0. -repeat split; try assumption. -apply trans_eq with (negb (Zeven (Zfloor (scaled_mantissa beta fexp x)))). -2: rewrite H1; reflexivity. -apply trans_eq with (negb (Zeven (Fnum - (Float beta (Zfloor (scaled_mantissa beta fexp x)) (cexp x))))). -2: reflexivity. -case (Rle_lt_or_eq_dec 0 (round beta fexp Zfloor x)). -rewrite <- round_0 with beta fexp Zfloor... -apply round_le... -now left. -intros Y. -generalize (DN_UP_parity_generic beta fexp)... -unfold DN_UP_parity_prop. -intros T; apply T with x; clear T. -unfold generic_format. -rewrite <- (scaled_mantissa_mult_bpow beta fexp x) at 1. -unfold F2R; simpl. -apply Rmult_neq_compat_r. -apply Rgt_not_eq, bpow_gt_0. -rewrite Ztrunc_floor. -assumption. -apply Rmult_le_pos. -now left. -apply bpow_ge_0. -unfold Fcore_generic_fmt.canonic. -simpl. -apply sym_eq, canonic_exp_DN... -unfold Fcore_generic_fmt.canonic. -rewrite <- H0; reflexivity. -reflexivity. -apply trans_eq with (round beta fexp Ztrunc (round beta fexp Zceil x)). -reflexivity. -apply round_generic... -intros Y. -replace (Fnum {| Fnum := Zfloor (scaled_mantissa beta fexp x); Fexp := cexp x |}) - with (Fnum (Float beta 0 (fexp (ln_beta beta 0)))). -generalize (DN_UP_parity_generic beta fexp)... -unfold DN_UP_parity_prop. -intros T; apply T with x; clear T. -unfold generic_format. -rewrite <- (scaled_mantissa_mult_bpow beta fexp x) at 1. -unfold F2R; simpl. -apply Rmult_neq_compat_r. -apply Rgt_not_eq, bpow_gt_0. -rewrite Ztrunc_floor. -assumption. -apply Rmult_le_pos. -now left. -apply bpow_ge_0. -apply canonic_0. -unfold Fcore_generic_fmt.canonic. -rewrite <- H0; reflexivity. -rewrite <- Y; unfold F2R; simpl; ring. -apply trans_eq with (round beta fexp Ztrunc (round beta fexp Zceil x)). -reflexivity. -apply round_generic... -simpl. -apply eq_Z2R, Rmult_eq_reg_r with (bpow (cexp x)). -unfold round, F2R in Y; simpl in Y; rewrite <- Y. -simpl; ring. -apply Rgt_not_eq, bpow_gt_0. -(* . *) -intros Y. -case (Rle_lt_or_eq_dec 0 (round beta fexp Zfloor x)). -rewrite <- round_0 with beta fexp Zfloor... -apply round_le... -now left. -intros Hrx. -set (ef := canonic_exp beta fexp x). -set (mf := Zfloor (scaled_mantissa beta fexp x)). -exists (Float beta mf ef). -unfold Fcore_generic_fmt.canonic. -repeat split; try assumption. -simpl. -apply trans_eq with (cexp (round beta fexp Zfloor x )). -apply sym_eq, canonic_exp_DN... -reflexivity. -intros Hrx; contradict Y. -replace (Zfloor (scaled_mantissa beta fexp x)) with 0%Z. -simpl; discriminate. -apply eq_Z2R, Rmult_eq_reg_r with (bpow (cexp x)). -unfold round, F2R in Hrx; simpl in Hrx; rewrite <- Hrx. -simpl; ring. -apply Rgt_not_eq, bpow_gt_0. -Qed. - - - -Theorem Rnd_odd_pt_unicity : - forall x f1 f2 : R, - Rnd_odd_pt x f1 -> Rnd_odd_pt x f2 -> - f1 = f2. -Proof. -intros x f1 f2 (Ff1,H1) (Ff2,H2). -(* *) -case (generic_format_EM beta fexp x); intros L. -apply trans_eq with x. -case H1; try easy. -intros (J,_); case J; intros J'. -apply Rnd_DN_pt_idempotent with format; assumption. -apply Rnd_UP_pt_idempotent with format; assumption. -case H2; try easy. -intros (J,_); case J; intros J'; apply sym_eq. -apply Rnd_DN_pt_idempotent with format; assumption. -apply Rnd_UP_pt_idempotent with format; assumption. -(* *) -destruct H1 as [H1|(H1,H1')]. -contradict L; now rewrite <- H1. -destruct H2 as [H2|(H2,H2')]. -contradict L; now rewrite <- H2. -destruct H1 as [H1|H1]; destruct H2 as [H2|H2]. -apply Rnd_DN_pt_unicity with format x; assumption. -destruct H1' as (ff,(K1,(K2,K3))). -destruct H2' as (gg,(L1,(L2,L3))). -absurd (true = false); try discriminate. -rewrite <- L3. -apply trans_eq with (negb (Zeven (Fnum ff))). -rewrite K3; easy. -apply sym_eq. -generalize (DN_UP_parity_generic beta fexp). -unfold DN_UP_parity_prop; intros T; apply (T x); clear T; try assumption... -rewrite <- K1; apply Rnd_DN_pt_unicity with (generic_format beta fexp) x; try easy... -now apply round_DN_pt... -rewrite <- L1; apply Rnd_UP_pt_unicity with (generic_format beta fexp) x; try easy... -now apply round_UP_pt... -(* *) -destruct H1' as (ff,(K1,(K2,K3))). -destruct H2' as (gg,(L1,(L2,L3))). -absurd (true = false); try discriminate. -rewrite <- K3. -apply trans_eq with (negb (Zeven (Fnum gg))). -rewrite L3; easy. -apply sym_eq. -generalize (DN_UP_parity_generic beta fexp). -unfold DN_UP_parity_prop; intros T; apply (T x); clear T; try assumption... -rewrite <- L1; apply Rnd_DN_pt_unicity with (generic_format beta fexp) x; try easy... -now apply round_DN_pt... -rewrite <- K1; apply Rnd_UP_pt_unicity with (generic_format beta fexp) x; try easy... -now apply round_UP_pt... -apply Rnd_UP_pt_unicity with format x; assumption. -Qed. - - - -Theorem Rnd_odd_pt_monotone : - round_pred_monotone (Rnd_odd_pt). -Proof with auto with typeclass_instances. -intros x y f g H1 H2 Hxy. -apply Rle_trans with (round beta fexp Zrnd_odd x). -right; apply Rnd_odd_pt_unicity with x; try assumption. -apply round_odd_pt. -apply Rle_trans with (round beta fexp Zrnd_odd y). -apply round_le... -right; apply Rnd_odd_pt_unicity with y; try assumption. -apply round_odd_pt. -Qed. - - - - -End Fcore_rnd_odd. - -Section Odd_prop_aux. - -Variable beta : radix. -Hypothesis Even_beta: Zeven (radix_val beta)=true. - -Notation bpow e := (bpow beta e). - -Variable fexp : Z -> Z. -Variable fexpe : Z -> Z. - -Context { valid_exp : Valid_exp fexp }. -Context { exists_NE_ : Exists_NE beta fexp }. (* for underflow reason *) -Context { valid_expe : Valid_exp fexpe }. -Context { exists_NE_e : Exists_NE beta fexpe }. (* for defining rounding to odd *) - -Hypothesis fexpe_fexp: forall e, (fexpe e <= fexp e -2)%Z. - - -Lemma generic_format_fexpe_fexp: forall x, - generic_format beta fexp x -> generic_format beta fexpe x. -Proof. -intros x Hx. -apply generic_inclusion_ln_beta with fexp; trivial; intros Hx2. -generalize (fexpe_fexp (ln_beta beta x)). -omega. -Qed. - - - -Lemma exists_even_fexp_lt: forall (c:Z->Z), forall (x:R), - (exists f:float beta, F2R f = x /\ (c (ln_beta beta x) < Fexp f)%Z) -> - exists f:float beta, F2R f =x /\ canonic beta c f /\ Zeven (Fnum f) = true. -Proof with auto with typeclass_instances. -intros c x (g,(Hg1,Hg2)). -exists (Float beta - (Fnum g*Z.pow (radix_val beta) (Fexp g - c (ln_beta beta x))) - (c (ln_beta beta x))). -assert (F2R (Float beta - (Fnum g*Z.pow (radix_val beta) (Fexp g - c (ln_beta beta x))) - (c (ln_beta beta x))) = x). -unfold F2R; simpl. -rewrite Z2R_mult, Z2R_Zpower. -rewrite Rmult_assoc, <- bpow_plus. -rewrite <- Hg1; unfold F2R. -apply f_equal, f_equal. -ring. -omega. -split; trivial. -split. -unfold canonic, canonic_exp. -now rewrite H. -simpl. -rewrite Zeven_mult. -rewrite Zeven_Zpower. -rewrite Even_beta. -apply Bool.orb_true_intro. -now right. -omega. -Qed. - - -Variable choice:Z->bool. -Variable x:R. - - -Variable d u: float beta. -Hypothesis Hd: Rnd_DN_pt (generic_format beta fexp) x (F2R d). -Hypothesis Cd: canonic beta fexp d. -Hypothesis Hu: Rnd_UP_pt (generic_format beta fexp) x (F2R u). -Hypothesis Cu: canonic beta fexp u. - -Hypothesis xPos: (0 < x)%R. - - -Let m:= ((F2R d+F2R u)/2)%R. - - -Lemma d_eq: F2R d= round beta fexp Zfloor x. -Proof with auto with typeclass_instances. -apply Rnd_DN_pt_unicity with (generic_format beta fexp) x... -apply round_DN_pt... -Qed. - - -Lemma u_eq: F2R u= round beta fexp Zceil x. -Proof with auto with typeclass_instances. -apply Rnd_UP_pt_unicity with (generic_format beta fexp) x... -apply round_UP_pt... -Qed. - - -Lemma d_ge_0: (0 <= F2R d)%R. -Proof with auto with typeclass_instances. -rewrite d_eq; apply round_ge_generic... -apply generic_format_0. -now left. -Qed. - - - -Lemma ln_beta_d: (0< F2R d)%R -> - (ln_beta beta (F2R d) = ln_beta beta x :>Z). -Proof with auto with typeclass_instances. -intros Y. -rewrite d_eq; apply ln_beta_DN... -now rewrite <- d_eq. -Qed. - - -Lemma Fexp_d: (0 < F2R d)%R -> Fexp d =fexp (ln_beta beta x). -Proof with auto with typeclass_instances. -intros Y. -now rewrite Cd, <- ln_beta_d. -Qed. - - - -Lemma format_bpow_x: (0 < F2R d)%R - -> generic_format beta fexp (bpow (ln_beta beta x)). -Proof with auto with typeclass_instances. -intros Y. -apply generic_format_bpow. -apply valid_exp. -rewrite <- Fexp_d; trivial. -apply Zlt_le_trans with (ln_beta beta (F2R d))%Z. -rewrite Cd; apply ln_beta_generic_gt... -now apply Rgt_not_eq. -apply Hd. -apply ln_beta_le; trivial. -apply Hd. -Qed. - - -Lemma format_bpow_d: (0 < F2R d)%R -> - generic_format beta fexp (bpow (ln_beta beta (F2R d))). -Proof with auto with typeclass_instances. -intros Y; apply generic_format_bpow. -apply valid_exp. -apply ln_beta_generic_gt... -now apply Rgt_not_eq. -now apply generic_format_canonic. -Qed. - - -Lemma d_le_m: (F2R d <= m)%R. -Proof. -assert (F2R d <= F2R u)%R. - apply Rle_trans with x. - apply Hd. - apply Hu. -unfold m. -lra. -Qed. - -Lemma m_le_u: (m <= F2R u)%R. -Proof. -assert (F2R d <= F2R u)%R. - apply Rle_trans with x. - apply Hd. - apply Hu. -unfold m. -lra. -Qed. - -Lemma ln_beta_m: (0 < F2R d)%R -> (ln_beta beta m =ln_beta beta (F2R d) :>Z). -Proof with auto with typeclass_instances. -intros dPos; apply ln_beta_unique_pos. -split. -apply Rle_trans with (F2R d). -destruct (ln_beta beta (F2R d)) as (e,He). -simpl. -rewrite Rabs_right in He. -apply He. -now apply Rgt_not_eq. -apply Rle_ge; now left. -apply d_le_m. -case m_le_u; intros H. -apply Rlt_le_trans with (1:=H). -rewrite u_eq. -apply round_le_generic... -apply generic_format_bpow. -apply valid_exp. -apply ln_beta_generic_gt... -now apply Rgt_not_eq. -now apply generic_format_canonic. -case (Rle_or_lt x (bpow (ln_beta beta (F2R d)))); trivial; intros Z. -absurd ((bpow (ln_beta beta (F2R d)) <= (F2R d)))%R. -apply Rlt_not_le. -destruct (ln_beta beta (F2R d)) as (e,He). -simpl in *; rewrite Rabs_right in He. -apply He. -now apply Rgt_not_eq. -apply Rle_ge; now left. -apply Rle_trans with (round beta fexp Zfloor x). -2: right; apply sym_eq, d_eq. -apply round_ge_generic... -apply generic_format_bpow. -apply valid_exp. -apply ln_beta_generic_gt... -now apply Rgt_not_eq. -now apply generic_format_canonic. -now left. -replace m with (F2R d). -destruct (ln_beta beta (F2R d)) as (e,He). -simpl in *; rewrite Rabs_right in He. -apply He. -now apply Rgt_not_eq. -apply Rle_ge; now left. -unfold m in H |- *. -lra. -Qed. - - -Lemma ln_beta_m_0: (0 = F2R d)%R - -> (ln_beta beta m =ln_beta beta (F2R u)-1:>Z)%Z. -Proof with auto with typeclass_instances. -intros Y. -apply ln_beta_unique_pos. -unfold m; rewrite <- Y, Rplus_0_l. -rewrite u_eq. -destruct (ln_beta beta x) as (e,He). -rewrite Rabs_pos_eq in He by now apply Rlt_le. -rewrite round_UP_small_pos with (ex:=e). -rewrite ln_beta_bpow. -ring_simplify (fexp e + 1 - 1)%Z. -split. -unfold Zminus; rewrite bpow_plus. -unfold Rdiv; apply Rmult_le_compat_l. -apply bpow_ge_0. -simpl; unfold Z.pow_pos; simpl. -rewrite Zmult_1_r; apply Rinv_le. -exact Rlt_0_2. -apply (Z2R_le 2). -specialize (radix_gt_1 beta). -omega. -apply Rlt_le_trans with (bpow (fexp e)*1)%R. -2: right; ring. -unfold Rdiv; apply Rmult_lt_compat_l. -apply bpow_gt_0. -lra. -now apply He, Rgt_not_eq. -apply exp_small_round_0_pos with beta (Zfloor) x... -now apply He, Rgt_not_eq. -now rewrite <- d_eq, Y. -Qed. - - - - - -Lemma u'_eq: (0 < F2R d)%R -> exists f:float beta, F2R f = F2R u /\ (Fexp f = Fexp d)%Z. -Proof with auto with typeclass_instances. -intros Y. -rewrite u_eq; unfold round. -eexists; repeat split. -simpl; now rewrite Fexp_d. -Qed. - - - - -Lemma m_eq: (0 < F2R d)%R -> exists f:float beta, - F2R f = m /\ (Fexp f = fexp (ln_beta beta x) -1)%Z. -Proof with auto with typeclass_instances. -intros Y. -specialize (Zeven_ex (radix_val beta)); rewrite Even_beta. -intros (b, Hb); rewrite Zplus_0_r in Hb. -destruct u'_eq as (u', (Hu'1,Hu'2)); trivial. -exists (Fmult beta (Float beta b (-1)) (Fplus beta d u'))%R. -split. -rewrite F2R_mult, F2R_plus, Hu'1. -unfold m; rewrite Rmult_comm. -unfold Rdiv; apply f_equal. -unfold F2R; simpl; unfold Z.pow_pos; simpl. -rewrite Zmult_1_r, Hb, Z2R_mult. -simpl; field. -apply Rgt_not_eq, Rmult_lt_reg_l with (1 := Rlt_0_2). -rewrite Rmult_0_r, <- (Z2R_mult 2), <-Hb. -apply radix_pos. -apply trans_eq with (-1+Fexp (Fplus beta d u'))%Z. -unfold Fmult. -destruct (Fplus beta d u'); reflexivity. -rewrite Zplus_comm; unfold Zminus; apply f_equal2. -2: reflexivity. -rewrite Fexp_Fplus. -rewrite Z.min_l. -now rewrite Fexp_d. -rewrite Hu'2; omega. -Qed. - -Lemma m_eq_0: (0 = F2R d)%R -> exists f:float beta, - F2R f = m /\ (Fexp f = fexp (ln_beta beta (F2R u)) -1)%Z. -Proof with auto with typeclass_instances. -intros Y. -specialize (Zeven_ex (radix_val beta)); rewrite Even_beta. -intros (b, Hb); rewrite Zplus_0_r in Hb. -exists (Fmult beta (Float beta b (-1)) u)%R. -split. -rewrite F2R_mult; unfold m; rewrite <- Y, Rplus_0_l. -rewrite Rmult_comm. -unfold Rdiv; apply f_equal. -unfold F2R; simpl; unfold Z.pow_pos; simpl. -rewrite Zmult_1_r, Hb, Z2R_mult. -simpl; field. -apply Rgt_not_eq, Rmult_lt_reg_l with (1 := Rlt_0_2). -rewrite Rmult_0_r, <- (Z2R_mult 2), <-Hb. -apply radix_pos. -apply trans_eq with (-1+Fexp u)%Z. -unfold Fmult. -destruct u; reflexivity. -rewrite Zplus_comm, Cu; unfold Zminus; now apply f_equal2. -Qed. - -Lemma fexp_m_eq_0: (0 = F2R d)%R -> - (fexp (ln_beta beta (F2R u)-1) < fexp (ln_beta beta (F2R u))+1)%Z. -Proof with auto with typeclass_instances. -intros Y. -assert ((fexp (ln_beta beta (F2R u) - 1) <= fexp (ln_beta beta (F2R u))))%Z. -2: omega. -destruct (ln_beta beta x) as (e,He). -rewrite Rabs_right in He. -2: now left. -assert (e <= fexp e)%Z. -apply exp_small_round_0_pos with beta (Zfloor) x... -now apply He, Rgt_not_eq. -now rewrite <- d_eq, Y. -rewrite u_eq, round_UP_small_pos with (ex:=e); trivial. -2: now apply He, Rgt_not_eq. -rewrite ln_beta_bpow. -ring_simplify (fexp e + 1 - 1)%Z. -replace (fexp (fexp e)) with (fexp e). -case exists_NE_; intros V. -contradict V; rewrite Even_beta; discriminate. -rewrite (proj2 (V e)); omega. -apply sym_eq, valid_exp; omega. -Qed. - -Lemma Fm: generic_format beta fexpe m. -case (d_ge_0); intros Y. -(* *) -destruct m_eq as (g,(Hg1,Hg2)); trivial. -apply generic_format_F2R' with g. -now apply sym_eq. -intros H; unfold canonic_exp; rewrite Hg2. -rewrite ln_beta_m; trivial. -rewrite <- Fexp_d; trivial. -rewrite Cd. -unfold canonic_exp. -generalize (fexpe_fexp (ln_beta beta (F2R d))). -omega. -(* *) -destruct m_eq_0 as (g,(Hg1,Hg2)); trivial. -apply generic_format_F2R' with g. -assumption. -intros H; unfold canonic_exp; rewrite Hg2. -rewrite ln_beta_m_0; try assumption. -apply Zle_trans with (1:=fexpe_fexp _). -assert (fexp (ln_beta beta (F2R u)-1) < fexp (ln_beta beta (F2R u))+1)%Z;[idtac|omega]. -now apply fexp_m_eq_0. -Qed. - - - -Lemma Zm: - exists g : float beta, F2R g = m /\ canonic beta fexpe g /\ Zeven (Fnum g) = true. -Proof with auto with typeclass_instances. -case (d_ge_0); intros Y. -(* *) -destruct m_eq as (g,(Hg1,Hg2)); trivial. -apply exists_even_fexp_lt. -exists g; split; trivial. -rewrite Hg2. -rewrite ln_beta_m; trivial. -rewrite <- Fexp_d; trivial. -rewrite Cd. -unfold canonic_exp. -generalize (fexpe_fexp (ln_beta beta (F2R d))). -omega. -(* *) -destruct m_eq_0 as (g,(Hg1,Hg2)); trivial. -apply exists_even_fexp_lt. -exists g; split; trivial. -rewrite Hg2. -rewrite ln_beta_m_0; trivial. -apply Zle_lt_trans with (1:=fexpe_fexp _). -assert (fexp (ln_beta beta (F2R u)-1) < fexp (ln_beta beta (F2R u))+1)%Z;[idtac|omega]. -now apply fexp_m_eq_0. -Qed. - - -Lemma DN_odd_d_aux: forall z, (F2R d<= z< F2R u)%R -> - Rnd_DN_pt (generic_format beta fexp) z (F2R d). -Proof with auto with typeclass_instances. -intros z Hz1. -replace (F2R d) with (round beta fexp Zfloor z). -apply round_DN_pt... -case (Rnd_DN_UP_pt_split _ _ _ _ Hd Hu (round beta fexp Zfloor z)). -apply generic_format_round... -intros Y; apply Rle_antisym; trivial. -apply round_DN_pt... -apply Hd. -apply Hz1. -intros Y; absurd (z < z)%R. -auto with real. -apply Rlt_le_trans with (1:=proj2 Hz1), Rle_trans with (1:=Y). -apply round_DN_pt... -Qed. - -Lemma UP_odd_d_aux: forall z, (F2R d< z <= F2R u)%R -> - Rnd_UP_pt (generic_format beta fexp) z (F2R u). -Proof with auto with typeclass_instances. -intros z Hz1. -replace (F2R u) with (round beta fexp Zceil z). -apply round_UP_pt... -case (Rnd_DN_UP_pt_split _ _ _ _ Hd Hu (round beta fexp Zceil z)). -apply generic_format_round... -intros Y; absurd (z < z)%R. -auto with real. -apply Rle_lt_trans with (2:=proj1 Hz1), Rle_trans with (2:=Y). -apply round_UP_pt... -intros Y; apply Rle_antisym; trivial. -apply round_UP_pt... -apply Hu. -apply Hz1. -Qed. - - -Theorem round_odd_prop_pos: - round beta fexp (Znearest choice) (round beta fexpe Zrnd_odd x) = - round beta fexp (Znearest choice) x. -Proof with auto with typeclass_instances. -set (o:=round beta fexpe Zrnd_odd x). -case (generic_format_EM beta fexp x); intros Hx. -replace o with x; trivial. -unfold o; apply sym_eq, round_generic... -now apply generic_format_fexpe_fexp. -assert (K1:(F2R d <= o)%R). -apply round_ge_generic... -apply generic_format_fexpe_fexp, Hd. -apply Hd. -assert (K2:(o <= F2R u)%R). -apply round_le_generic... -apply generic_format_fexpe_fexp, Hu. -apply Hu. -assert (P:(x <> m -> o=m -> (forall P:Prop, P))). -intros Y1 Y2. -assert (H:(Rnd_odd_pt beta fexpe x o)). -apply round_odd_pt... -destruct H as (_,H); destruct H. -absurd (x=m)%R; try trivial. -now rewrite <- Y2, H. -destruct H as (_,(k,(Hk1,(Hk2,Hk3)))). -destruct Zm as (k',(Hk'1,(Hk'2,Hk'3))). -absurd (true=false). -discriminate. -rewrite <- Hk3, <- Hk'3. -apply f_equal, f_equal. -apply canonic_unicity with fexpe... -now rewrite Hk'1, <- Y2. -assert (generic_format beta fexp o -> (forall P:Prop, P)). -intros Y. -assert (H:(Rnd_odd_pt beta fexpe x o)). -apply round_odd_pt... -destruct H as (_,H); destruct H. -absurd (generic_format beta fexp x); trivial. -now rewrite <- H. -destruct H as (_,(k,(Hk1,(Hk2,Hk3)))). -destruct (exists_even_fexp_lt fexpe o) as (k',(Hk'1,(Hk'2,Hk'3))). -eexists; split. -apply sym_eq, Y. -simpl; unfold canonic_exp. -apply Zle_lt_trans with (1:=fexpe_fexp _). -omega. -absurd (true=false). -discriminate. -rewrite <- Hk3, <- Hk'3. -apply f_equal, f_equal. -apply canonic_unicity with fexpe... -now rewrite Hk'1, <- Hk1. -case K1; clear K1; intros K1. -2: apply H; rewrite <- K1; apply Hd. -case K2; clear K2; intros K2. -2: apply H; rewrite K2; apply Hu. -case (Rle_or_lt x m); intros Y;[destruct Y|idtac]. -(* . *) -apply trans_eq with (F2R d). -apply round_N_eq_DN_pt with (F2R u)... -apply DN_odd_d_aux; split; try left; assumption. -apply UP_odd_d_aux; split; try left; assumption. -assert (o <= (F2R d + F2R u) / 2)%R. -apply round_le_generic... -apply Fm. -now left. -destruct H1; trivial. -apply P. -now apply Rlt_not_eq. -trivial. -apply sym_eq, round_N_eq_DN_pt with (F2R u)... -(* . *) -replace o with x. -reflexivity. -apply sym_eq, round_generic... -rewrite H0; apply Fm. -(* . *) -apply trans_eq with (F2R u). -apply round_N_eq_UP_pt with (F2R d)... -apply DN_odd_d_aux; split; try left; assumption. -apply UP_odd_d_aux; split; try left; assumption. -assert ((F2R d + F2R u) / 2 <= o)%R. -apply round_ge_generic... -apply Fm. -now left. -destruct H0; trivial. -apply P. -now apply Rgt_not_eq. -rewrite <- H0; trivial. -apply sym_eq, round_N_eq_UP_pt with (F2R d)... -Qed. - - -End Odd_prop_aux. - -Section Odd_prop. - -Variable beta : radix. -Hypothesis Even_beta: Zeven (radix_val beta)=true. - -Variable fexp : Z -> Z. -Variable fexpe : Z -> Z. -Variable choice:Z->bool. - -Context { valid_exp : Valid_exp fexp }. -Context { exists_NE_ : Exists_NE beta fexp }. (* for underflow reason *) -Context { valid_expe : Valid_exp fexpe }. -Context { exists_NE_e : Exists_NE beta fexpe }. (* for defining rounding to odd *) - -Hypothesis fexpe_fexp: forall e, (fexpe e <= fexp e -2)%Z. - - -Theorem canonizer: forall f, generic_format beta fexp f - -> exists g : float beta, f = F2R g /\ canonic beta fexp g. -Proof with auto with typeclass_instances. -intros f Hf. -exists (Float beta (Ztrunc (scaled_mantissa beta fexp f)) (canonic_exp beta fexp f)). -assert (L:(f = F2R (Float beta (Ztrunc (scaled_mantissa beta fexp f)) (canonic_exp beta fexp f)))). -apply trans_eq with (round beta fexp Ztrunc f). -apply sym_eq, round_generic... -reflexivity. -split; trivial. -unfold canonic; rewrite <- L. -reflexivity. -Qed. - - - - -Theorem round_odd_prop: forall x, - round beta fexp (Znearest choice) (round beta fexpe Zrnd_odd x) = - round beta fexp (Znearest choice) x. -Proof with auto with typeclass_instances. -intros x. -case (total_order_T x 0); intros H; [case H; clear H; intros H | idtac]. -rewrite <- (Ropp_involutive x). -rewrite round_odd_opp. -rewrite 2!round_N_opp. -apply f_equal. -destruct (canonizer (round beta fexp Zfloor (-x))) as (d,(Hd1,Hd2)). -apply generic_format_round... -destruct (canonizer (round beta fexp Zceil (-x))) as (u,(Hu1,Hu2)). -apply generic_format_round... -apply round_odd_prop_pos with d u... -rewrite <- Hd1; apply round_DN_pt... -rewrite <- Hu1; apply round_UP_pt... -auto with real. -(* . *) -rewrite H; repeat rewrite round_0... -(* . *) -destruct (canonizer (round beta fexp Zfloor x)) as (d,(Hd1,Hd2)). -apply generic_format_round... -destruct (canonizer (round beta fexp Zceil x)) as (u,(Hu1,Hu2)). -apply generic_format_round... -apply round_odd_prop_pos with d u... -rewrite <- Hd1; apply round_DN_pt... -rewrite <- Hu1; apply round_UP_pt... -Qed. - - -End Odd_prop. |