When writing integer data as strings with
String, str, or
to_file, any of the following text formats may
be used:
character(len=1), parameter :: INT_FMTS(*) = [ "i", "z" ] ! Allowed formats for integers
"i": integer format (default), e.g. 123456"z": hexadecimal format, e.g. 0x1e240When writing floating point numbers of type real or complex as
strings with String, str, or
to_file, any of the following text formats may
be used:
character(len=1), parameter :: REAL_FMTS(*) = [ "e", "f", "z" ] ! Allowed formats for floats
"e": normalized exponential format (default), e.g.
1.23456789012345675e+005"f": decimal format, e.g. 123456.789012345674"z": hexadecimal format, e.g. 0x40fe240c9fcb68cdNote
The "z" hexadecimal format is an unsigned integer format and
may be used for integer, real, or complex data. Floating point
numbers are interpreted bit-wise as unsigned integers when written with
the "z" format, preventing any loss of precision in a round-trip
conversion. This format is preferred in data transfers for which
precision losses are intolerable. The "z" format may also be
preferred for faster read/write times and more compact storage.
When moving data in the opposite direction with the complementary
procedures cast or
from_file, the same fmt is required to
properly cast the data. Specifying a fmt that is different from what
is actually present may result in an I/O syntax error.
Note
By default, real and complex data will be written with a
number of significant digits required for a lossless round-trip
conversion of the form numeric -> string -> numeric. In general, one
may expect the f format to produce losses in round-trip conversion of
up to a few epsilon in as many as a fifth of transfers. However, the
e format is not expected to produce any losses, and the z format
will never produce losses as it involves direct bit transfer (no
base-10 ⇆ base-2 conversions are involved).
Note
For negative integers, the hexadecimal format "z" produces
ambiguities across storage sizes. For instance, the integer 0xff
equates to -1 in int8 storage but equates to 255 in larger
storage sizes. Similarly, the integer 0xffff equates to -1 in
int16 storage but equates to 65535 in larger storage sizes, and so
on. It is the responsibility of the programmer to cast hexadecimal
strings into variables with the proper storage size.