Library FmaEmul

Require Export DblRndOdd.
Require Export FboundI.
Require Export MinOrMax.
Require Export DoubleRound.

Section Prelim.

Variable b : Fbound.
Variable radix : Z.
Variable precision : nat.

Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Hypothesis radixMoreThanOne : (1 < radix)%Z.

Let radixMoreThanZERO := Zlt_1_O _ (Zlt_le_weak _ _ radixMoreThanOne).
Hint Resolve radixMoreThanZERO: zarith.
Hypothesis precisionGreaterThanOne : 1 < precision.
Hypothesis pGivesBound : Zpos (vNum b) = Zpower_nat radix precision.

Theorem plusExactSub: forall (P : R -> float -> Prop) (x y r : float),
   (RoundedModeP b radix P) ->
     (Fsubnormal radix b x) -> (Fsubnormal radix b y) ->
       (P (x+y)%R r)
   -> (FtoRradix r=x+y)%R.

End Prelim.

Section Sec1.

Variable bo : Fbound.
Let radix := 2%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Variable p : nat.

Hypotheses pGreaterThanOne : (lt (S O) p).
Hypotheses pGivesBound : (Zpos (vNum bo)) = (Zpower_nat radix p).

Theorem AddOddEven_aux_aux: forall (x y:float),
        (5* (Rabs y) <= x)%R -> (0 < x)%R
   -> (5*(firstNormalPos radix bo p) <= x)%R
   -> (Fcanonic radix bo y) ->(Fcanonic radix bo x) ->
   (exists k:nat, exists be:Fbound, exists xy:float,
        (1 < k) /\ (Zpos (vNum be)) = (Zpower_nat radix (p+k))
          /\ (- dExp be <= Zpred (Zpred (- dExp bo)))%Z
         /\ (FtoRradix xy =x+y)%R
         /\ (Fnormal radix be xy) /\ (Fexp xy=Fexp y)).

Theorem AddOddEven_aux: forall (x y f1 f2:float) (z:R),
   (5* (Rabs y) <= x)%R -> (0 < x)%R ->
   (5*(firstNormalPos radix bo p) <= x)%R ->
   (Fcanonic radix bo y) ->(Fcanonic radix bo x) ->
   (To_Odd bo radix p z y) ->
   (EvenClosest bo radix p (x+y)%R f1) ->
   (EvenClosest bo radix p (x+z)%R f2) ->
       (FtoRradix f1=f2)%R.

Theorem AddOddEven_can: forall (x y f1 f2:float) (z:R),
   (5*(Rabs y) <= Rabs x)%R ->
    (5*(firstNormalPos radix bo p) <= Rabs x)%R ->
   Fcanonic radix bo y ->(Fcanonic radix bo x) ->
   (To_Odd bo radix p z y) ->
   (EvenClosest bo radix p (x+y)%R f1) ->
   (EvenClosest bo radix p (x+z)%R f2) ->
       (FtoRradix f1=f2)%R.

Theorem AddOddEven: forall (x y f1 f2:float) (z:R),
  (Fbounded bo x) ->
   (5*(Rabs y) <= Rabs x)%R ->
    (5*(firstNormalPos radix bo p) <= Rabs x)%R ->
   (To_Odd bo radix p z y) ->
   (EvenClosest bo radix p (x+y)%R f1) ->
   (EvenClosest bo radix p (x+z)%R f2) ->
       (FtoRradix f1=f2)%R.

Theorem AddOddEven2: forall (x y f1 f2:float) (z:R),
   (3 < p) ->
   (6*(Rabs z) <= Rabs x)%R ->
    (5*(firstNormalPos radix bo p) <= Rabs x)%R ->
   Fcanonic radix bo y ->(Fcanonic radix bo x) ->
   (To_Odd bo radix p z y) ->
   (EvenClosest bo radix p (x+y)%R f1) ->
   (EvenClosest bo radix p (x+z)%R f2) ->
       (FtoRradix f1=f2)%R.

