Library Axpy

Require Export MinOrMax.
Section AxpyMisc.

Let radix := 2%Z.

Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Variable b : Fbound.
Variable precision : nat.
Hypothesis precisionGreaterThanOne : 1 < precision.
Hypothesis pGivesBound : Zpos (vNum b) = Zpower_nat radix precision.

Theorem TwoMoreThanOne : (1 < radix)%Z.
Hint Resolve TwoMoreThanOne.

Theorem TwoMoreThanOneR : (1 < radix)%R.
Hint Resolve TwoMoreThanOneR.

Theorem FulpLeGeneral :
 forall p : float,
 Fbounded b p ->
 (Fulp b radix precision p <=
  Rabs (FtoRradix p) * powerRZ radix (Zsucc (- precision)) +
  powerRZ radix (- dExp b))%R.

Theorem RoundLeGeneral :
 forall (p : float) (z : R),
 Fbounded b p ->
 Closest b radix z p ->
 (Rabs p <=
  Rabs z * / (1 - powerRZ radix (- precision)) +
  powerRZ radix (Zpred (- dExp b)) * / (1 - powerRZ radix (- precision)))%R.

Theorem RoundGeGeneral :
 forall (p : float) (z : R),
 Fbounded b p ->
 Closest b radix z p ->
 (Rabs z * / (1 + powerRZ radix (- precision)) -
  powerRZ radix (Zpred (- dExp b)) * / (1 + powerRZ radix (- precision)) <=
  Rabs p)%R.

Theorem ExactSum_Near :
 forall p q f : float,
 Fbounded b p ->
 Fbounded b q ->
 Fbounded b f ->
 Closest b radix (p + q) f ->
 Fexp p = (- dExp b)%Z ->
 (Rabs (p + q - f) < powerRZ radix (- dExp b))%R -> (p + q)%R = f.
End AxpyMisc.
Section AxpyAux.
Add Field RField : Rfield (completeness Zeq_bool_complete).

Let radix := 2%Z.

Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Variable b : Fbound.
Variable precision : nat.
Hypothesis precisionGreaterThanOne : 1 < precision.
Hypothesis pGivesBound : Zpos (vNum b) = Zpower_nat radix precision.
Variables a1 x1 y1 : R.
Variables a x y t u r : float.
Hypothesis Fa : Fbounded b a.
Hypothesis Fx : Fbounded b x.
Hypothesis Fy : Fbounded b y.
Hypothesis Ft : Fbounded b t.
Hypothesis Fu : Fbounded b u.
Hypothesis tDef : Closest b radix (a * x) t.
Hypothesis uDef : Closest b radix (t + y) u.
Hypothesis rDef : isMin b radix (a1 * x1 + y1) r.

Theorem Axpy_aux1 :
 Fcanonic radix b u ->
 (Rabs (FtoRradix a * FtoRradix x - FtoRradix t) <=
  / 4%nat * Fulp b radix precision (FPred b radix precision u))%R ->
 (0 < u)%R ->
 (4%nat * Rabs t <= Rabs u)%R ->
 (Rabs (y1 - y) + Rabs (a1 * x1 - a * x) <
  / 4%nat * Fulp b radix precision (FPred b radix precision u))%R ->
 MinOrMax radix b (a1 * x1 + y1) u.

Theorem Axpy_aux1_aux1 :
 Fnormal radix b t ->
 Fcanonic radix b u ->
 (0 < u)%R ->
 (4%nat * Rabs t <= Rabs u)%R ->
 (Rabs (FtoRradix a * FtoRradix x - FtoRradix t) <=
  / 4%nat * Fulp b radix precision (FPred b radix precision u))%R.

Theorem Axpy_aux2 :
 Fcanonic radix b u ->
 Fsubnormal radix b t ->
 (0 < u)%R ->
 FtoRradix u = (t + y)%R ->
 (Rabs (y1 - y) + Rabs (a1 * x1 - a * x) <
  / 4%nat * Fulp b radix precision (FPred b radix precision u))%R ->
 MinOrMax radix b (a1 * x1 + y1) u.

Theorem Axpy_aux1_aux2 :
 Fsubnormal radix b t ->
 Fcanonic radix b u ->
 (0 < u)%R ->
 (Zsucc (- dExp b) <= Fexp (FPred b radix precision u))%Z ->
 (Rabs (FtoRradix a * FtoRradix x - FtoRradix t) <=
  / 4%nat * Fulp b radix precision (FPred b radix precision u))%R.

Theorem Axpy_aux1_aux3 :
 Fsubnormal radix b t ->
 Fcanonic radix b u ->
 (0 < u)%R ->
 (Zsucc (- dExp b) <= Fexp (FPred b radix precision u))%Z ->
 (Rabs (FtoRradix a * FtoRradix x - FtoRradix t) <=
  / 4%nat * Fulp b radix precision (FPred b radix precision u))%R.

