(** Absolute value *)

Definition Babs abs_nan (x : binary_float) : binary_float :=
  match x with
  | B754_nan sx plx =>
      let '(sres, plres) := abs_nan sx plx in B754_nan sres plres
  | B754_infinity sx => B754_infinity false
  | B754_finite sx mx ex Hx => B754_finite false mx ex Hx
  | B754_zero sx => B754_zero false
  end.

(* Specifications: *)
Theorem B2R_Babs : forall abs_nan x, B2R (Babs abs_nan x) = Rabs (B2R x).
Theorem is_finite_Babs : forall abs_nan x, is_finite (Babs abs_nan x) = is_finite x.
Theorem Bsign_Babs : forall abs_nan x, is_nan x = false -> Bsign (Babs abs_nan x) = false.
Theorem Babs_idempotent : forall abs_nan (x: binary_float), is_nan x = false -> Babs abs_nan (Babs abs_nan x) = Babs abs_nan x.
Theorem Babs_Bopp : forall abs_nan opp_nan x, is_nan x = false -> Babs abs_nan (Bopp opp_nan x) = Babs abs_nan x.
Theorem B2R_Babs : forall abs_nan x, B2R (Babs abs_nan x) = Rabs (B2R x).
Theorem is_finite_Babs : forall abs_nan x, is_finite (Babs abs_nan x) = is_finite x.
Theorem Bsign_Babs : forall abs_nan x, is_nan x = false -> Bsign (Babs abs_nan x) = false.
Theorem Babs_idempotent : forall abs_nan (x: binary_float), is_nan x = false -> Babs abs_nan (Babs abs_nan x) = Babs abs_nan x.
Theorem Babs_Bopp : forall abs_nan opp_nan x, is_nan x = false -> Babs abs_nan (Bopp opp_nan x) = Babs abs_nan x.