Library FnormI
Require Export FboundI.
Section FboundedI_Def.
Variable radix : Z.
Hypothesis radixMoreThanOne : (1 < radix)%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Theorem LexicoPosCanI :
forall (b : FboundI) (x y : float),
FcanonicI radix b x ->
FboundedI b y -> (0 <= x)%R -> (x <= y)%R -> (Fexp x <= Fexp y)%Z.
Theorem LexicoNegCanI :
forall (b : FboundI) (x y : float),
FcanonicI radix b x ->
FboundedI b y -> (x <= 0)%R -> (y <= x)%R -> (Fexp x <= Fexp y)%Z.
Theorem LexicoCanI :
forall (b : FboundI) (x y : float),
Zabs_nat (vNumInf b - vNumSup b) <= 1 ->
FcanonicI radix b x ->
FboundedI b y -> (Rabs x < Rabs y)%R -> (Fexp x <= Fexp y)%Z.
Theorem ReductRangeI :
forall (b b' : FboundI) (p : nat),
vNumInf b = vNumInf b' ->
dExpI b = dExpI b' ->
Z_of_nat (vNumSup b) = (vNumSup b' + 1)%Z ->
Z_of_nat (vNumSup b) = (radix * p)%Z ->
forall x : float,
FboundedI b x -> exists y : float, FboundedI b' y /\ x = y :>R.
Theorem ReductRangeIInv :
forall b b' : FboundI,
vNumInf b = vNumInf b' ->
dExpI b = dExpI b' ->
Z_of_nat (vNumSup b) = (vNumSup b' + 1)%Z ->
(forall x : float,
FboundedI b x -> exists y : float, FboundedI b' y /\ FtoRradix x = y) ->
exists p : Z, Z_of_nat (vNumSup b) = (radix * p)%Z.
End FboundedI_Def.
Section FroundI.
Variable radix : Z.
Hypothesis radixMoreThanOne : (1 < radix)%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Variable b : FboundI.
Hypothesis vNumSupGreaterThanOne : (1 <= vNumSup b)%Z.
Hypothesis vNumInfGreaterThanOne : (1 <= vNumInf b)%Z.
Definition isMinI (r : R) (min : float) :=
FboundedI b min /\
(min <= r)%R /\
(forall f : float, FboundedI b f -> (f <= r)%R -> (f <= min)%R).
Definition isMaxI (r : R) (max : float) :=
FboundedI b max /\
(r <= max)%R /\
(forall f : float, FboundedI b f -> (r <= f)%R -> (max <= f)%R).
Definition ProjectorPI (P : R -> float -> Prop) :=
forall p q : float, FboundedI b p -> P p q -> p = q :>R.
Definition MonotonePI (P : R -> float -> Prop) :=
forall (p q : R) (p' q' : float),
(p < q)%R -> P p p' -> P q q' -> (p' <= q')%R.
Definition TotalPI (P : R -> float -> Prop) :=
forall r : R, exists p : float, P r p.
Definition CompatiblePI (P : R -> float -> Prop) :=
forall (r1 r2 : R) (p q : float),
P r1 p -> r1 = r2 -> p = q :>R -> FboundedI b q -> P r2 q.
Definition MinOrMaxPI (P : R -> float -> Prop) :=
forall (r : R) (p : float), P r p -> isMinI r p \/ isMaxI r p.
Definition RoundedModePI (P : R -> float -> Prop) :=
TotalPI P /\ CompatiblePI P /\ MinOrMaxPI P /\ MonotonePI P.
Theorem ProjectMinI : ProjectorPI isMinI.
Theorem ProjectMaxI : ProjectorPI isMaxI.
Theorem RoundedProjectorI : forall P, RoundedModePI P -> ProjectorPI P.
Theorem RoundedModeProjectorIdemI :
forall P (p : float), RoundedModePI P -> FboundedI b p -> P p p.
Theorem OppositeIUnique_1 :
forall (x y z : float) P,
RoundedModePI P ->
FboundedI b x ->
FboundedI b y ->
(- x < y)%R -> P (x + y)%R z -> (powerRZ radix (- dExpI b) <= z)%R.
Theorem OppositeIUnique_2 :
forall (x y z : float) P,
RoundedModePI P ->
FboundedI b x ->
FboundedI b y ->
(y < - x)%R -> P (x + y)%R z -> (powerRZ radix (- dExpI b) <= - z)%R.
Theorem OppositeIUnique :
forall (x y z : float) P,
RoundedModePI P ->
FboundedI b x ->
FboundedI b y ->
(- x)%R <> y -> P (x + y)%R z -> (powerRZ radix (- dExpI b) <= Rabs z)%R.
End FroundI.
Section FpropI.
Variable radix : Z.
Hypothesis radixMoreThanOne : (1 < radix)%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Variable b : FboundI.
Theorem SterbenzIAux1 :
forall x y : float,
FboundedI b x ->
FboundedI b y ->
(y <= x)%R -> (x <= 2%nat * y)%R -> FboundedI b (Fminus radix x y).
Theorem SterbenzOppI :
forall x y : float,
(forall u : float, FboundedI b u ->
exists v : float, FtoRradix v = (- u)%R /\ FboundedI b v) ->
FboundedI b x -> FboundedI b y ->
(/ 2%nat * y <= x)%R -> (x <= 2%nat * y)%R ->
exists z : float,
FtoRradix z = (x - y)%R /\ FboundedI b z.
Theorem FoppBoundedI :
forall (b : FboundI) (x : float) (m : nat),
Z_of_nat (vNumSup b) = (radix * m - 1%nat)%Z ->
Z_of_nat (vNumInf b) = (radix * m)%Z ->
FboundedI b x ->
exists y : float,
FtoRradix y = (- x)%R /\ FboundedI b y.
Theorem FoppBoundedI2 :
forall (b0 : FboundI) (x : float) (p : nat),
Z_of_nat (vNumInf b0) = (radix * p - 1%nat)%Z ->
Z_of_nat (vNumSup b0) = (radix * p)%Z ->
FboundedI b0 x -> exists y : float, FtoRradix y = (- x)%R /\ FboundedI b0 y.
Theorem FoppBoundedIInv_aux :
forall n : Z,
(vNumSup b + 1%nat <= - n)%Z ->
(- n <= vNumInf b)%Z ->
(forall x : float,
FboundedI b x -> exists y : float, FtoRradix y = (- x)%R /\ FboundedI b y) ->
exists p : Z, n = (radix * p)%Z.
Theorem FoppBoundedIExp :
forall (x : float) (p : nat),
Z_of_nat (vNumSup b) = (radix * p - 1%nat)%Z ->
Z_of_nat (vNumInf b) = (radix * p)%Z ->
FboundedI b x ->
exists y : float,
FtoRradix y = (- x)%R /\
FboundedI b y /\ (Fexp y = Fexp x \/ Fexp y = Zsucc (Fexp x)).
Theorem nat_div_one : forall n m : nat, m * n = 1 -> m = 1.
Theorem Z_div_one :
forall (n : nat) (z : Z), (z * Z_of_nat n)%Z = Z_of_nat 1 -> n = 1.
Theorem FoppBoundedIInv :
(vNumSup b < vNumInf b)%Z ->
(forall x : float, FboundedI b x ->
exists y : float, FtoRradix y = (- x)%R /\ FboundedI b y) ->
(exists m : Z,
Z_of_nat (vNumInf b) = (radix * m)%Z) /\
Z_of_nat (vNumInf b) = (vNumSup b + 1%nat)%Z.
Theorem SterbenzIAux2A :
forall (x y : float) (n : nat),
Zabs_nat (vNumInf b - vNumSup b) <= n ->
FboundedI b x ->
FboundedI b y ->
(Fexp y <= Fexp x)%Z ->
(y <= x)%R ->
(x <= 2%nat * y - n * powerRZ radix (Fexp y))%R ->
(Fminus radix y x <= 0)%R ->
(- vNumInf b <= - vNumSup b + n)%Z -> FboundedI b (Fminus radix y x).
Theorem SterbenzIAux2B :
forall (x y : float) (n : nat),
Zabs_nat (vNumInf b - vNumSup b) <= n ->
FboundedI b x ->
FboundedI b y ->
(Fexp x <= Fexp y)%Z ->
(y <= 0)%R ->
(y <= x)%R ->
(x <= 2%nat * y - n * powerRZ radix (Fexp x))%R ->
(Fminus radix y x <= 0)%R ->
(- vNumInf b <= - vNumSup b + n)%Z -> FboundedI b (Fminus radix y x).
Theorem SterbenzIAux2 :
forall (x y : float) (n : nat),
Zabs_nat (vNumInf b - vNumSup b) <= n ->
FboundedI b x ->
FcanonicI radix b y ->
FboundedI b y ->
(y <= x)%R ->
(x <= 2%nat * y - n * powerRZ radix (Zmin (Fexp y) (Fexp x)))%R ->
FboundedI b (Fminus radix y x).
Theorem SterbenzI :
forall (x y : float) (n : nat),
Zabs_nat (vNumInf b - vNumSup b) <= n ->
FboundedI b x -> FcanonicI radix b x -> FboundedI b y ->
(/ 2%nat * y + / 2%nat * (n * powerRZ radix (Zmin (Fexp x) (Fexp y))) <= x)%R ->
(x <= 2%nat * y)%R ->
FboundedI b (Fminus radix x y).
End FpropI.
Section SterbenzApproxIAux.
Variable radix : Z.
Hypothesis radixMoreThanOne : (1 < radix)%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Variables (b1 : FboundI) (b2 : FboundI).
Theorem SterbenzApproxI_aux1 :
forall (rho : R) (x y : float),
(0 < rho)%R ->
IZR (Zsucc (vNumSup b1)) = (rho * Zsucc (vNumSup b2))%R ->
(- dExpI b2 <= - dExpI b1)%Z ->
FboundedI b1 x ->
FboundedI b1 y ->
(0 <= y)%R ->
(y <= x)%R ->
(x <= (1 + / rho) * y)%R ->
FboundedI b2 (Fminus radix x (FnormalizeI radix b1 y)).
Theorem SterbenzApproxI_1 :
forall (rho : R) (x y : float),
(0 < rho)%R ->
IZR (Zsucc (vNumSup b1)) = (rho * Zsucc (vNumSup b2))%R ->
(- dExpI b2 <= - dExpI b1)%Z ->
(forall x : float,
FboundedI b2 x -> exists y : float, y = (- x)%R :>R /\ FboundedI b2 y) ->
FboundedI b1 x ->
FboundedI b1 y ->
(/ (1 + / rho) * y <= x)%R ->
(x <= (1 + / rho) * y)%R ->
exists u : float, u = (x - y)%R :>R /\ FboundedI b2 u.
Theorem SterbenzApproxI_aux2 :
forall (rho : R) (x y : float),
(0 < rho)%R ->
IZR (Zsucc (vNumSup b1)) = (rho * Zsucc (vNumInf b2))%R ->
(- dExpI b2 <= - dExpI b1)%Z ->
FboundedI b1 x ->
FboundedI b1 y ->
(0 <= y)%R ->
(y <= x)%R ->
(x <= (1 + / rho) * y)%R ->
FboundedI b2 (Fminus radix (FnormalizeI radix b1 y) x).
Theorem SterbenzApproxI_2 :
forall (rho : R) (x y : float),
(0 < rho)%R ->
IZR (Zsucc (vNumSup b1)) = (rho * Zsucc (vNumInf b2))%R ->
(- dExpI b2 <= - dExpI b1)%Z ->
(forall x : float,
FboundedI b2 x -> exists y : float, y = (- x)%R :>R /\ FboundedI b2 y) ->
FboundedI b1 x ->
FboundedI b1 y ->
(/ (1 + / rho) * y <= x)%R ->
(x <= (1 + / rho) * y)%R ->
exists u : float, u = (x - y)%R :>R /\ FboundedI b2 u.
End SterbenzApproxIAux.
Section SterbenzApproxI.
Variable radix : Z.
Hypothesis radixMoreThanOne : (1 < radix)%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
Variables (b1 : FboundI) (b2 : FboundI).
Theorem SterbenzApproxI_3 :
forall (rho : R) (x y : float),
(0 < rho)%R ->
IZR (Zsucc (vNumInf b1)) = (rho * Zsucc (vNumInf b2))%R ->
(- dExpI b2 <= - dExpI b1)%Z ->
(forall x : float,
FboundedI b2 x -> exists y : float, y = (- x)%R :>R /\ FboundedI b2 y) ->
FboundedI b1 x ->
FboundedI b1 y ->
(x <= / (1 + / rho) * y)%R ->
((1 + / rho) * y <= x)%R ->
exists u : float, u = (x - y)%R :>R /\ FboundedI b2 u.
Theorem SterbenzApproxI_4 :
forall (rho : R) (x y : float),
(0 < rho)%R ->
IZR (Zsucc (vNumInf b1)) = (rho * Zsucc (vNumSup b2))%R ->
(- dExpI b2 <= - dExpI b1)%Z ->
(forall x : float,
FboundedI b2 x -> exists y : float, y = (- x)%R :>R /\ FboundedI b2 y) ->
FboundedI b1 x ->
FboundedI b1 y ->
(x <= / (1 + / rho) * y)%R ->
((1 + / rho) * y <= x)%R ->
exists u : float, u = (x - y)%R :>R /\ FboundedI b2 u.
Theorem SterbenzApproxI_pos :
forall (rho : R) (x y : float),
(0 < rho)%R ->
rho =
Rmin
(Rmin (Zsucc (vNumInf b1) / Zsucc (vNumInf b2))
(Zsucc (vNumSup b1) / Zsucc (vNumSup b2)))
(Rmin (Zsucc (vNumInf b1) / Zsucc (vNumSup b2))
(Zsucc (vNumSup b1) / Zsucc (vNumInf b2))) ->
(- dExpI b2 <= - dExpI b1)%Z ->
(forall x : float,
FboundedI b2 x -> exists y : float, y = (- x)%R :>R /\ FboundedI b2 y) ->
(forall x : float,
FboundedI b1 x -> exists y : float, y = (- x)%R :>R /\ FboundedI b1 y) ->
FboundedI b1 x ->
FboundedI b1 y ->
(/ (1 + / rho) * y <= x)%R ->
(x <= (1 + / rho) * y)%R ->
exists u : float, u = (x - y)%R :>R /\ FboundedI b2 u.
Theorem SterbenzApproxI :
forall (rho : R) (x y : float),
(0 < rho)%R ->
rho = Rmin
(Rmin (Zsucc (vNumInf b1) / Zsucc (vNumInf b2))
(Zsucc (vNumSup b1) / Zsucc (vNumSup b2)))
(Rmin (Zsucc (vNumInf b1) / Zsucc (vNumSup b2))
(Zsucc (vNumSup b1) / Zsucc (vNumInf b2))) ->
(- dExpI b2 <= - dExpI b1)%Z ->
(forall x : float,
FboundedI b2 x -> exists y : float, y = (- x)%R :>R /\ FboundedI b2 y) ->
(forall x : float,
FboundedI b1 x -> exists y : float, y = (- x)%R :>R /\ FboundedI b1 y) ->
FboundedI b1 x -> FboundedI b1 y ->
(0 <= x * y)%R ->
(/ (1 + / rho) * Rabs y <= Rabs x)%R ->
(Rabs x <= (1 + / rho) * Rabs y)%R ->
exists u : float,
u = (x - y)%R :>R /\ FboundedI b2 u.
End SterbenzApproxI.