2

有没有办法格式化输出的实数,使得宽度和小数部分都未指定?只需执行以下操作,ifort 就可以做到这一点:

write (*, '(F)') num

...但我知道这种用法是特定于编译器的扩展。Gfortran 确实接受符合标准的 0 宽度说明符,但我在标准和 gfortran 的文档中都找不到关于如何不指定小数部分的任何内容。显而易见的猜测是也只使用 0,但这会产生不同的结果。例如,鉴于此:

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

...输出只是3.. 我知道我可以指定一个大于零的十进制值,但是我很可能会打印出不需要的额外零。

我有哪些选择?我有吗?

4

2 回答 2

2

最佳解决方案:

事实证明,最简单的解决方案是使用说明g符(“g”表示“通用编辑”)。这接受 a0表示未指定/处理器相关的宽度,这正是我想要的。这比不指定整个格式 ( write(*,*)) 更好,因为您仍然可以控制输出的其他部分,例如:

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

产生这个:

pi = 3.14159012

感谢Vladimir F的想法(见此处)。

劣质替代品:

今天早上看到高性能标记的答案后,我的第一个想法是将实数写入字符串,然后使用它:

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

它产生与最佳解决方案相同的输出,但它有点复杂,并且没有提供那么多控制,但它接近了。

于 2013-11-12T16:19:06.757 回答
1

您始终可以使用list-directed output,即

write(*,*) num

但这会将num' 格式的所有控制权交给允许选择任何合理表示的编译器。

您的问题清楚地表明了一些您​​不想要的格式选项,但在明确说明您希望如何格式化输出时不太明确。

于 2013-11-11T22:43:07.043 回答