Half precision (16-bit) floating-point is supported for values and variables of
type REAL
and COMPLEX
.
This floating-point kind conforms to the IEEE arithmetic standard (ISO/IEC/IEEE 60559:2011).
The intrinsic function SELECTED_REAL_KIND(3)
and intrinsic module function
IEEE_SELECTED_REAL_KIND(3)
return the kind value for half precision.
In -kind=byte mode, the value will be two; in -kind=sequential
mode, it will be 16 (this unusual value was chosen to maintain upward compatibility of kind
numbers).
The largest finite half-precision value is 65504.0
, the smallest normal half-precision value is
0.00006103515625
, and the smallest subnormal value is 0.000000059604644775390625
.
Scalar half-precision operations are evaluated in single precision, and only rounded to half precision
when assigned to a variable or passed as an actual argument to a non-intrinsic or non-mathematical
procedure (e.g. SQRT
is mathematical, but NEAREST
is not).
This can be controlled by the -round_hreal option; if used, all half-precision
operations will be rounded to half precision, both at compile time and run time.
Because of all the conversions needed, half precision is slower than single precision; its sole benefit is halving the memory and file storage requirements.