MSB.v
Require Import Float.
Require Import Fcomp.
Require Import Fprop.
Require Import Fop.
Require Import Fnorm.
Section mf.
Variable radix:nat.
Hypothesis radixMoreThanOne:(lt (1) radix).
Local FtoRradix := (FtoR radix).
Coercion FtoRradix : float >-> R.
Fixpoint
maxDiv[v, p:nat]: nat :=
Cases p of
O => O
| (S p') => Cases (dividesP v (exp radix p)) of
(left _) => p
| (right _) => (maxDiv v p')
end
end.
Theorem
maxDivLess: (v, p:nat)(le (maxDiv v p) p).
Theorem
maxDivLt: (v, p:nat) ~ (Ndivides v (exp radix p)) ->(lt (maxDiv v p) p).
Theorem
maxDivCorrect: (v, p:nat)(Ndivides v (exp radix (maxDiv v p))).
Theorem
maxDivSimplAux:
(v, p, q:nat) p=(maxDiv v (S (plus q p))) ->p=(maxDiv v (S p)).
Theorem
maxDivSimpl:
(v, p, q:nat) (lt p q) -> p=(maxDiv v q) ->p=(maxDiv v (S p)).
Theorem
maxDivSimplInvAux:
(v, p, q:nat) p=(maxDiv v (S p)) ->p=(maxDiv v (S (plus q p))).
Theorem
maxDivSimplInv:
(v, p, q:nat) (lt p q) -> p=(maxDiv v (S p)) ->p=(maxDiv v q).
Theorem
maxDivUnique:
(v, p:nat) p=(maxDiv v (S p)) ->
(Ndivides v (exp radix p)) /\ ~ (Ndivides v (exp radix (S p))).
Theorem
maxDivUniqueDigit:
(v:nat) ~ v=O ->
(Ndivides v (exp radix (maxDiv v (digit radix v)))) /\
~ (Ndivides v (exp radix (S (maxDiv v (digit radix v))))).
Theorem
maxDivUniqueInverse:
(v, p:nat) (Ndivides v (exp radix p)) -> ~ (Ndivides v (exp radix (S p))) ->
p=(maxDiv v (S p)).
Theorem
maxDivUniqueInverseDigit:
(v, p:nat)
~ v=O -> (Ndivides v (exp radix p)) -> ~ (Ndivides v (exp radix (S p))) ->
p=(maxDiv v (digit radix v)).
Theorem
maxDivPlus:
(v, n:nat) ~ v=O ->
(maxDiv (mult v (exp radix n)) (plus (digit radix v) n))=
(plus (maxDiv v (digit radix v)) n).
Definition
LSB :=
[x:float]
(Zplus (inject_nat (maxDiv (absolu (Fnum x)) (Fdigit radix x))) (Fexp x)).
Theorem
LSB_shift:
(x:float) (n:nat) ~ (is_Fzero x) ->(LSB x)=(LSB (Fshift radix n x)).
Theorem
LSB_comp:
(x, y:float) (n:nat) ~ (is_Fzero x) -> <R> x==y ->(LSB x)=(LSB y).
Theorem
LSB_opp: (x:float)(LSB x)=(LSB (Fopp x)).
Theorem
LSB_abs: (x:float)(LSB x)=(LSB (Fabs x)).
Definition
MSB :=
[x:float](Zpred (Zplus (inject_nat (Fdigit radix x)) (Fexp x))).
Theorem
MSB_shift:
(x:float) (n:nat) ~ (is_Fzero x) ->(MSB x)=(MSB (Fshift radix n x)).
Theorem
MSB_comp:
(x, y:float) (n:nat) ~ (is_Fzero x) -> <R> x==y ->(MSB x)=(MSB y).
Theorem
MSB_opp: (x:float)(MSB x)=(MSB (Fopp x)).
Theorem
MSB_abs: (x:float)(MSB x)=(MSB (Fabs x)).
Theorem
LSB_le_MSB: (x:float) ~ (is_Fzero x) ->(Zle (LSB x) (MSB x)).
Theorem
Fexp_le_LSB: (x:float)(Zle (Fexp x) (LSB x)).
Theorem
Ulp_Le_LSigB: (x:float)(Rle (Float (1) (Fexp x)) (Float (1) (LSB x))).
Theorem
Fexp_le_MSB: (x:float) ~ (is_Fzero x) ->(Zle (Fexp x) (MSB x)).
Theorem
MSB_le_abs:
(x:float) ~ (is_Fzero x) ->(Rle (Float (1) (MSB x)) (Fabs x)).
Theorem
abs_lt_MSB: (x:float)(Rlt (Fabs x) (Float (1) (Zs (MSB x)))).
Theorem
LSB_le_abs:
(x:float) ~ (is_Fzero x) ->(Rle (Float (1) (LSB x)) (Fabs x)).
Theorem
MSB_monotoneAux:
(x, y:float) (Rle (Fabs x) (Fabs y)) -> (Fexp x)=(Fexp y) ->
(Zle (MSB x) (MSB y)).
Theorem
MSB_monotone:
(x, y:float) ~ (is_Fzero x) -> ~ (is_Fzero y) -> (Rle (Fabs x) (Fabs y)) ->
(Zle (MSB x) (MSB y)).
Theorem
MSB_le_multAux:
(x, y:float) ~ (is_Fzero x) -> ~ (is_Fzero y) ->
(Zle (Zplus (MSB x) (MSB y)) (MSB (Fmult x y))).
Theorem
MSB_le_mult:
(x, y:float) ~ (is_Fzero x) -> ~ (is_Fzero y) ->
(Rle
(Fmult (Float (1) (MSB x)) (Float (1) (MSB y)))
(Float (1) (MSB (Fmult x y)))).
Theorem
mult_le_MSBAux:
(x, y:float) ~ (is_Fzero x) -> ~ (is_Fzero y) ->
(Zle (MSB (Fmult x y)) (Zs (Zplus (MSB x) (MSB y)))).
Theorem
mult_le_MSB:
(x, y:float) ~ (is_Fzero x) -> ~ (is_Fzero y) ->
(Rle
(Float (1) (MSB (Fmult x y)))
(Rmult radix (Fmult (Float (1) (MSB x)) (Float (1) (MSB y))))).
Theorem
MSB_mix:
(x, y:float) ~ (is_Fzero x) -> ~ (is_Fzero y) ->
(Rlt
(Rmult (Fabs x) (Float (1) (MSB y)))
(Rmult radix (Rmult (Fabs y) (Float (1) (MSB x))))).
Theorem
LSB_rep:
(x, y:float) ~ (is_Fzero y) -> (Zle (LSB x) (LSB y)) ->
(Ex [z:Z] <R> y==(Float z (Fexp x))).
Theorem
LSB_rep_min: (p:float)(Ex [z:Z] <R> p==(Float z (LSB p))).
End mf.
30/05/01, 18:19