End Sec1.

Section Sec2.

Variable bo : Fbound.
Let radix := 2%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Variable p : nat.

Hypotheses pGreaterThanOne : (lt (S O) p).
Hypotheses pGivesBound : (Zpos (vNum bo)) = (Zpower_nat radix p).
Hypotheses pGe : (5 <= p).

Variable a b c uh ul th tl v z:float.

Hypothesis Fa : Fbounded bo a.
Hypothesis Fb : Fbounded bo b.
Hypothesis Fc : Fbounded bo c.
Hypothesis Fuh: Fbounded bo uh.
Hypothesis Ful: Fbounded bo ul.
Hypothesis Fth: Fbounded bo th.
Hypothesis Ftl: Fbounded bo tl.
Hypothesis Fv : Fbounded bo v.
Hypothesis Fz : Fbounded bo z.
Hypothesis Cth: Fcanonic radix bo th.
Hypothesis Cuh: Fcanonic radix bo uh.
Hypothesis Ctl: Fcanonic radix bo tl.
Hypothesis Cul: Fcanonic radix bo ul.

Hypothesis uhDef: (Closest bo radix (a*b)%R uh).
Hypothesis ulDef: (FtoRradix ul=a*b-uh)%R.
Hypothesis thDef: (Closest bo radix (c+uh)%R th).
Hypothesis tlDef: (FtoRradix tl=c+uh-th)%R.
Hypothesis vDef: (To_Odd bo radix p (tl+ul)%R v).
Hypothesis zDef: (EvenClosest bo radix p (th+v)%R z).

Theorem FmaEmulAux: (EvenClosest bo radix p (a*b+c)%R z).

End Sec2.

Section Sec3.

Variable bo : Fbound.
Let radix := 2%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Variable p : nat.

Hypotheses pGivesBound : (Zpos (vNum bo)) = (Zpower_nat radix p).
Hypotheses pGe : (5 <= p).

Variable a b c uh ul th tl v z:float.

Hypothesis Fa : Fbounded bo a.
Hypothesis Fb : Fbounded bo b.
Hypothesis Fc : Fbounded bo c.
Hypothesis Ful: Fbounded bo ul.

Hypothesis uhDef: (Closest bo radix (a*b)%R uh).
Hypothesis ulDef: (FtoRradix ul=a*b-uh)%R.
Hypothesis thDef: (Closest bo radix (c+uh)%R th).
Hypothesis tlDef: (FtoRradix tl=c+uh-th)%R.
Hypothesis vDef: (To_Odd bo radix p (tl+ul)%R v).
Hypothesis zDef: (EvenClosest bo radix p (th+v)%R z).

Theorem FmaEmul: (EvenClosest bo radix p (a*b+c)%R z).

End Sec3.

Section Sec4.
Variables b be : Fbound.
Variables p k : nat.
Variables y z v: float.
Variables x : R.

Let radix := 2%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.

Theorem Zpos_eq_eq: forall (a b:positive),
   (Zpos a=Zpos b) -> a=b.

Hypotheses pGreaterThanOne : (lt (S O) p).
Hypotheses kGreaterThanOne : (le O k).
Hypotheses pGivesBound : (Zpos (vNum b)) = (Zpower_nat radix p).
Hypotheses pkGivesBounde : (Zpos (vNum be)) = (Zpower_nat radix (plus p k)).

Hypothesis Cy: (Fcanonic radix be y).
Hypothesis Cz: (Fcanonic radix b z).

Hypotheses ydef : (To_Odd be radix (plus p k) x y).
Hypotheses zdef : (To_Odd b radix p y z).
Hypotheses vdef : (To_Odd b radix p x v).

Hypotheses rangeext: (-(dExp be) = ( -k-(dExp b)))%Z.

