Set Implicit Arguments. Require Export Shared. Require Flocq.Appli.Fappli_IEEE Flocq.Appli.Fappli_IEEE_bits. (**************************************************************) (** ** Type for number (IEEE floats) *) Definition number : Type := Fappli_IEEE_bits.binary64. (**************************************************************) (** ** Particular values of numbers *) (* LATER: find definitions in Flocq *) Parameter nan : number. Parameter zero : number. Parameter neg_zero : number. Definition one := Fappli_IEEE.binary_normalize 53 1024 eq_refl eq_refl Fappli_IEEE.mode_NE 1 0 false. Parameter infinity : number. Parameter neg_infinity : number. Parameter max_value : number. Parameter min_value : number. Parameter pi : number. Parameter e : number. Parameter ln2 : number. (**************************************************************) (** ** Conversions on numbers *) (* LATER: implement definitions *) Parameter from_string : string -> number. Parameter to_string : number -> string. (**************************************************************) (** ** Unary operations on numbers *) (* LATER: find definitions in Flocq *) Parameter neg : number -> number. Parameter floor : number -> number. Parameter absolute : number -> number. Parameter sign : number -> number. (* returns arbitrary when x is zero or nan *) Parameter lt_bool : number -> number -> bool. (**************************************************************) (** ** Binary operations on numbers *) Definition add : number -> number -> number := Fappli_IEEE_bits.b64_plus Fappli_IEEE.mode_NE. Parameter sub : number -> number -> number. (* todo: bind *) Parameter fmod : number -> number -> number. (* todo: bind *) Definition mult : number -> number -> number := Fappli_IEEE_bits.b64_mult Fappli_IEEE.mode_NE. Definition div : number -> number -> number := Fappli_IEEE_bits.b64_div Fappli_IEEE.mode_NE. (* Todo: find comparison operator *) Global Instance number_comparable : Comparable number. Proof. Admitted. (**************************************************************) (** ** Conversions with Int32 *) Parameter of_int : int -> number. (* LATER: this is quite complex. Should we make it precise? *) Parameter to_int32 : number -> int. (* Remark: extracted code could, for efficiency reasons, use Ocaml Int32 *) Parameter to_uint32 : number -> int. Parameter to_int16 : number -> int. (* currently not used *) (* LATER: Check that the OCaml extraction is correct. *) (**************************************************************) (** Implements the operation that masks all but the 5 least significant bits of a non-negative number (obtained as the result of to_uint32 *) Parameter modulo_32 : int -> int. (** Implements int32 operation *) Parameter int32_bitwise_not : int -> int. Parameter int32_bitwise_and : int -> int -> int. Parameter int32_bitwise_or : int -> int -> int. Parameter int32_bitwise_xor : int -> int -> int. Parameter int32_left_shift : int -> int -> int. Parameter int32_right_shift : int -> int -> int. Parameter uint32_right_shift : int -> int -> int. (**************************************************************) (** ** Int32 related conversion *)