gfortran - Is unspecified decimal length allowed f

2019-07-11 11:58发布

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?

2条回答
时光不老,我们不散
2楼-- · 2019-07-11 12:27

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.

查看更多
甜甜的少女心
3楼-- · 2019-07-11 12:36

You can always use list-directed output, that is

write(*,*) num

but this surrenders all control of num's format to the compiler which is allowed to choose any reasonable representation.

Your question makes clear some formatting options that you don't want, but is less forthcoming on a clear specification of how you want the output formatted.

查看更多
登录 后发表回答