The module ieee_arithmetic is an intrinsic module defined in the technical report ISO/IEC TR 15580:1998(E) which provides IEEE arithmetic facilities.
integer function ieee_selected_real_kind(p,r)
integer(kind1), optional :: p
integer(kind2), optional :: r
This function behaves like the selected_real_kind intrinsic, but only returns numbers of of IEEE kinds of reals.
logical function ieee_support_datatype(x)
real(kind), optional :: x
Returns .true. if IEEE arithmetic is supported for the same kind of real as x (or for all real kinds if x is absent).
logical function ieee_support_denormal(x)
real(kind), optional :: X
Returns .true. if IEEE denormal values are supported for the same kind of real as x (or for all real kinds if x is absent).
logical function ieee_support_divide(x)
real(kind), optional :: x
Returns .true. if division up to IEEE-specified accuracy is supported for the same kind of real as x (or for all real kinds if x is absent).
logical function ieee_support_inf(x)
real(kind), optional :: x
Returns .true. if IEEE infinite values are supported for the same kind of real as x (or for all real kinds if x is absent).
logical function ieee_support_nan(x)
real(kind), optional :: x
Returns .true. if IEEE NaN (Not-a-Number) values are supported for the same kind of real as x (or for all real kinds if x is absent).
logical function ieee_support_sqrt(x)
real(kind), optional :: x
Returns .true. if sqrt follows the IEEE standard for the same kind of real as x (or for all real kinds if x is absent).
logical function ieee_support_standard(x)
real(kind), optional :: x
Returns .true. if all the IEEE facilities are supported for the same kind of real as x (or for all real kinds if x is absent).
The module also contains the following elemental functions for reals x and y for which ieee_support_datatype is true:
ieee_class(x)–ieee class.ieee_value(x,class)–generate a sample IEEE value of the specified class.ieee_is_finite(x)–determine if a value is finite.ieee_is_nan(x)–determine if a value is IEEE NaN.ieee_is_negative(x)–determine if a value is negative.ieee_is_normal(x)–determine if a value is “normal,” neither an Inf, NaN, nor denormalized.ieee_unordered(x,y)–IEEE unordered function. True if either x or y is NaN and false otherwise.Values of type ieee_class_type indicate the IEEE class of a number which can be one of the following
type(ieee_class_type), parameter :: ieee_negative_denormal
type(ieee_class_type), parameter :: ieee_negative_inf
type(ieee_class_type), parameter :: ieee_negative_normal
type(ieee_class_type), parameter :: ieee_negative_zero
type(ieee_class_type), parameter :: ieee_positive_denormal
type(ieee_class_type), parameter :: ieee_positive_inf
type(ieee_class_type), parameter :: ieee_positive_normal
type(ieee_class_type), parameter :: ieee_positive_zero
type(ieee_class_type), parameter :: ieee_quiet_nan
type(ieee_class_type), parameter :: ieee_signaling_nan
The module ieee_arithmetic also defines the == and /= operators for the ieee_class_type. These may be used to test the return value of the ieee_class function. For example:
if (ieee_class(x) == ieee_quiet_nan) then
! ...
end if
ieee_copy_sign(x,y)–IEEE copysign function.ieee_logb(x)–unbiased exponent in the IEEE floating point format.ieee_next_after(x,y)–returns the next representable neighbor of x in the direction toward y.ieee_rem(x,y)–the IEEE rem function, that is x - y*n, where n is the integer nearest to the exact value x/y.ieee_rint(x)–round to an integer value according to the current rounding mode.ieee_scalb(x,i)–Returns x*2i.