Fnorm.v



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

Require Import Float.
Require Import Fcomp.
Require Import Fop.
Section Fbounded_Def.
Variable radix:nat.
Hypothesis radixMoreThanOne:(lt (1) radix).

Local FtoRradix := (FtoR radix).
Coercion FtoRradix : float >-> R.

Record Fbound: Set := Bound {
   vNum: nat;
   dExp: nat }.

Definition
Fbounded :=
   [b:
Fbound] [d:float]
   ((Zle (Zopp (vNum b)) (Fnum d)) /\ (Zle (Fnum d) (vNum b))) /\
   (Zle (Zopp (dExp b)) (Fexp d)).

Theorem isBounded: (b:Fbound) (p:float){(Fbounded b p)}+{~ (Fbounded b p)}.

Theorem pBounded_absolu:
  (b:
Fbound) (p:float) (Fbounded b p) ->(le (absolu (Fnum p)) (vNum b)).

Theorem FzeroisZero: (b:Fbound)<R> (Fzero (Zopp (dExp b)))==R0.

Theorem FboundedFzero: (b:Fbound)(Fbounded b (Fzero (Zopp (dExp b)))).

Theorem FboundedZeroSameExp:
  (b:
Fbound) (p:float) (Fbounded b p) ->(Fbounded b (Fzero (Fexp p))).

Theorem FBoundedScale:
  (b:
Fbound) (p:float) (n:nat) (Fbounded b p) ->
  (Fbounded b (Float (Fnum p) (Zplus (Fexp p) n))).

Theorem FvalScale:
  (b:
Fbound) (p:float) (n:nat)
  <R> (Float (Fnum p) (Zplus (Fexp p) n))==(Rmult (powerRZ radix n) p).

Theorem Fbounded_Zabs:
  (b:
Fbound) (f:float) (Fbounded b f) ->(Zle (Zabs (Fnum f)) (vNum b)).

Theorem oppBounded: (b:Fbound) (x:float) (Fbounded b x) ->(Fbounded b (Fopp x)).

Theorem oppBoundedInv:
  (b:
Fbound) (x:float) (Fbounded b (Fopp x)) ->(Fbounded b x).

Theorem FopRepAux:
  (b:
Fbound)
  (z:Z)
  (p:R)
  ((ex float [r:float]<R> r==(Ropp p) /\ ((Fbounded b r) /\ (Fexp r)=z))) ->
  (ex float [r:float]<R> r==p /\ ((Fbounded b r) /\ (Fexp r)=z)).

Theorem absFBounded:
  (b:
Fbound) (f:float) (Fbounded b f) ->(Fbounded b (Fabs f)).

Theorem FboundedEqExpPos:
  (b:
Fbound)
  (p, q:float)
  (Fbounded b p) -> <R> p==q -> (Rle (Fexp p) (Fexp q)) -> (Rle R0 q) ->
  (Fbounded b q).

Theorem FboundedEqExp:
  (b:
Fbound)
  (p, q:float) (Fbounded b p) -> <R> p==q -> (Rle (Fexp p) (Fexp q)) ->
  (Fbounded b q).

Theorem eqExpLess:
  (b:
Fbound) (p, q:float) (Fbounded b p) -> <R> p==q ->
  (Ex [r:float] (Fbounded b r) /\ (<R> r==q /\ (Rle (Fexp q) (Fexp r)))).

Theorem FboundAlt:
  (b:
Fbound)
  (p:float) (Zle (Zabs (Fnum p)) (vNum b)) -> (Zle (Zopp (dExp b)) (Fexp p)) ->
  (Fbounded b p).

Theorem FboundedShiftLess:
  (b:
Fbound) (f:float) (n, m:nat) (le m n) -> (Fbounded b (Fshift radix n f)) ->
  (Fbounded b (Fshift radix m f)).

Theorem eqExpMax:
  (b:
Fbound)
  (p, q:float) (Fbounded b p) -> (Fbounded b q) -> (Rle (Fabs p) q) ->
  (Ex [r:float] (Fbounded b r) /\ (<R> r==p /\ (Zle (Fexp r) (Fexp q)))).

Theorem LessExpBound:
  (b:
Fbound)
  (p, q:float)
  (Fbounded b p) ->
  (Fbounded b q) -> (Zle (Fexp q) (Fexp p)) -> (Rle R0 p) -> (Rle p q) ->
  (Ex [m:Z] <R> (Float m (Fexp q))==p /\ (Fbounded b (Float m (Fexp q)))).

Theorem maxFbounded:
  (b:
Fbound) (z:Z) (Zle (Zopp (dExp b)) z) ->(Fbounded b (Float (vNum b) z)).

Theorem maxMax:
  (b:
Fbound) (p:float) (z:Z) (Fbounded b p) -> (Zle (Fexp p) z) ->
  (Rle (Fabs p) (Float (vNum b) z)).
