复数的fortran格式说明符

343*_*458 5 fortran gfortran fortran90

我可以在fortran中为复数指定格式说明符吗?我有一个简单的程序.

program complx1
implicit none
complex :: var1
var1 = (10,20)
write (*,*) var1
write (*,'(F0.0)') var1
write (*,'(F0.0,A,F0.0)') real(var1), ' + i ' , aimag(var1)
end program complx1
Run Code Online (Sandbox Code Playgroud)

输出:

 (  10.0000000    ,  20.0000000    )
10.
20.
10. + i 20.
Run Code Online (Sandbox Code Playgroud)

我想使用内置格式a+bi与一些格式说明符,而不是手动(第二个程序的最后一行).显然F0.0没有用.有任何想法吗?

编辑:我认为这不是帖子的重复:在fortran中编写复杂矩阵,它表示使用REALAIMAG函数.我已经使用过这些函数,并想知道是否有一种可以完成工作的内置格式.

Hig*_*ark 7

@francescalus现有的,大多数令人满意的答案的附录.格式字符串,如

fmt = '(F0.0,SP,F0.0,"i")'
Run Code Online (Sandbox Code Playgroud)

应该导致复数显示实部和虚部之间的正确符号; 没有必要摆弄字符串以获得加号.


fra*_*lus 4

没有明显的复杂编辑描述符。在 Fortran 2008 中,我们看到 10.7.2.3.6

复杂数据由一对单独的真实数据组成。复杂类型标量数据的编辑由两个编辑描述符指定,每个编辑描述符指定实际数据的编辑。

在您所说的第二个示例中,您说“不起作用”,您会看到这种格式正在起作用。由于该格式只有一个描述符且没有重复计数,因此这些值将输出到不同的记录中(格式反转)。

三种情况中的第一种是非常特殊的:它使用列表定向输出。输出的规则是

复数常数括在括号内,实部和虚部之间有分隔符

提到的第一条规则还有另一个有用的部分:

可以在实部的编辑描述符和虚部的编辑描述符之间处理控制和字符串编辑描述符。

您可以愉快地调整您的第二次尝试,因为我们注意到您的“不起作用”并不是因为使用了复数变量本身(而不是实部和虚部)

write (*, '(F0.0,"+i",F0.0)') var1
Run Code Online (Sandbox Code Playgroud)

但是,当您有潜在的负面复杂部分时,这是不正确的。您需要更改中间的标志。这是可能的,使用带有条件的字符变量格式(而不是文字),但它可能不值得付出努力。有关另一种方法的详细信息,请参阅另一个答案,类似于您的第三种选择,但更强大。

另一种选择是编写一个函数,该函数返回复杂变量的正确书写的字符表示形式。这就像你的第三个选择。当您想要写出许多复杂变量时,这也是最不混乱的方法。

最后,如果您确实必须担心负面的复杂部分,但想要变量列表的简单规范,那么真正丑陋的是

write(*,'(F0.0,"+i*(",F0.0,")")') var1
Run Code Online (Sandbox Code Playgroud)

或富有想象力的

character(19) fmt
fmt = '(F0.0,"+",F0.0,"i")'
fmt(8:8) = MERGE('+',' ',var1%im.gt.0)
write(*,fmt) var1
Run Code Online (Sandbox Code Playgroud)

或者更好地使用High Performance Mark 的答案SP给出的控制编辑描述符,它临时(在输出语句的持续时间内)设置传输的符号模式,强制打印其他可选的“+”符号。[或者,可以使用说明符为连接本身进行设置。]PLUSopensign='plus'

所有这一切都是因为简单的答案是:不,没有内置的复杂编辑描述符。