TwoSum.v



(****************************************************************************
                                                                             
          IEEE754  :  TwoSum                                                  
                                                                             
          Laurent Thery & Sylvie Boldo                                        
                                                                             
*****************************************************************************
*)

Require Export Fast2Sum.
Section EFast.
Variable b:Fbound.
Variable precision:nat.

Local FtoRradix := (FtoR (2)).
Coercion FtoRradix : float >-> R.
Hypothesis precisionGreaterThanOne:(lt (1) precision).
Hypothesis pGivesBound:(vNum b)=(minus (exp (2) precision) (1)).
Variable Iplus:float -> float ->float.
Hypothesis IplusCorrect:
           (p, q:float) (Fbounded b p) -> (Fbounded b q) ->
           (Closest b (2) (Rplus p q) (Iplus p q)).
Hypothesis IplusComp:
           (p, q, r, s:float)
           (Fbounded b p) ->
           (Fbounded b q) ->
           (Fbounded b r) -> (Fbounded b s) -> <R> p==r -> <R> q==s ->
           <R> (Iplus p q)==(Iplus r s).
Hypothesis IplusSym:(p, q:float)(Iplus p q)=(Iplus q p).
Hypothesis IplusOp:(p, q:float)(Fopp (Iplus p q))=(Iplus (Fopp p) (Fopp q)).
Variable Iminus:float -> float ->float.
Hypothesis IminusPlus:(p, q:float)(Iminus p q)=(Iplus p (Fopp q)).

Theorem IplusOl:
  (p, q:
float) (Fbounded b p) -> (Fbounded b q) -> <R> p==R0 ->
  <R> (Iplus p q)==q.

Local IminusCorrect := (IminusCorrect b Iplus IplusCorrect Iminus IminusPlus).

Local IplusBounded := (IplusBounded b Iplus IplusCorrect).

Local IminusBounded := (IminusBounded b Iplus IplusCorrect Iminus IminusPlus).

Local IminusId := (IminusId b Iplus IplusCorrect Iminus IminusPlus).

Theorem MKnuth:
  (p, q:
float)
  (Fbounded b p) ->
  (Fbounded b q) -> <R> (Iminus (Iplus p q) p)==(Rminus (Iplus p q) p) ->
  <R>
    (Iplus
       (Iminus p (Iminus (Iplus p q) (Iminus (Iplus p q) p)))
       (Iminus q (Iminus (Iplus p q) p)))==(Rminus (Rplus p q) (Iplus p q)).

Theorem IplusCorrectEq:
  (p, q, pq:
float)
  (r:R)
  (Fbounded b p) ->
  (Fbounded b q) -> (Fbounded b pq) -> <R> r==pq -> <R> (Rplus p q)==pq ->
  <R> (Iplus p q)==r.

Theorem IminusCorrectEq:
  (p, q, pq:
float)
  (r:R)
  (Fbounded b p) ->
  (Fbounded b q) -> (Fbounded b pq) -> <R> r==pq -> <R> (Rminus p q)==pq ->
  <R> (Iminus p q)==r.

Theorem Iminus2Exact:
  (p, q:
float) (Rle R0 p) -> (Rle p q) -> (Fbounded b p) -> (Fbounded b q) ->
  <R> (Iminus q (Iminus q p))==(Rminus q (Iminus q p)).

Theorem MKnuth1:
  (p, q:
float)
  (Fbounded b p) ->
  (Fbounded b q) ->
  <R> (Iminus q (Iminus (Iplus p q) p))==(Rminus q (Iminus (Iplus p q) p)) ->
  <R>
    (Iminus (Iplus p q) (Iminus (Iplus p q) p))==
    (Rminus (Iplus p q) (Iminus (Iplus p q) p)) ->
  <R>
    (Iplus
       (Iminus p (Iminus (Iplus p q) (Iminus (Iplus p q) p)))
       (Iminus q (Iminus (Iplus p q) p)))==(Rminus (Rplus p q) (Iplus p q)).

Theorem MKnuth2:
  (p, q:
float)
  (Rle (Rabsolu q) (Rabsolu p)) -> (Fbounded b p) -> (Fbounded b q) ->
  <R>
    (Iplus
       (Iminus p (Iminus (Iplus p q) (Iminus (Iplus p q) p)))
       (Iminus q (Iminus (Iplus p q) p)))==(Rminus (Rplus p q) (Iplus p q)).

Theorem IminusOp: (p, q:float)(Fopp (Iminus p q))=(Iminus (Fopp p) (Fopp q)).

Theorem MKnuthOpp:
  (p, q:
float)
  <R>
    (Iplus
       (Iminus p (Iminus (Iplus p q) (Iminus (Iplus p q) p)))
       (Iminus q (Iminus (Iplus p q) p)))==
    (Fopp
       (Iplus
          (Iminus
             (Fopp p)
             (Iminus
                (Iplus (Fopp p) (Fopp q))
                (Iminus (Iplus (Fopp p) (Fopp q)) (Fopp p))))
          (Iminus (Fopp q) (Iminus (Iplus (Fopp p) (Fopp q)) (Fopp p))))).

Theorem MKnuth3:
  (p, q:
float)
  (Rle R0 q) ->
  (Rle q (Rmult (2) (Ropp p))) ->
  (Rle (Ropp p) q) -> (Fbounded b p) -> (Fbounded b q) ->
  <R>
    (Iplus
       (Iminus p (Iminus (Iplus p q) (Iminus (Iplus p q) p)))
       (Iminus q (Iminus (Iplus p q) p)))==(Rminus (Rplus p q) (Iplus p q)).

Theorem MKnuth4:
  (p, q:
float)
  (Rlt R0 (Ropp p)) ->
  (Rlt R0 q) ->
  (Rlt (Rmult (2) (Ropp p)) q) -> (Fbounded b p) -> (Fbounded b q) ->
  <R>
    (Iplus
       (Iminus p (Iminus (Iplus p q) (Iminus (Iplus p q) p)))
       (Iminus q (Iminus (Iplus p q) p)))==(Rminus (Rplus p q) (Iplus p q)).

Theorem MKnuth5:
  (p, q:
float) (Rlt R0 p) -> (Rlt p q) -> (Fbounded b p) -> (Fbounded b q) ->
  <R>
    (Iplus
       (Iminus p (Iminus (Iplus p q) (Iminus (Iplus p q) p)))
       (Iminus q (Iminus (Iplus p q) p)))==(Rminus (Rplus p q) (Iplus p q)).

Theorem MKnuth6:
  (p, q:
float)
  <R> (Iplus p q)==(Rplus p q) -> (Fbounded b p) -> (Fbounded b q) ->
  <R>
    (Iplus
       (Iminus p (Iminus (Iplus p q) (Iminus (Iplus p q) p)))
       (Iminus q (Iminus (Iplus p q) p)))==(Rminus (Rplus p q) (Iplus p q)).

Theorem MKnuth7:
  (p, q:
float) (Rlt (Rabsolu p) q) -> (Fbounded b p) -> (Fbounded b q) ->
  <R>
    (Iplus
       (Iminus p (Iminus (Iplus p q) (Iminus (Iplus p q) p)))
       (Iminus q (Iminus (Iplus p q) p)))==(Rminus (Rplus p q) (Iplus p q)).

Theorem Knuth:
  (p, q:
float) (Fbounded b p) -> (Fbounded b q) ->
  <R>
    (Iplus
       (Iminus p (Iminus (Iplus p q) (Iminus (Iplus p q) p)))
       (Iminus q (Iminus (Iplus p q) p)))==(Rminus (Rplus p q) (Iplus p q)).
End EFast.

30/05/01, 18:30