End Fbounded_Def.
Section Fnormalized_Def.
Variable radix:nat.
Hypothesis radixMoreThanOne:(lt (1) radix).

Local FtoRradix := (FtoR radix).
Coercion FtoRradix : float >-> R.
Variable b:Fbound.
Variable precision:nat.
Hypothesis precisionNotZero:~ precision=O.
Hypothesis pGivesBound:(vNum b)=(minus (exp radix precision) (1)).

Theorem FboundNext:
  (p:
float) (Fbounded b p) ->
  (Ex [q:float] (Fbounded b q) /\ <R> q==(Float (Zs (Fnum p)) (Fexp p))).

Theorem lt_vNum: (lt O (vNum b)).

Theorem
digitVNumiSPrecision: (digit radix (vNum b))=precision.

Theorem vNumPrecision: (n:nat) (le (digit radix n) precision) ->(le n (vNum b)).

Theorem pGivesDigit: (p:float) (Fbounded b p) ->(le (Fdigit radix p) precision).

Theorem digitGivesBoundedNum:
  (p:
float) (le (Fdigit radix p) precision) ->
  (Zle (Zopp (vNum b)) (Fnum p)) /\ (Zle (Fnum p) (vNum b)).

Theorem FboundedOne: (z:Z) (Zle (Zopp (dExp b)) z) ->(Fbounded b (Float (1) z)).

Theorem FboundedMbound:
  (z:Z) (m:nat) (le m (
exp radix precision)) -> (Zle (Zopp (dExp b)) z) ->
  (Ex [c:float] (Fbounded b c) /\ <R> c==(Rmult m (powerRZ radix z))).

Definition Fnormal := [p:float](Fbounded b p) /\ (Fdigit radix p)=precision.

Theorem FnormalNotZero: (p:float) (Fnormal p) ->~ (is_Fzero p).

Theorem FnormalUnique:
  (p, q:
float) (Fnormal p) -> (Fnormal q) -> <R> p==q ->p=q.

Theorem FnormalFop: (p:float) (Fnormal p) ->(Fnormal (Fopp p)).

Theorem FnormalLtPos:
  (p, q:
float) (Fnormal p) -> (Fnormal q) -> (Rle R0 p) -> (Rlt p q) ->
  (Zlt (Fexp p) (Fexp q)) \/ (Fexp p)=(Fexp q) /\ (Zlt (Fnum p) (Fnum q)).

Theorem FnormalLtNeg:
  (p, q:
float) (Fnormal p) -> (Fnormal q) -> (Rle q R0) -> (Rlt p q) ->
  (Zlt (Fexp q) (Fexp p)) \/ (Fexp p)=(Fexp q) /\ (Zlt (Fnum p) (Fnum q)).

Definition nNormMin := (exp radix (pred precision)).

Theorem nNormNotZero: ~ nNormMin=O.

Theorem digitnNormMin: (digit radix nNormMin)=precision.

Theorem nNrMMimLevNum: (le nNormMin (vNum b)).

Definition firstNormalPos := (Float nNormMin (Zopp (dExp b))).

Theorem firstNormalPosNormal: (Fnormal firstNormalPos).

Theorem pNormal_absolu_min:
  (p:
float) (Fnormal p) ->(le nNormMin (absolu (Fnum p))).

Theorem maxMaxBis:
  (p:
float) (z:Z) (Fbounded b p) -> (Zlt (Fexp p) z) ->
  (Rlt (Fabs p) (Float nNormMin z)).

Theorem FnormalLtFirstNormalPos:
  (p:
float) (Fnormal p) -> (Rle R0 p) ->(Rle firstNormalPos p).

Theorem FnormalLtFirstNormalNeg:
  (p:
float) (Fnormal p) -> (Rle p R0) ->(Rle p (Fopp firstNormalPos)).

Theorem FnormalBoundAbs:
  (p:
float) (Fnormal p) ->(Rlt (Float (vNum b) (Zpred (Fexp p))) (Fabs p)).

Theorem FnormalBoundAbs2:
  (p:
float) (Fnormal p) ->
  (Rle (Rmult (plus (vNum b) (1)) (Float (1) (Zpred (Fexp p)))) (Fabs p)).

Definition Fsubnormal :=
   [p:
float]
   (Fbounded b p) /\
   ((Fexp p)=(Zopp (dExp b)) /\ (lt (Fdigit radix p) precision)).

Theorem FsubnormFopp: (p:float) (Fsubnormal p) ->(Fsubnormal (Fopp p)).

Theorem FsubnormalUnique:
  (p, q:
float) (Fsubnormal p) -> (Fsubnormal q) -> <R> p==q ->p=q.

