Fcomp

# Library Fcomp

`Require Export Float.
Section comparisons.
Variable radix : Z.
Hypothesis radixMoreThanOne : (1 < radix)%Z.
Let radixMoreThanZERO := Zlt_1_O _ (Zlt_le_weak _ _ radixMoreThanOne).
Hint Resolve radixMoreThanZERO: zarith.
Definition Fdiff (x y : float) :=
(Fnum x * Zpower_nat radix (Zabs_nat (Fexp x - Zmin (Fexp x) (Fexp y))) -
Fnum y * Zpower_nat radix (Zabs_nat (Fexp y - Zmin (Fexp x) (Fexp y))))%Z.
Coercion Local FtoRradix := FtoR radix.
Theorem Fdiff_correct :
forall x y : float,
(Fdiff x y * powerRZ radix (Zmin (Fexp x) (Fexp y)))%R = (x - y)%R.
Definition Feq (x y : float) := x = y :>R.
Definition Fle (x y : float) := (x <= y)%R.
Definition Flt (x y : float) := (x < y)%R.
Definition Fge (x y : float) := (x >= y)%R.
Definition Fgt (x y : float) := (x > y)%R.
Definition Fcompare (x y : float) := (Fdiff x y ?= 0)%Z.
Definition Feq_bool (x y : float) :=
match Fcompare x y with
| Eq => true
| _ => false
end.
Theorem Feq_bool_correct_t :
forall x y : float, Feq_bool x y = true -> Feq x y.
Theorem Feq_bool_correct_r :
forall x y : float, Feq x y -> Feq_bool x y = true.
Theorem Feq_bool_correct_f :
forall x y : float, Feq_bool x y = false -> ~ Feq x y.
Definition Flt_bool (x y : float) :=
match Fcompare x y with
| Lt => true
| _ => false
end.
Theorem Flt_bool_correct_t :
forall x y : float, Flt_bool x y = true -> Flt x y.
Theorem Flt_bool_correct_r :
forall x y : float, Flt x y -> Flt_bool x y = true.
Theorem Flt_bool_correct_f :
forall x y : float, Flt_bool x y = false -> Fle y x.
Definition Fle_bool (x y : float) :=
match Fcompare x y with
| Lt => true
| Eq => true
| _ => false
end.
Theorem Fle_bool_correct_t :
forall x y : float, Fle_bool x y = true -> Fle x y.
Theorem Fle_bool_correct_r :
forall x y : float, Fle x y -> Fle_bool x y = true.
Theorem Fle_bool_correct_f :
forall x y : float, Fle_bool x y = false -> Flt y x.
Lemma Fle_Zle :
forall n1 n2 d : Z, (n1 <= n2)%Z -> Fle (Float n1 d) (Float n2 d).
Lemma Flt_Zlt :
forall n1 n2 d : Z, (n1 < n2)%Z -> Flt (Float n1 d) (Float n2 d).
Lemma Fle_Fge : forall x y : float, Fle x y -> Fge y x.
Lemma Fge_Zge :
forall n1 n2 d : Z, (n1 >= n2)%Z -> Fge (Float n1 d) (Float n2 d).
Lemma Flt_Fgt : forall x y : float, Flt x y -> Fgt y x.
Lemma Fgt_Zgt :
forall n1 n2 d : Z, (n1 > n2)%Z -> Fgt (Float n1 d) (Float n2 d).
Lemma Fle_refl : forall x y : float, Feq x y -> Fle x y.
Lemma Fle_trans : forall x y z : float, Fle x y -> Fle y z -> Fle x z.
Theorem Rlt_Fexp_eq_Zlt :
forall x y : float, (x < y)%R -> Fexp x = Fexp y -> (Fnum x < Fnum y)%Z.
Theorem Rle_Fexp_eq_Zle :
forall x y : float, (x <= y)%R -> Fexp x = Fexp y -> (Fnum x <= Fnum y)%Z.
Theorem LtR0Fnum : forall p : float, (0 < p)%R -> (0 < Fnum p)%Z.
Theorem LeR0Fnum : forall p : float, (0 <= p)%R -> (0 <= Fnum p)%Z.
Theorem LeFnumZERO : forall x : float, (0 <= Fnum x)%Z -> (0 <= x)%R.
Theorem R0LtFnum : forall p : float, (p < 0)%R -> (Fnum p < 0)%Z.
Theorem R0LeFnum : forall p : float, (p <= 0)%R -> (Fnum p <= 0)%Z.
Theorem LeZEROFnum : forall x : float, (Fnum x <= 0)%Z -> (x <= 0)%R.
End comparisons.
Hint Resolve LeFnumZERO LeZEROFnum: float.
`