Library Float
Require Export Omega.
Require Export Compare.
Require Export Rpow.
Section definitions.
Variable radix : Z.
Hypothesis radixMoreThanOne : (1 < radix)%Z.
Let radixMoreThanZERO := Zlt_1_O _ (Zlt_le_weak _ _ radixMoreThanOne).
Hint Resolve radixMoreThanZERO: zarith.
Record float : Set := Float {Fnum : Z; Fexp : Z}.
Theorem floatEq :
forall p q : float, Fnum p = Fnum q -> Fexp p = Fexp q -> p = q.
Theorem floatDec : forall x y : float, {x = y} + {x <> y}.
Definition Fzero (x : Z) := Float 0 x.
Definition is_Fzero (x : float) := Fnum x = 0%Z.
Theorem is_FzeroP : forall x : float, is_Fzero x \/ ~ is_Fzero x.
Coercion IZR : Z >-> R.
Coercion INR : nat >-> R.
Coercion Z_of_nat : nat >-> Z.
Definition FtoR (x : float) := (Fnum x * powerRZ (IZR radix) (Fexp x))%R.
Coercion Local FtoR1 := FtoR.
Theorem FzeroisReallyZero : forall z : Z, Fzero z = 0%R :>R.
Theorem is_Fzero_rep1 : forall x : float, is_Fzero x -> x = 0%R :>R.
Theorem LtFnumZERO : forall x : float, (0 < Fnum x)%Z -> (0 < x)%R.
Theorem is_Fzero_rep2 : forall x : float, x = 0%R :>R -> is_Fzero x.
Theorem NisFzeroComp :
forall x y : float, ~ is_Fzero x -> x = y :>R -> ~ is_Fzero y.
Theorem Rlt_monotony_exp :
forall (x y : R) (z : Z),
(x < y)%R -> (x * powerRZ radix z < y * powerRZ radix z)%R.
Theorem Rle_monotone_exp :
forall (x y : R) (z : Z),
(x <= y)%R -> (x * powerRZ radix z <= y * powerRZ radix z)%R.
Theorem Rlt_monotony_contra_exp :
forall (x y : R) (z : Z),
(x * powerRZ radix z < y * powerRZ radix z)%R -> (x < y)%R.
Theorem Rle_monotony_contra_exp :
forall (x y : R) (z : Z),
(x * powerRZ radix z <= y * powerRZ radix z)%R -> (x <= y)%R.
Theorem FtoREqInv1 :
forall p q : float, ~ is_Fzero p -> p = q :>R -> Fnum p = Fnum q -> p = q.
Theorem FtoREqInv2 :
forall p q : float, p = q :>R -> Fexp p = Fexp q -> p = q.
Theorem Rlt_Float_Zlt :
forall p q r : Z, (Float p r < Float q r)%R -> (p < q)%Z.
Theorem Rle_Float_Zle :
forall p q r : Z, (Float p r <= Float q r)%R -> (p <= q)%Z.
Theorem oneExp_le :
forall x y : Z, (x <= y)%Z -> (Float 1%nat x <= Float 1%nat y)%R.
Theorem oneExp_lt :
forall x y : Z, (x < y)%Z -> (Float 1%nat x < Float 1%nat y)%R.
Theorem oneExp_Zlt :
forall x y : Z, (Float 1%nat x < Float 1%nat y)%R -> (x < y)%Z.
Theorem oneExp_Zle :
forall x y : Z, (Float 1%nat x <= Float 1%nat y)%R -> (x <= y)%Z.
Definition Fdigit (p : float) := digit radix (Fnum p).
Definition Fshift (n : nat) (x : float) :=
Float (Fnum x * Zpower_nat radix n) (Fexp x - n).
Theorem sameExpEq : forall p q : float, p = q :>R -> Fexp p = Fexp q -> p = q.
Theorem FshiftFdigit :
forall (n : nat) (x : float),
~ is_Fzero x -> Fdigit (Fshift n x) = Fdigit x + n.
Theorem FshiftCorrect : forall (n : nat) (x : float), Fshift n x = x :>R.
Theorem FshiftCorrectInv :
forall x y : float,
x = y :>R ->
(Fexp x <= Fexp y)%Z -> Fshift (Zabs_nat (Fexp y - Fexp x)) y = x.
Theorem FshiftO : forall x : float, Fshift 0 x = x.
Theorem FshiftCorrectSym :
forall x y : float,
x = y :>R -> exists n : nat, (exists m : nat, Fshift n x = Fshift m y).
Theorem FshiftAdd :
forall (n m : nat) (p : float), Fshift (n + m) p = Fshift n (Fshift m p).
Theorem ReqGivesEqwithSameExp :
forall p q : float,
exists r : float,
(exists s : float, p = r :>R /\ q = s :>R /\ Fexp r = Fexp s).
Theorem FdigitEq :
forall x y : float,
~ is_Fzero x -> x = y :>R -> Fdigit x = Fdigit y -> x = y.
End definitions.
Hint Resolve Rlt_monotony_exp Rle_monotone_exp: real.
Hint Resolve Zlt_not_eq Zlt_not_eq_rev: zarith.