Theorem Axpy_aux3 :
 Fcanonic radix b u ->
 Fsubnormal radix b t ->
 (0 < u)%R ->
 Fexp (FPred b radix precision u) = (- dExp b)%Z ->
 (Zsucc (- dExp b) <= Fexp u)%Z ->
 (Rabs (y1 - y) + Rabs (a1 * x1 - a * x) <
  / 4%nat * Fulp b radix precision (FPred b radix precision u))%R ->
 MinOrMax radix b (a1 * x1 + y1) u.

Theorem AxpyPos :
 Fcanonic radix b u ->
 Fcanonic radix b t ->
 (0 < u)%R ->
 (4%nat * Rabs t <= Rabs u)%R ->
 (Rabs (y1 - y) + Rabs (a1 * x1 - a * x) <
  / 4%nat * Fulp b radix precision (FPred b radix precision u))%R ->
 MinOrMax radix b (a1 * x1 + y1) u.

Definition FLess (p : float) :=
  match Rcase_abs p with
  | left _ => FSucc b radix precision p
  | right _ => FPred b radix precision p
  end.

Theorem UlpFlessuGe_aux :
 forall p : float,
 Fbounded b p ->
 Fcanonic radix b p ->
 (Rabs p - Fulp b radix precision p <= Rabs (FLess p))%R.

Theorem UlpFlessuGe :
 Fcanonic radix b u ->
 (/
  (4%nat * (powerRZ radix precision - 1) * (1 + powerRZ radix (- precision))) *
  ((1 - powerRZ radix (Zsucc (- precision))) * Rabs y) +
  -
  (/
   (4%nat * (powerRZ radix precision - 1) * (1 + powerRZ radix (- precision)) *
    (1 - powerRZ radix (- precision))) *
   ((1 - powerRZ radix (Zsucc (- precision))) * Rabs (a * x))) +
  -
  (powerRZ radix (Zpred (- dExp b)) *
   (/ (2%nat * (powerRZ radix precision - 1)) +
    /
    (4%nat * (powerRZ radix precision - 1) *
     (1 + powerRZ radix (- precision)) * (1 - powerRZ radix (- precision))) *
    (1 - powerRZ radix (Zsucc (- precision))))) <=
  / 4%nat * Fulp b radix precision (FLess u))%R.

Theorem UlpFlessuGe2 :
 Fcanonic radix b u ->
 (powerRZ radix (Zpred (Zpred (- precision))) *
  (1 - powerRZ radix (Zsucc (- precision))) * Rabs y +
  - (powerRZ radix (Zpred (Zpred (- precision))) * Rabs (a * x)) +
  - powerRZ radix (Zpred (Zpred (- dExp b))) <
  / 4%nat * Fulp b radix precision (FLess u))%R.
End AxpyAux.
Section Axpy.

Let radix := 2%Z.

Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Variable b : Fbound.
Variable precision : nat.
Hypothesis precisionGreaterThanOne : 1 < precision.
Hypothesis pGivesBound : Zpos (vNum b) = Zpower_nat radix precision.

Theorem Axpy_tFlessu :
 forall (a1 x1 y1 : R) (a x y t u : float),
 Fbounded b a ->
 Fbounded b x ->
 Fbounded b y ->
 Fbounded b t ->
 Fbounded b u ->
 Closest b radix (a * x) t ->
 Closest b radix (t + y) u ->
 Fcanonic radix b u ->
 Fcanonic radix b t ->
 (4%nat * Rabs t <= Rabs u)%R ->
 (Rabs (y1 - y) + Rabs (a1 * x1 - a * x) <
  / 4%nat * Fulp b radix precision (FLess b precision u))%R ->
 MinOrMax radix b (a1 * x1 + y1) u.

Theorem Axpy_opt :
 forall (a1 x1 y1 : R) (a x y t u : float),
 (Fbounded b a) -> (Fbounded b x) -> (Fbounded b y) ->
 (Fbounded b t) -> (Fbounded b u) ->
 (Closest b radix (a * x) t) ->
 (Closest b radix (t + y) u) ->
 (Fcanonic radix b u) -> (Fcanonic radix b t) ->
 ((5%nat + 4%nat * (powerRZ radix (- precision))) *
    / (1 - powerRZ radix (- precision)) *
    (Rabs (a * x) + (powerRZ radix (Zpred (- dExp b))))
    <= Rabs y)%R ->
 (Rabs (y1 - y) + Rabs (a1 * x1 - a * x) <=
    (powerRZ radix (Zpred (Zpred (- precision)))) *
    (1 - powerRZ radix (Zsucc (- precision))) * Rabs y +
    - (powerRZ radix (Zpred (Zpred (- precision))) * Rabs (a * x)) +
    - powerRZ radix (Zpred (Zpred (- dExp b))))%R ->
         (MinOrMax radix b (a1 * x1 + y1) u).

