Definition Fulp (p : float) :=
  powerRZ radix (Fexp (Fnormalize radix b precision p)).

(* Specifications: *)
Theorem FulpComp : forall p q : float, Fbounded b p -> Fbounded b q -> p = q :>R -> Fulp p = Fulp q.
Theorem FulpLe : forall p : float, Fbounded b p -> (Fulp p <= Float 1 (Fexp p))%R.
Theorem Fulp_zero : forall x : float, is_Fzero x -> Fulp x = powerRZ radix (- dExp b).
Theorem FulpLe2 : forall p : float, Fbounded b p -> Fnormal radix b (Fnormalize radix b precision p) -> (Fulp p <= Rabs p * powerRZ radix (Zsucc (- precision)))%R.
Theorem FulpGe : forall p : float, Fbounded b p -> (Rabs p <= (powerRZ radix precision - 1) * Fulp p)%R.
Theorem LeFulpPos : forall x y : float, Fbounded b x -> Fbounded b y -> (0 <= x)%R -> (x <= y)%R -> (Fulp x <= Fulp y)%R.
Theorem FulpSucCan : forall p : float, Fcanonic radix b p -> (FSucc b radix precision p - p <= Fulp p)%R.
Theorem FulpSuc : forall p : float, Fbounded b p -> (FNSucc b radix precision p - p <= Fulp p)%R.
Theorem FulpPredCan : forall p : float, Fcanonic radix b p -> (p - FPred b radix precision p <= Fulp p)%R.
Theorem FulpPred : forall p : float, Fbounded b p -> (p - FNPred b radix precision p <= Fulp p)%R.
Theorem FSuccDiffPos : forall x : float, (0 <= x)%R -> Fminus radix (FSucc b radix precision x) x = Float 1%nat (Fexp x) :>R.
Theorem FulpFPredGePos : forall f : float, Fbounded b f -> Fcanonic radix b f -> (0 < f)%R -> (Fulp (FPred b radix precision f) <= Fulp f)%R.
Theorem CanonicFulp : forall p : float, Fcanonic radix b p -> Fulp p = Float 1%nat (Fexp p).
Theorem FSuccUlpPos : forall x : float, Fcanonic radix b x -> (0 <= x)%R -> Fminus radix (FSucc b radix precision x) x = Fulp x :>R.
Theorem FNSuccUlpPos : forall x : float, Fcanonic radix b x -> (0 <= x)%R -> Fminus radix (FNSucc b radix precision x) x = Fulp x :>R.
Theorem FulpFabs : forall f : float, Fulp f = Fulp (Fabs f) :>R.
Theorem RoundedModeUlp : forall P, RoundedModeP b radix P -> forall (p : R) (q : float), P p q -> (Rabs (p - q) < Fulp q)%R.
Theorem RoundedModeErrorExpStrict : forall P, RoundedModeP b radix P -> forall (p q : float) (x : R), Fbounded b p -> Fbounded b q -> P x p -> q = (x - p)%R :>R -> q <> 0%R :>R -> (Fexp q < Fexp p)%Z.
Theorem RoundedModeProjectorIdem : forall P (p : float), RoundedModeP b radix P -> Fbounded b p -> P p p.
Theorem RoundedModeBounded : forall P (r : R) (q : float), RoundedModeP b radix P -> P r q -> Fbounded b q.
Theorem RoundedModeProjectorIdemEq : forall (P : R -> float -> Prop) (p q : float), RoundedModeP b radix P -> Fbounded b p -> P (FtoR radix p) q -> p = q :>R.
Theorem RoundedModeMult : forall P, RoundedModeP b radix P -> forall (r : R) (q q' : float), P r q -> Fbounded b q' -> (r <= radix * q')%R -> (q <= radix * q')%R.
Theorem RoundedModeMultLess : forall P, RoundedModeP b radix P -> forall (r : R) (q q' : float), P r q -> Fbounded b q' -> (radix * q' <= r)%R -> (radix * q' <= q)%R.
Theorem RleMinR0 : forall (r : R) (min : float), (0 <= r)%R -> isMin b radix r min -> (0 <= min)%R.
Theorem RleRoundedR0 : forall (P : R -> float -> Prop) (p : float) (r : R), RoundedModeP b radix P -> P r p -> (0 <= r)%R -> (0 <= p)%R.
Theorem RleMaxR0 : forall (r : R) (max : float), (r <= 0)%R -> isMax b radix r max -> (max <= 0)%R.
Theorem RleRoundedLessR0 : forall (P : R -> float -> Prop) (p : float) (r : R), RoundedModeP b radix P -> P r p -> (r <= 0)%R -> (p <= 0)%R.
Theorem PminPos : forall p min : float, (0 <= p)%R -> Fbounded b p -> isMin b radix (/ 2%nat * p) min -> exists c : float, Fbounded b c /\ c = (p - min)%R :>R.
Theorem div2IsBetweenPos : forall p min max : float, (0 <= p)%R -> Fbounded b p -> isMin b radix (/ 2%nat * p) min -> isMax b radix (/ 2%nat * p) max -> p = (min + max)%R :>R.
Theorem div2IsBetween : forall p min max : float, Fbounded b p -> isMin b radix (/ 2%nat * p) min -> isMax b radix (/ 2%nat * p) max -> p = (min + max)%R :>R.
Theorem RoundedModeMultAbs : forall P, RoundedModeP b radix P -> forall (r : R) (q q' : float), P r q -> Fbounded b q' -> (Rabs r <= radix * q')%R -> (Rabs q <= radix * q')%R.
Theorem isMinComp : forall (r1 r2 : R) (min max : float), isMin b radix r1 min -> isMax b radix r1 max -> (min < r2)%R -> (r2 < max)%R -> isMin b radix r2 min.
Theorem isMaxComp : forall (r1 r2 : R) (min max : float), isMin b radix r1 min -> isMax b radix r1 max -> (min < r2)%R -> (r2 < max)%R -> isMax b radix r2 max.
Theorem roundedModeLessMult : forall (P : R -> float -> Prop) (p : float) (r : R), RoundedModeP b radix P -> P r p -> (Float 1%nat (- dExp b) <= r)%R -> (p <= radix * r)%R.
Theorem roundedModeMoreMult : forall (P : R -> float -> Prop) (p : float) (r : R), RoundedModeP b radix P -> P r p -> (r <= Float (- 1%nat) (- dExp b))%R -> (radix * r <= p)%R.
Theorem roundedModeAbsMult : forall (P : R -> float -> Prop) (p : float) (r : R), RoundedModeP b radix P -> P r p -> (Float 1%nat (- dExp b) <= Rabs r)%R -> (Rabs p <= radix * Rabs r)%R.
Theorem RleBoundRoundl : forall P, RoundedModeP b radix P -> forall (p q : float) (r : R), Fbounded b p -> (p <= r)%R -> P r q -> (p <= q)%R.
Theorem RleBoundRoundr : forall P, RoundedModeP b radix P -> forall (p q : float) (r : R), Fbounded b p -> (r <= p)%R -> P r q -> (q <= p)%R.
Theorem RoundAbsMonotoner : forall (P : R -> float -> Prop) (p : R) (q r : float), RoundedModeP b radix P -> Fbounded b r -> P p q -> (Rabs p <= r)%R -> (Rabs q <= r)%R.
Theorem RoundAbsMonotonel : forall (P : R -> float -> Prop) (p : R) (q r : float), RoundedModeP b radix P -> Fbounded b r -> P p q -> (r <= Rabs p)%R -> (r <= Rabs q)%R.
Theorem ZroundZ : forall (P : R -> float -> Prop) (z : Z) (p : float), RoundedModeP b radix P -> P z p -> exists z' : Z, p = z' :>R.
Theorem NroundN : forall (P : R -> float -> Prop) (n : nat) (p : float), RoundedModeP b radix P -> P n p -> exists n' : nat, p = n' :>R.
Theorem FUlp_Le_LSigB : forall x : float, Fbounded b x -> (Fulp x <= Float 1%nat (LSB radix x))%R.
Theorem MSBisMin : forall f1 f2 : float, (0 <= f1)%R -> isMin b radix f1 f2 -> ~ is_Fzero f1 -> ~ is_Fzero f2 -> MSB radix f1 = MSB radix f2.
Theorem MSBtoZero : forall f1 f2 : float, ToZeroP b radix f1 f2 -> ~ is_Fzero f1 -> ~ is_Fzero f2 -> MSB radix f1 = MSB radix f2.
Theorem MSBBoundNotZero : forall P : R -> float -> Prop, RoundedModeP b radix P -> forall f1 f2 : float, P f1 f2 -> f1 <> 0%R :>R -> (- dExp b <= MSB radix f1)%Z -> f2 <> 0%R :>R.
Theorem RoundMSBmax : forall (P : R -> float -> Prop) (p q : float), RoundedModeP b radix P -> P p q -> p <> 0%R :>R -> (- dExp b <= MSB radix p)%Z -> (MSB radix q <= Zsucc (MSB radix p))%Z.
Theorem RoundMSBmin : forall (P : R -> float -> Prop) (p q : float), RoundedModeP b radix P -> P p q -> p <> 0%R :>R -> (- dExp b <= MSB radix p)%Z -> (MSB radix p <= MSB radix q)%Z.
Theorem RoundLSBMax : forall (P : R -> float -> Prop) (p q : float), RoundedModeP b radix P -> P p q -> ~ is_Fzero q -> (LSB radix p <= LSB radix q)%Z.
Theorem InBinade : forall (P : R -> float -> Prop) (p q r : float) (e : Z), RoundedModeP b radix P -> Fbounded b p -> Fbounded b q -> P (p + q)%R r -> (- dExp b <= e)%Z -> (Float (Zpower_nat radix (pred precision)) e <= p)%R -> (p <= Float (pPred (vNum b)) e)%R -> (0%nat < q)%R -> (q < powerRZ radix e)%R -> r = p :>R \/ r = (p + powerRZ radix e)%R :>R.