Library Fast2Diff

Require Export EFast2Sum.
Section EDiff.
Variable b : Fbound.
Variable precision : nat.

Let radix := 2%Z.

Coercion Local FtoRradix := FtoR radix.
Hypothesis precisionGreaterThanOne : 1 < precision.
Hypothesis pGivesBound : Zpos (vNum b) = Zpower_nat radix precision.
Variable Iplus : float -> float -> float.
Hypothesis
  IplusCorrect :
    forall p q : float,
    Fbounded b p -> Fbounded b q -> Closest b radix (p + q) (Iplus p q).
Hypothesis
  IplusComp :
    forall p q r s : float,
    Fbounded b p ->
    Fbounded b q ->
    Fbounded b r ->
    Fbounded b s -> p = r :>R -> q = s :>R -> Iplus p q = Iplus r s :>R.
Hypothesis IplusSym : forall p q : float, Iplus p q = Iplus q p.
Hypothesis
  IplusOp : forall p q : float, Fopp (Iplus p q) = Iplus (Fopp p) (Fopp q).
Variable Iminus : float -> float -> float.
Hypothesis IminusPlus : forall p q : float, Iminus p q = Iplus p (Fopp q).

Theorem MDekkerDiffAux1 :
 forall p q : float,
 Iminus p (Iminus p q) = (p - Iminus p q)%R :>R ->
 Fbounded b p ->
 Fbounded b q ->
 Iminus (Iminus p (Iminus p q)) q = (p - q - Iminus p q)%R :>R.

Theorem MDekkerDiff :
 forall p q : float,
 Fbounded b p ->
 Fbounded b q ->
 (Rabs q <= Rabs p)%R -> Iminus p (Iminus p q) = (p - Iminus p q)%R :>R.

Theorem DekkerDiff :
 forall p q : float,
 Fbounded b p ->
 Fbounded b q ->
 (Rabs q <= Rabs p)%R ->
 Iminus (Iminus p (Iminus p q)) q = (p - q - Iminus p q)%R :>R.

Theorem ExtMDekkerDiff :
 forall p q : float,
 Fbounded b p ->
 Fbounded b q ->
 (Fexp q <= Fexp p)%Z -> Iminus p (Iminus p q) = (p - Iminus p q)%R :>R.

Theorem ExtDekkerDiff :
 forall p q : float,
 Fbounded b p ->
 Fbounded b q ->
 (Fexp q <= Fexp p)%Z ->
 Iminus (Iminus p (Iminus p q)) q = (p - q - Iminus p q)%R :>R.
End EDiff.