formatfortranoutputgfortranreal-datatype

gfortran - Is unspecified decimal length allowed for real output?


Is there a way to format a real number for output such that both the width and decimal parts are left unspecified? This is possible with ifort by just doing the following:

write (*, '(F)') num

...but I understand that that usage is a compiler-specific extension. Gfortran does accept the standard-compliant 0-width specifier, but I can't find anything in the standard nor in gfortran's documentation about how to leave the decimal part unspecified. The obvious guess is to just use 0 for that as well, but that yields a different result. For example, given this:

real :: num
num = 3.14159
write (*, '(F0.0)') num

...the output is just 3.. I know I could specify a decimal value greater than zero, but then I am liable to have undesired extra zeros printed.

What are my options? Do I have any?


Solution

  • Best solution:

    It turns out that the easiest solution is to use the g specifier ("g" for "generalized editing"). That accepts a 0 to mean unspecified/processor-dependent width, which is exactly what I wanted. This is preferable to leaving the entire format unspecified (write(*,*)) because you can still control other parts of the output, for example:

    real :: num
    character(len=10) :: word
    num = 3.14159
    word = 'pi = '
    write (*, '(a5,g0)') word, num
    

    yields this:

    pi = 3.14159012
    

    Thanks to Vladimir F for the idea (seen here).

    Inferior alternative:

    My first thought this morning after seeing High Performance Mark's answer was to write the real number to a character string and then use that:

    character(len=20) :: cnum
    write (cnum, *), num
    write (*, '(a5,a)') word, trim(adjustl(cnum))
    

    It yields the same output as the best solution, but it is a little more complicated and it doesn't offer quite as much control, but it gets close.