Library FroundMult
Require Export FroundProp.
Section FRoundP.
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 errorBoundedMultMin :
forall p q fmin : float,
Fbounded b p ->
Fbounded b q ->
(0 <= p)%R ->
(0 <= q)%R ->
(- dExp b <= Fexp p + Fexp q)%Z ->
isMin b radix (p * q) fmin ->
exists r : float,
r = (p * q - fmin)%R :>R /\ Fbounded b r /\ Fexp r = (Fexp p + Fexp q)%Z.
Theorem errorBoundedMultMax :
forall p q fmax : float,
Fbounded b p ->
Fbounded b q ->
(0 <= p)%R ->
(0 <= q)%R ->
(- dExp b <= Fexp p + Fexp q)%Z ->
isMax b radix (p * q) fmax ->
exists r : float,
FtoRradix r = (p * q - fmax)%R /\
Fbounded b r /\ Fexp r = (Fexp p + Fexp q)%Z.
Theorem multExpMin :
forall P,
RoundedModeP b radix P ->
forall p q pq : float,
P (p * q)%R pq ->
exists s : float,
Fbounded b s /\ s = pq :>R /\ (Fexp p + Fexp q <= Fexp s)%Z.
Theorem multExpUpperBound :
forall P,
RoundedModeP b radix P ->
forall p q pq : float,
P (p * q)%R pq ->
Fbounded b p ->
Fbounded b q ->
(- dExp b <= Fexp p + Fexp q)%Z ->
exists r : float,
Fbounded b r /\ r = pq :>R /\ (Fexp r <= precision + (Fexp p + Fexp q))%Z.
Theorem errorBoundedMultPos :
forall P,
RoundedModeP b radix P ->
forall p q f : float,
Fbounded b p ->
Fbounded b q ->
(0 <= p)%R ->
(0 <= q)%R ->
(- dExp b <= Fexp p + Fexp q)%Z ->
P (p * q)%R f ->
exists r : float,
r = (p * q - f)%R :>R /\ Fbounded b r /\ Fexp r = (Fexp p + Fexp q)%Z.
Theorem errorBoundedMultNeg :
forall P,
RoundedModeP b radix P ->
forall p q f : float,
Fbounded b p ->
Fbounded b q ->
(p <= 0)%R ->
(0 <= q)%R ->
(- dExp b <= Fexp p + Fexp q)%Z ->
P (p * q)%R f ->
exists r : float,
r = (p * q - f)%R :>R /\ Fbounded b r /\ Fexp r = (Fexp p + Fexp q)%Z.
Theorem errorBoundedMult :
forall P,
RoundedModeP b radix P ->
forall p q f : float,
Fbounded b p ->
Fbounded b q ->
(- dExp b <= Fexp p + Fexp q)%Z ->
P (p * q)%R f ->
exists r : float,
r = (p * q - f)%R :>R /\ Fbounded b r /\ Fexp r = (Fexp p + Fexp q)%Z.
Theorem errorBoundedMultExp_aux :
forall n1 n2 : Z,
(Zabs n1 < Zpos (vNum b))%Z ->
(Zabs n2 < Zpos (vNum b))%Z ->
(exists ny : Z,
(exists ey : Z,
(n1 * n2)%R = (ny * powerRZ radix ey)%R :>R /\
(Zabs ny < Zpos (vNum b))%Z)) ->
exists nx : Z,
(exists ex : Z,
(n1 * n2)%R = (nx * powerRZ radix ex)%R :>R /\
(Zabs nx < Zpos (vNum b))%Z /\
(0 <= ex)%Z /\ (ex <= precision)%Z).
Theorem errorBoundedMultExpPos :
forall P,
RoundedModeP b radix P ->
forall p q pq : float,
Fbounded b p ->
Fbounded b q ->
(0 <= p)%R ->
(0 <= q)%R ->
P (p * q)%R pq ->
(- dExp b <= Fexp p + Fexp q)%Z ->
ex
(fun r : float =>
ex
(fun s : float =>
Fbounded b r /\
Fbounded b s /\
r = pq :>R /\
s = (p * q - r)%R :>R /\
Fexp s = (Fexp p + Fexp q)%Z :>Z /\
(Fexp s <= Fexp r)%Z /\ (Fexp r <= precision + (Fexp p + Fexp q))%Z)).
Theorem errorBoundedMultExp :
forall P, (RoundedModeP b radix P) ->
forall p q pq : float,
(Fbounded b p) -> (Fbounded b q) ->
(P (p * q)%R pq) ->
(-(dExp b) <= Fexp p + Fexp q)%Z ->
exists r : float,
exists s : float,
(Fbounded b r) /\ (Fbounded b s) /\
r = pq :>R /\ s = (p * q - r)%R :>R /\
(Fexp s = Fexp p + Fexp q)%Z /\
(Fexp s <= Fexp r)%Z /\
(Fexp r <= precision + (Fexp p + Fexp q))%Z.
End FRoundP.