FArgReduct2

# Library FArgReduct2

``
FArgReduct2 file
Sylvie Boldo
This file explains an improvement of Cody & Waite argument reduction technique using the FMA (fused-multiply-and-add).
`Require Export FArgReduct.
Section Reduct.
Let radix := 2%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
`
Variables
`
Variable b : Fbound.
Variables prec q : nat.
Variables k N : Z.
Variables alpha gamma x zH : float.
Variable zL : R.
`
Various bounds
`
Let bmoinsq :=
Bound
(P_of_succ_nat (pred (Zabs_nat (Zpower_nat radix (prec - q)))))
(dExp b).
Let bzH :=
Bound
(P_of_succ_nat
(pred (Zabs_nat (Zpower_nat radix (Zabs_nat (Zsucc (k + N)))))))
(dExp b).
Let b1 :=
Bound
(P_of_succ_nat
(pred
(Zabs_nat (Zpower_nat radix (prec - q + Zabs_nat (Zsucc (k + N)))))))
(dExp b).
`
All the hypotheses
`
Hypothesis pGivesBound : Zpos (vNum b) = Zpower_nat radix prec.
Hypothesis Fboundedx : Fbounded b x.
`
alpha (the constant, such as pi) and gamma (its inverse)
`Hypothesis gammaInvalpha : Closest bmoinsq radix (/ alpha) gamma.
Hypothesis alphaNormal : Fnormal radix b alpha.
Hypothesis gammaNormal : Fnormal radix bmoinsq gamma.
Hypothesis alphaPos : (0 < alpha)%R.
Hypothesis gammaPos : (0 < gamma)%R.
Hypothesis
gamma_not_pow_2 : forall e : Z, FtoRradix gamma <> powerRZ radix e.
`
zH, the approximation of x*alpha
`Hypothesis zHNormal : Fnormal radix bzH zH.
Hypothesis zHDef : (Rabs (x * alpha - zH) <= powerRZ radix (Zpred (- N)))%R.
Hypothesis zLDef : zL = (x * alpha - zH)%R.
Hypothesis NDef : N = (- Fexp zH)%Z.
Hypothesis zHPos : (0 <= zH)%R.
`
Various precisions: gamma on p-q bits and zH on k+N+1
`Hypothesis precMoreThanThree : 3 < prec.
Hypothesis pMoinsqGreaterThanOne : 1 < prec - q.
Hypothesis preczH_Less_Than_Prec : (Zsucc (k + N) <= Zpred prec)%Z.
Hypothesis preczH_Pos : (0 <= Zsucc (k + N))%Z.
Hypothesis preczH_Greater_Than_One : 1 < Zabs_nat (Zsucc (k + N)).
Hypothesis q_enough : (2 <= q)%Z.
Hypothesis q_not_too_big : (q <= Zsucc (k + N))%Z.
`
No underflow
`Hypothesis
exp_alpha_enough : (- dExp b <= Zsucc q + - (Fexp alpha + (prec + prec)))%Z.
Hypothesis exp_gamma_enough : (- dExp b <= Fexp zH + Fexp gamma)%Z.
`
A few lemmas
`
Theorem minus_Zminus_precq : (prec - q)%Z = prec - q.
Theorem vNum_eq_Zpower :
forall n : nat,
Zpos
(vNum
(Bound (P_of_succ_nat (pred (Zabs_nat (Zpower_nat radix n))))
(dExp b))) = Zpower_nat radix n.
Theorem vNum_eq_Zpower_bmoinsq :
Zpos (vNum bmoinsq) = Zpower_nat radix (prec - q).
Theorem vNum_eq_Zpower_bzH :
Zpos (vNum bzH) = Zpower_nat radix (Zabs_nat (Zsucc (k + N))).
Theorem vNum_eq_Zpower_bzH2 :
powerRZ radix (Zsucc (k + N)) = Zpos (vNum bzH).
Theorem vNum_eq_Zpower_b1 :
Zpos (vNum b1) =
Zpower_nat radix (prec - q + Zabs_nat (Zsucc (k + N))).
Theorem vNum_eq_Zpower_b1bis :
powerRZ radix (prec - q + Zsucc (k + N)) = Zpos (vNum b1).
Theorem prec1_Greater_Than_One : 1 < prec - q + Zabs_nat (Zsucc (k + N)).
Hint Resolve vNum_eq_Zpower_b1 vNum_eq_Zpower_b1bis prec1_Greater_Than_One
vNum_eq_Zpower_bzH vNum_eq_Zpower_bzH2 vNum_eq_Zpower
vNum_eq_Zpower_bmoinsq minus_Zminus_precq: zarith.
`
First results
`
Theorem gamma_exp : Fexp gamma = (Zsucc q + - (Fexp alpha + (prec + prec)))%Z.
Theorem delta_inf : (Rabs (1 - alpha * gamma) <= powerRZ radix (q - prec))%R.
Theorem zL_over_zH : (Rabs (zL / zH) <= powerRZ radix (- Zsucc (k + N)))%R.
Theorem x_over_zHgamma_eq :
(x / (zH * gamma))%R = ((1 + zL / zH) / (1 + (alpha * gamma - 1)))%R.
Theorem SterbenzApprox3 :
forall (rho : R) (x y : float) (b1 b2: Fbound) (prec1 prec2: nat),
1 < prec1 -> 1 < prec2
-> Zpos (vNum b1) = Zpower_nat radix prec1
-> Zpos (vNum b2) = Zpower_nat radix prec2 ->
(0 < rho)%R ->
IZR (Zpos (vNum b1)) = (rho * Zpos (vNum b2))%R ->
(- dExp b2 <= - dExp b1)%Z ->
Fbounded b1 x ->
Fbounded b1 y ->
(/ (1 + / rho) * y <= x)%R ->
(x <= (1 + / rho) * y)%R ->
Fbounded b2
(Fminus radix (Fnormalize radix b1 prec1 x) (Fnormalize radix b1 prec1 y))
/\ (Rabs (x-y) <= /rho*Rmin x y)%R.
`
Main theorem
`
Theorem Fmac_arg_reduct_correct1_aux :
ex (fun u : float => FtoRradix u = (x - zH * gamma)%R /\ Fbounded b u)
/\ (Rabs (x-zH*gamma) < powerRZ radix (prec-N+Fexp gamma))%R.
End Reduct.
Section Reduct2.
Let radix := 2%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
`
Variables
`
Variable b : Fbound.
Variables prec q : nat.
Variables k N : Z.
Variables alpha gamma x zH : float.
Variable zL : R.
`
Various bounds
`
Let bmoinsq :=
Bound
(P_of_succ_nat (pred (Zabs_nat (Zpower_nat radix (prec - q)))))
(dExp b).
Let bzH :=
Bound
(P_of_succ_nat
(pred (Zabs_nat (Zpower_nat radix (Zabs_nat (Zsucc (k + N)))))))
(dExp b).
Let b1 :=
Bound
(P_of_succ_nat
(pred
(Zabs_nat (Zpower_nat radix (prec - q + Zabs_nat (Zsucc (k + N)))))))
(dExp b).
`
All the hypotheses
`
Hypothesis precMoreThanThree : 3 < prec.
Hypothesis pGivesBound : Zpos (vNum b) = Zpower_nat radix prec.
Hypothesis Fboundedx : Fbounded b x.
Hypothesis alphaNormal : Fnormal radix b alpha.
Hypothesis gammaNormal : Fnormal radix bmoinsq gamma.
Hypothesis alphaPos : (0 < alpha)%R.
Hypothesis gammaPos : (0 < gamma)%R.
Hypothesis q_enough : (2 <= q)%Z.
Hypothesis pMoinsqGreaterThanOne : 1 < prec - q.
Hypothesis gammaInvalpha : Closest bmoinsq radix (/ alpha) gamma.
Hypothesis
gamma_not_pow_2 : forall e : Z, FtoRradix gamma <> powerRZ radix e.
Hypothesis zHPos : (0 <= zH)%R.
Hypothesis zHDef : (Rabs (x * alpha - zH) <= powerRZ radix (Zpred (- N)))%R.
Hypothesis zLDef : zL = (x * alpha - zH)%R.
Hypothesis preczH_Less_Than_Prec : (Zsucc (k + N) <= Zpred prec)%Z.
Hypothesis preczH_Pos : (2 <= Zsucc (k + N))%Z.
Hypothesis NDef : N = (- Fexp zH)%Z.
Hypothesis zHNormal : Fnormal radix bzH zH.
Hypothesis q_not_too_big : (q <= Zsucc (k + N))%Z.
Hypothesis gamma_ge: (powerRZ radix (-dExp b+prec -q +(Zmax 1 (N-1)))<= gamma)%R.
`
Same as previous, but with an inequality for gamma for the no-unverflow
`
Theorem Fmac_arg_reduct_correct1_aux2 :
ex (fun u : float => FtoRradix u = (x - zH * gamma)%R /\ Fbounded b u)
/\ (Rabs (x-zH*gamma) < powerRZ radix (prec-N+Fexp gamma))%R.
End Reduct2.
Section Reduct3.
Let radix := 2%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
`
Variables
`
Variable b : Fbound.
Variables prec q : nat.
Variables k N : Z.
Variables alpha gamma x zH : float.
Variable zL : R.
`
Various bounds
`
Let bmoinsq :=
Bound
(P_of_succ_nat (pred (Zabs_nat (Zpower_nat radix (prec - q)))))
(dExp b).
Let bzH :=
Bound
(P_of_succ_nat
(pred (Zabs_nat (Zpower_nat radix (Zabs_nat (Zsucc (k + N)))))))
(dExp b).
Let b1 :=
Bound
(P_of_succ_nat
(pred
(Zabs_nat (Zpower_nat radix (prec - q + Zabs_nat (Zsucc (k + N)))))))
(dExp b).
`
All the hypotheses
`
Hypothesis precMoreThanThree : 3 < prec.
Hypothesis pGivesBound : Zpos (vNum b) = Zpower_nat radix prec.
Hypothesis Fboundedx : Fbounded b x.
`
alpha (the constant, such as pi) and gamma (its inverse)
`Hypothesis alphaNormal : Fnormal radix b alpha.
Hypothesis gammaNormal : Fnormal radix bmoinsq gamma.
Hypothesis alphaPos : (0 < alpha)%R.
Hypothesis gammaPos : (0 < gamma)%R.
`
q such that gamma is on prec-q bits
`Hypothesis q_enough : (2 <= q)%Z.
Hypothesis pMoinsqGreaterThanOne : 1 < prec - q.
Hypothesis gammaInvalpha : Closest bmoinsq radix (/ alpha) gamma.
Hypothesis
gamma_not_pow_2 : forall e : Z, FtoRradix gamma <> powerRZ radix e.
`
zH, the approximation of x*alpha
`Hypothesis zHDef : (Rabs (x * alpha - zH) <= powerRZ radix (Zpred (- N)))%R.
Hypothesis zLDef : zL = (x * alpha - zH)%R.
Hypothesis preczH_Less_Than_Prec : (Zsucc (k + N) <= Zpred prec)%Z.
Hypothesis preczH_Pos : (2 <= Zsucc (k + N))%Z.
Hypothesis NDef : N = (- Fexp zH)%Z.
Hypothesis zHNormal : Fnormal radix bzH zH.
Hypothesis q_not_too_big : (q <= Zsucc (k + N))%Z.
`
No underflow
`Hypothesis gamma_ge: (powerRZ radix (-dExp b+prec -q +(Zmax 1 (N-1)))<= gamma)%R.
`
Main result, works fine except when z=2^(-N)
`
Theorem Fmac_arg_reduct_correct1 :
ex (fun u : float => FtoRradix u = (x - zH * gamma)%R /\ Fbounded b u)
/\ (Rabs (x-zH*gamma) < powerRZ radix (prec-N+Fexp gamma))%R.
End Reduct3.
Section Algo.
Let radix := 2%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
`
Variables
`
Variable b : Fbound.
Variable prec : nat.
Variable N : Z.
Variables alpha x u zH1 : float.
Let bzH (k : Z) :=
Bound
(P_of_succ_nat
(pred (Zabs_nat (Zpower_nat radix (Zabs_nat (Zsucc (k + N)))))))
(dExp b).
`
All the hypotheses
`
Hypothesis pGivesBound : Zpos (vNum b) = Zpower_nat radix prec.
Hypothesis precMoreThanOne : 1 < prec.
Hypothesis Fboundedx : Fbounded b x.
Hypothesis alphaNormal : Fnormal radix b alpha.
Hypothesis alphaPos : (0 < alpha)%R.
`
Algorithm to compute z
`Hypothesis
uDef :
Closest b radix
(3%nat * powerRZ radix (Zpred (Zpred (prec - N))) + x * alpha) u.
Hypothesis
zH1Def :
Closest b radix (u - 3%nat * powerRZ radix (Zpred (Zpred (prec - N))))
zH1.
Hypothesis xPos : (0 <= x)%R.
Hypothesis p_enough : (3 < prec)%Z.
Hypothesis N_not_too_big : (N <= dExp b)%Z.
`
As before, zH shall no be 2^(-N)
`Hypothesis zH_not_too_small : (powerRZ radix (2 - Zsucc N) <= zH1)%R.
`
And x must not be too big
`Hypothesis
xalpha_small :
(x * alpha <=
powerRZ radix (Zpred (Zpred (prec - N))) - powerRZ radix (- N))%R.
`
A few lemmas
`
Theorem vNum_eq_Zpower_bzH_fn :
forall k : Z,
Zpos (vNum (bzH k)) = Zpower_nat radix (Zabs_nat (Zsucc (k + N))).
Theorem vNum_eq_Zpower_bzH2_fn :
forall k : Z,
(0 <= Zsucc (k + N))%Z ->
powerRZ radix (Zsucc (k + N)) = Zpos (vNum (bzH k)).
Hint Resolve vNum_eq_Zpower_bzH_fn vNum_eq_Zpower_bzH2_fn: zarith.
Theorem zH1Pos : (0 <= zH1)%R.
`
First computation correct
`
Theorem zH1_eq :
FtoRradix zH1 = (u - 3%nat * powerRZ radix (Zpred (Zpred (prec - N))))%R.
Theorem Normal_and_exp :
forall (f : float) (d : Fbound) (e : Z) (p : nat),
Zpos (vNum d) = Zpower_nat radix p ->
1 < p ->
Fbounded d f ->
(- dExp d <= e)%Z ->
(powerRZ radix (Zpred p + e) <= f)%R ->
(f < powerRZ radix (p + e))%R -> Fexp (Fnormalize radix d p f) = e.
Theorem Fexp_u : Fexp (Fnormalize radix b prec u) = (- N)%Z.
Theorem Normal_and_exp2 :
forall (f : float) (d : Fbound) (e m : Z) (p : nat),
Zpos (vNum d) = Zpower_nat radix p ->
1 < p ->
(- dExp d <= e)%Z ->
f = Float m e :>R ->
(powerRZ radix (Zpred p + e) <= f)%R ->
(f < powerRZ radix (p + e))%R ->
ex (fun g : float => g = f :>R /\ Fnormal radix d g /\ Fexp g = e).
Theorem u_bounds :
(3%nat * powerRZ radix (Zpred (Zpred (prec - N))) +
powerRZ radix (Zsucc (- N)) <= u)%R /\
(u <= powerRZ radix (prec - N) - powerRZ radix (- N))%R.
Theorem exists_k :
ex
(fun k : Z =>
(powerRZ radix k <= zH1)%R /\
(zH1 < powerRZ radix (Zsucc k))%R /\
(Zsucc (k + N) <= Zpred (Zpred prec))%Z /\
(0 <= Zsucc (k + N))%Z /\
1 < Zabs_nat (Zsucc (k + N)) /\ (2 <= Zsucc (k + N))%Z).
`
Not very readable, I know, but those are the hypotheses I will need to make things go right when calling the previous theorem. This is the theorem stating the correctness of the algorithm computing z.
`
Theorem arg_reduct_exists_k_zH :
ex
(fun k : Z =>
ex
(fun zH : float =>
(0 <= zH)%R /\
zH1 = zH :>R /\
(Zsucc (k + N) <= Zpred (Zpred prec))%Z /\
(0 <= Zsucc (k + N))%Z /\
1 < Zabs_nat (Zsucc (k + N)) /\
N = (- Fexp zH)%Z /\
Fnormal radix (bzH k) zH /\
(Rabs (x * alpha - zH) <= powerRZ radix (Zpred (- N)))%R /\
(powerRZ radix k <= zH1)%R /\ (zH1 < powerRZ radix (Zsucc k))%R)).
End Algo.
Section Total.
Let radix := 2%Z.
Let FtoRradix := FtoR radix.
Coercion FtoRradix : float >-> R.
`
Variables
`
Variable b : Fbound.
Variables prec q : nat.
Variable N : Z.
Variables alpha gamma x zH1 u : float.
Variable zL : R.
Let bmoinsq :=
Bound
(P_of_succ_nat (pred (Zabs_nat (Zpower_nat radix (prec - q)))))
(dExp b).
`
All the hypotheses
`
Hypothesis pGivesBound : Zpos (vNum b) = Zpower_nat radix prec.
Hypothesis Fboundedx : Fbounded b x.
Hypothesis xPos : (0 <= x)%R.
`
alpha (the constant, such as pi) and gamma (its inverse)
`Hypothesis alphaNormal : Fnormal radix b alpha.
Hypothesis gammaNormal : Fnormal radix bmoinsq gamma.
Hypothesis alphaPos : (0 < alpha)%R.
Hypothesis gammaPos : (0 < gamma)%R.
Hypothesis
gamma_not_pow_2 : forall e : Z, FtoRradix gamma <> powerRZ radix e.
`
About q
`
Hypothesis pMoinsqGreaterThanOne : 1 < prec - q.
Hypothesis q_enough : (2 <= q)%Z.
Hypothesis gammaDef : Closest bmoinsq radix (/ alpha) gamma.
`
About the computation of z
`Hypothesis
uDef :
Closest b radix
(3%nat * powerRZ radix (Zpred (Zpred (prec - N))) + x * alpha) u.
Hypothesis
zH1Def :
Closest b radix (u - 3%nat * powerRZ radix (Zpred (Zpred (prec - N))))
zH1.
Hypothesis precMoreThanThree : 3 < prec.
Hypothesis N_not_too_big : (N <= dExp b)%Z.
`
x not too big
`Hypothesis
xalpha_small :
(x * alpha <=
powerRZ radix (Zpred (Zpred (prec - N))) - powerRZ radix (- N))%R.
`
No underflow
`Hypothesis gamma_ge: (powerRZ radix (-dExp b+prec -q +(Zmax 1 (N-1)))<= gamma)%R.
Lemma Sterbenzbis: forall (x y :float),
Fbounded b x ->
Fbounded b y ->
(/ S 1 * y <= x)%R ->
(x <= S 1 * y)%R ->
Fbounded b (Fminus radix x y) /\
(Rabs (x - y) <= y)%R.
`
Main result: q can be anything but we need alpha * gamma <= 1
`Theorem Fmac_arg_reduct_correct2 :
(alpha * gamma <= 1)%R ->
ex (fun u : float => FtoRradix u = (x - zH1 * gamma)%R /\ Fbounded b u)
/\ (Rabs (x-zH1*gamma) < powerRZ radix (prec-N+Fexp gamma))%R.
End Total.
`