Library RND
Require Export AllFloat.
Section Round.
Variable b : Fbound.
Variable radix : Z.
Variable p : nat.
Coercion Local FtoRradix := FtoR radix.
Hypothesis radixMoreThanOne : (1 < radix)%Z.
Hypothesis pGreaterThanOne : 1 < p.
Hypothesis pGivesBound : Zpos (vNum b) = Zpower_nat radix p.
Various lemmas about exp, ln
Theorem exp_ln_powerRZ :
forall u v : Z, (0 < u)%Z -> exp (ln u * v) = powerRZ u v.
Theorem ln_radix_pos : (0 < ln radix)%R.
Theorem exp_le_inv : forall x y : R, (exp x <= exp y)%R -> (x <= y)%R.
Theorem exp_monotone : forall x y : R, (x <= y)%R -> (exp x <= exp y)%R.
Theorem firstNormalPos_eq :
FtoRradix (firstNormalPos radix b p) = powerRZ radix (Zpred p + - dExp b).
Results about the ineger rounding down
Definition IRNDD (r : R) := Zpred (up r).
Theorem IRNDD_correct1 : forall r : R, (IRNDD r <= r)%R.
Theorem IRNDD_correct2 : forall r : R, (r < Zsucc (IRNDD r))%R.
Theorem IRNDD_correct3 : forall r : R, (r - 1 < IRNDD r)%R.
Hint Resolve IRNDD_correct1 IRNDD_correct2 IRNDD_correct3: real.
Theorem IRNDD_pos : forall r : R, (0 <= r)%R -> (0 <= IRNDD r)%R.
Theorem IRNDD_monotone : forall r s : R, (r <= s)%R -> (IRNDD r <= IRNDD s)%R.
Theorem IRNDD_eq :
forall (r : R) (z : Z), (z <= r)%R -> (r < Zsucc z)%R -> IRNDD r = z.
Theorem IRNDD_projector : forall z : Z, IRNDD z = z.
Rounding down of a positive real
Definition RND_Min_Pos (r : R) :=
match Rle_dec (firstNormalPos radix b p) r with
| left _ =>
let e := IRNDD (ln r / ln radix + (- Zpred p)%Z) in
Float (IRNDD (r * powerRZ radix (- e))) e
| right _ => Float (IRNDD (r * powerRZ radix (dExp b))) (- dExp b)
end.
Theorem RND_Min_Pos_bounded_aux :
forall (r : R) (e : Z),
(0 <= r)%R ->
(- dExp b <= e)%Z ->
(r < powerRZ radix (e + p))%R ->
Fbounded b (Float (IRNDD (r * powerRZ radix (- e))) e).
Theorem RND_Min_Pos_canonic :
forall r : R, (0 <= r)%R -> Fcanonic radix b (RND_Min_Pos r).
Theorem RND_Min_Pos_Rle : forall r : R, (0 <= r)%R -> (RND_Min_Pos r <= r)%R.
Theorem RND_Min_Pos_monotone :
forall r s : R,
(0 <= r)%R -> (r <= s)%R -> (RND_Min_Pos r <= RND_Min_Pos s)%R.
Theorem RND_Min_Pos_projector :
forall f : float,
(0 <= f)%R -> Fcanonic radix b f -> FtoRradix (RND_Min_Pos f) = f.
Theorem RND_Min_Pos_correct :
forall r : R, (0 <= r)%R -> isMin b radix r (RND_Min_Pos r).
Easily deduced, the rounding up of a positive real
Definition RND_Max_Pos (r : R) :=
match Req_EM_T r (RND_Min_Pos r) with
| left _ => RND_Min_Pos r
| right _ => FSucc b radix p (RND_Min_Pos r)
end.
Theorem RND_Max_Pos_canonic :
forall r : R, (0 <= r)%R -> Fcanonic radix b (RND_Max_Pos r).
Theorem RND_Max_Pos_Rle : forall r : R, (0 <= r)%R -> (r <= RND_Max_Pos r)%R.
Theorem RND_Max_Pos_correct :
forall r : R, (0 <= r)%R -> isMax b radix r (RND_Max_Pos r).
Roundings up and down of any real
Definition RND_Min (r : R) :=
match Rle_dec 0 r with
| left _ => RND_Min_Pos r
| right _ => Fopp (RND_Max_Pos (- r))
end.
Theorem RND_Min_canonic : forall r : R, Fcanonic radix b (RND_Min r).
Theorem RND_Min_correct : forall r : R, isMin b radix r (RND_Min r).
Definition RND_Max (r : R) :=
match Rle_dec 0 r with
| left _ => RND_Max_Pos r
| right _ => Fopp (RND_Min_Pos (- r))
end.
Theorem RND_Max_canonic : forall r : R, Fcanonic radix b (RND_Max r).
Theorem RND_Max_correct : forall r : R, isMax b radix r (RND_Max r).
Definition RND_Zero (r : R) :=
match Rle_dec 0 r with
| left _ => RND_Min r
| right _ => RND_Max r
end.
Theorem RND_Zero_canonic : forall r : R, Fcanonic radix b (RND_Zero r).
Theorem RND_Zero_correct : forall r : R, ToZeroP b radix r (RND_Zero r).
Rounding to the nearest of any real
First, ClosestUp (when equality, the biggest is returned)
Then, EvenClosest (when equality, the even is returned)
Definition RND_ClosestUp (r : R) :=
match Rle_dec (Rabs (RND_Max r - r)) (Rabs (RND_Min r - r)) with
| left _ => RND_Max r
| right _ => RND_Min r
end.
Theorem RND_ClosestUp_canonic :
forall r : R, Fcanonic radix b (RND_ClosestUp r).
Theorem RND_ClosestUp_correct :
forall r : R, Closest b radix r (RND_ClosestUp r).
Definition RND_EvenClosest (r : R) :=
match Rle_dec (Rabs (RND_Max r - r)) (Rabs (RND_Min r - r)) with
| left H =>
match
Rle_lt_or_eq_dec (Rabs (RND_Max r - r)) (Rabs (RND_Min r - r)) H
with
| left _ => RND_Max r
| right _ =>
match OddEvenDec (Fnum (RND_Min r)) with
| left _ => RND_Max r
| right _ => RND_Min r
end
end
| right _ => RND_Min r
end.
Theorem RND_EvenClosest_canonic :
forall r : R, Fcanonic radix b (RND_EvenClosest r).
Theorem RND_EvenClosest_correct :
forall r : R, EvenClosest b radix p r (RND_EvenClosest r).
End Round.