Theorem FevenMakesFNeven: forall b:Fbound, forall p:nat, forall f g:float,
   Zpos (vNum b) = Zpower_nat radix p -> (0 < p) ->
    Fbounded b g -> Fbounded b f ->
    Feven g -> FtoRradix g=f -> FNeven b radix p f.

Theorem To_Odd_Odd_is_Odd: ((FtoRradix v)=(FtoRradix z))%R.


End Sec4.

Section Sec5.

Variable bo : Fbound.
Let radix := 2%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Variable p : nat.

Hypotheses pGreaterThanOne: (lt (S O) p).
Hypotheses pGivesBound : (Zpos (vNum bo)) = (Zpower_nat radix p).
Hypotheses dExpBig : (p <= dExp bo)%Z.

Theorem AddOddOdd_aux_aux: forall (x y:float),
      (2* (Rabs y) <= x)%R -> (0 < x)%R
   -> (2*(firstNormalPos radix bo p) <= x)%R
   -> (Fcanonic radix bo y) ->(Fcanonic radix bo x) ->
   (exists k:nat, exists be:Fbound, exists xy:float,
        (0 <= k) /\ (Zpos (vNum be)) = (Zpower_nat radix (p+k))
          /\ (- dExp be = -k - dExp bo)%Z
         /\ (FtoRradix xy =x+y)%R
         /\ (Fnormal radix be xy) /\ (Fexp xy=Fexp y)).

Theorem AddOddOdd_aux: forall (x y f1 f2:float) (z:R),
   (2* (Rabs y) <= x)%R -> (0 < x)%R ->
   (2*(firstNormalPos radix bo p) <= x)%R ->
   (Fcanonic radix bo y) ->(Fcanonic radix bo x) ->
   (To_Odd bo radix p z y) ->
   (To_Odd bo radix p (x+y)%R f1) ->
   (To_Odd bo radix p (x+z)%R f2) ->
       (FtoRradix f1=f2)%R.

Theorem AddOddOdd_can: forall (x y f1 f2:float) (z:R),
    (2*(Rabs y) <= Rabs x)%R ->
    (2*(firstNormalPos radix bo p) <= Rabs x)%R ->
   Fcanonic radix bo y ->(Fcanonic radix bo x) ->
   (To_Odd bo radix p z y) ->
   (To_Odd bo radix p (x+y)%R f1) ->
   (To_Odd bo radix p (x+z)%R f2) ->
       (FtoRradix f1=f2)%R.

Theorem AddOddOdd: forall (x y f1 f2:float) (z:R),
   (Fbounded bo x) ->
   (2*(Rabs y) <= Rabs x)%R ->
   (2*(firstNormalPos radix bo p) <= Rabs x)%R ->
   (To_Odd bo radix p z y) ->
   (To_Odd bo radix p (x+y)%R f1) ->
   (To_Odd bo radix p (x+z)%R f2) ->
       (FtoRradix f1=f2)%R.

Theorem AddOddOdd2_can: forall (x y f1 f2:float) (z:R),
    (2*(Rabs z) <= Rabs x)%R ->
    (2*(firstNormalPos radix bo p) <= Rabs x)%R ->
   Fcanonic radix bo y ->(Fcanonic radix bo x) ->
   (To_Odd bo radix p z y) ->
   (To_Odd bo radix p (x+y)%R f1) ->
   (To_Odd bo radix p (x+z)%R f2) ->
       (FtoRradix f1=f2)%R.

Theorem AddOddOdd2:
  forall (x y f1 f2:float) (z:R),
  Fbounded bo x ->
  (2*(Rabs z) <= Rabs x)%R ->
  (2*(firstNormalPos radix bo p) <= Rabs x)%R ->
  To_Odd bo radix p z y ->
  To_Odd bo radix p (x+y)%R f1 ->
  To_Odd bo radix p (x+z)%R f2 ->
  (FtoRradix f1 = f2)%R.

End Sec5.