Theorem Axpy_Simpl1 :
 forall (a1 x1 y1 : R) (a x y t u : float),
 4 <= precision ->
 Fbounded b a ->
 Fbounded b x ->
 Fbounded b y ->
 Fbounded b t ->
 Fbounded b u ->
 Closest b radix (a * x) t ->
 Closest b radix (t + y) u ->
 Fcanonic radix b u ->
 Fcanonic radix b t ->
 (6%nat * (Rabs (a * x) + powerRZ radix (Zpred (- dExp b))) <= Rabs y)%R ->
 (Rabs (y1 - y) + Rabs (a1 * x1 - a * x) <=
  powerRZ radix (Zpred (Zpred (- precision))) *
  (1 - powerRZ radix (Zsucc (- precision))) * Rabs y +
  - (powerRZ radix (Zpred (Zpred (- precision))) * Rabs (a * x)) +
  - powerRZ radix (Zpred (Zpred (- dExp b))))%R ->
 MinOrMax radix b (a1 * x1 + y1) u.

Theorem Axpy_Simpl1bis :
 forall (a1 x1 y1 : R) (a x y t u : float),
 4 <= precision ->
 Fbounded b a ->
 Fbounded b x ->
 Fbounded b y ->
 Fbounded b t ->
 Fbounded b u ->
 Closest b radix (a * x) t ->
 Closest b radix (t + y) u ->
 Fcanonic radix b u ->
 Fcanonic radix b t ->
 (6%nat * (Rabs (a * x) + powerRZ radix (Zpred (- dExp b))) <= Rabs y)%R ->
 (Rabs (y1 - y) + Rabs (a1 * x1 - a * x) <=
  powerRZ radix (Zpred (Zpred (- precision))) *
  (5%nat * / 6%nat - powerRZ radix (Zsucc (- precision))) *
  Rabs y + - powerRZ radix (Zpred (Zpred (- dExp b))))%R ->
 MinOrMax radix b (a1 * x1 + y1) u.

Theorem Axpy_Simpl2 :
 forall (a1 x1 y1 : R) (a x y t u : float),
 4 <= precision ->
 Fbounded b a ->
 Fbounded b x ->
 Fbounded b y ->
 Fbounded b t ->
 Fbounded b u ->
 Closest b radix (a * x) t ->
 Closest b radix (t + y) u ->
 Fcanonic radix b u ->
 Fcanonic radix b t ->
 (6%nat * (Rabs (a * x) + powerRZ radix (Zpred (- dExp b))) <= Rabs y)%R ->
 (Rabs (y1 - y) + Rabs (a1 * x1 - a * x) <=
  powerRZ radix (Zpred (Zpred (- precision))) * (2%nat * / 3%nat) * Rabs y +
  - powerRZ radix (Zpred (Zpred (- dExp b))))%R ->
 MinOrMax radix b (a1 * x1 + y1) u.
End Axpy.
Section AxpyFmac.

Let radix := 2%Z.

Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Variable b : Fbound.
Variable precision : nat.
Hypothesis precisionGreaterThanOne : 1 < precision.
Hypothesis pGivesBound : Zpos (vNum b) = Zpower_nat radix precision.

Theorem AxpyPos_Fmac :
 forall (a1 x1 y1 : R) (a x y u : float),
 Fbounded b a ->
 Fbounded b x ->
 Fbounded b y ->
 Fbounded b u ->
 Closest b radix (a * x + y) u ->
 Fcanonic radix b u ->
 (0 < u)%R ->
 (Rabs (y1 - y) + Rabs (a1 * x1 - a * x) <
  / 2%nat * Fulp b radix precision (FPred b radix precision u))%R ->
 MinOrMax radix b (a1 * x1 + y1) u.

Theorem AxpyFLessu_Fmac :
 forall (a1 x1 y1 : R) (a x y u : float),
 Fbounded b a ->
 Fbounded b x ->
 Fbounded b y ->
 Fbounded b u ->
 Closest b radix (a * x + y) u ->
 Fcanonic radix b u ->
 (Rabs (y1 - y) + Rabs (a1 * x1 - a * x) <
  / 2%nat * Fulp b radix precision (FLess b precision u))%R ->
 MinOrMax radix b (a1 * x1 + y1) u.

Theorem Axpy_opt_Fmac :
 forall (a1 x1 y1 : R) (a x y u : float),
 (Fbounded b a) -> (Fbounded b x) -> (Fbounded b y) -> (Fbounded b u) ->
 (Closest b radix (a * x + y) u) ->
 (Fcanonic radix b u) ->
 (Rabs (y1 - y) + Rabs (a1 * x1 - a * x) <
   (Rabs (a * x + y)) * (powerRZ radix (Zpred (- precision)) *
   (1 - powerRZ radix (Zsucc (- precision)))) -
   powerRZ radix (Zpred (Zpred (- dExp b))) *
   (3 * / (powerRZ radix precision - powerRZ radix (- precision))))%R ->
      (MinOrMax radix b (a1 * x1 + y1) u).
End AxpyFmac.