Theorem FsubnormalLt:
  (p, q:
float) (Fsubnormal p) -> (Fsubnormal q) -> (Rlt p q) ->
  (Zlt (Fnum p) (Fnum q)).

Theorem LtFsubnormal:
  (p, q:
float) (Fsubnormal p) -> (Fsubnormal q) -> (Zlt (Fnum p) (Fnum q)) ->
  (Rlt p q).

Theorem pSubnormal_absolu_min:
  (p:
float) (Fsubnormal p) ->(lt (absolu (Fnum p)) nNormMin).

Theorem FsubnormalLtFirstNormalPos:
  (p:
float) (Fsubnormal p) -> (Rle R0 p) ->(Rlt p firstNormalPos).

Theorem FsubnormalnormalLtPos:
  (p, q:
float) (Fsubnormal p) -> (Fnormal q) -> (Rle R0 p) -> (Rle R0 q) ->
  (Rlt p q).

Theorem FsubnormalnormalLtNeg:
  (p, q:
float) (Fsubnormal p) -> (Fnormal q) -> (Rle p R0) -> (Rle q R0) ->
  (Rlt q p).

Definition Fnormalize :=
   [p:
float]
      Cases (Z_zerop (Fnum p)) of
          (left _) => (Float ZERO (Zopp (dExp b)))
         | (right _) =>
             (Fshift
                radix
                (min
                   (minus precision (Fdigit radix p))
                   (absolu (Zplus (dExp b) (Fexp p)))) p)
      end.

Theorem FnormalizeCorrect: (p:float)<R> (Fnormalize p)==p.

Theorem Fnormalize_Fopp: (p:float)(Fnormalize (Fopp p))=(Fopp (Fnormalize p)).

Theorem FnormalizeBounded:
  (p:
float) (Fbounded b p) ->(Fbounded b (Fnormalize p)).

Definition Fcanonic := [a:float](Fnormal a) \/ (Fsubnormal a).

Theorem FcanonicBound: (p:float) (Fcanonic p) ->(Fbounded b p).

Theorem pUCanonic_absolu:
  (p:
float) (Fcanonic p) ->(le (absolu (Fnum p)) (vNum b)).

Theorem FcanonicFopp: (p:float) (Fcanonic p) ->(Fcanonic (Fopp p)).

Theorem FcanonicFabs: (p:float) (Fcanonic p) ->(Fcanonic (Fabs p)).

Theorem FnormalizeCanonic: (p:float) (Fbounded b p) ->(Fcanonic (Fnormalize p)).

Theorem FcanonicLtPos:
  (p, q:
float) (Fcanonic p) -> (Fcanonic q) -> (Rle R0 p) -> (Rlt p q) ->
  (Zlt (Fexp p) (Fexp q)) \/ (Fexp p)=(Fexp q) /\ (Zlt (Fnum p) (Fnum q)).

Theorem FcanonicLtNeg:
  (p, q:
float) (Fcanonic p) -> (Fcanonic q) -> (Rle q R0) -> (Rlt p q) ->
  (Zlt (Fexp q) (Fexp p)) \/ (Fexp p)=(Fexp q) /\ (Zlt (Fnum p) (Fnum q)).

Theorem NormalNotSubNormal: (p:float)~ ((Fnormal p) /\ (Fsubnormal p)).

Theorem NormalAndSubNormalNotEq:
  (p, q:
float) (Fnormal p) -> (Fsubnormal q) ->~ <R> p==q.

Theorem FcanonicUnique:
  (p, q:
float) (Fcanonic p) -> (Fcanonic q) -> <R> p==q ->p=q.

Theorem FcanonicFormalizeEq: (p:float) (Fcanonic p) ->(Fnormalize p)=p.

Theorem FcanonicPosFexpRlt:
  (x, y:
float)
  (Rle R0 x) ->
  (Rle R0 y) -> (Fcanonic x) -> (Fcanonic y) -> (Zlt (Fexp x) (Fexp y)) ->
  (Rlt x y).

Theorem FcanonicNegFexpRlt:
  (x, y:
float)
  (Rle x R0) ->
  (Rle y R0) -> (Fcanonic x) -> (Fcanonic y) -> (Zlt (Fexp x) (Fexp y)) ->
  (Rlt y x).

Theorem MaxFloat:
  (x:
float) (Fbounded b x) ->(Rle (Rabsolu x) (Float (vNum b) (Fexp x))).

Theorem FcanonicLeastExp:
  (x, y:
float) <R> x==y -> (Fbounded b x) -> (Fcanonic y) ->
  (Zle (Fexp y) (Fexp x)).

Theorem Fcanonic_Rle_Zle:
  (x, y:
float) (Fcanonic x) -> (Fcanonic y) -> (Rle (Rabsolu x) (Rabsolu y)) ->
  (Zle (Fexp x) (Fexp y)).
End Fnormalized_Def.

30/05/01, 18:04