复数的Fortran格式说明符

7
我能为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

输出:

 (  10.0000000    ,  20.0000000    )
10.
20.
10. + i 20.

我想使用内置的格式来处理 a+bi,而不是手动处理(程序的倒数第二行)。显然,F0.0 不起作用。有什么建议吗?
编辑: 我认为这不是 writing complex matrix in fortran 的重复,该帖子建议使用 REALAIMAG 函数。我已经使用了这些函数,并想知道是否有内置格式可以完成这项工作。

是否存在内置格式? - 343_458
1
可能与在Fortran中编写复杂矩阵有重复。 - francescalus
@francescalus,我不认为这是重复的。请查看问题中的编辑部分。 - 343_458
那个答案提出了这种方法,因为没有“自然”的其他方式。我已经取消删除(并改进)了我的答案(在我发现那个问题之前 - 出于同样的错误...),希望能解释清楚为什么。[此外,我认为这是一个更好的问题,所以我会把它留在那里,以防其他人认为重复应该走另一条路。如果有共识,也可以再次删除。] - francescalus
2个回答

10

对@francescalus现有回答的补充,大部分情况下已经很令人满意了。像以下这样的格式化字符串:

fmt = '(F0.0,SP,F0.0,"i")'

应当显示复数,实部和虚部之间的符号正确;不需要为了在其中获得加号而摆弄字符串。


我现在感觉很傻,因为我总是忘记"+"实际上是可选的而不是被禁止的(因此可以像这样进行控制)。尽管如此,为了使我的答案有一些价值,我会注意到SP是一个控制编辑描述符,正如在那里明确允许的那样... - francescalus

4
没有明确的复杂编辑描述符。在Fortran 2008中,我们看到10.7.2.3.6:
复杂数据由一对单独的实数数据组成。对于复杂类型的标量数据的编辑由两个编辑描述符指定,每个描述符都指定了实数数据的编辑。
在您提供的第二个例子中,您说“没有起作用”,您可以看到这种格式的效果。因为格式只有一个没有重复计数的描述符,所以值是以不同的记录输出的(格式版本)。
您提供的三种情况中的第一种非常特殊:它使用列表定向输出。 输出的规则为:
- 复杂常量用括号括起来,实部和虚部之间有分隔符。
第一条提到的另一个有用的部分是:
- 可以在实部和虚部的编辑描述符之间处理控制和字符字符串编辑描述符。
您可以适当修改您的第二次尝试,因为我们注意到您的“无法工作”不是由于使用的复杂变量本身(而是由于实部和虚部)。
write (*, '(F0.0,"+i",F0.0)') var1

这种做法并不适用于可能存在负复数部分的情况。你需要在中间改变符号。这是可能的,可以使用字符变量格式(而非文字)和条件语句,但可能并不值得这样做。详情请参见另一个答案,介绍了一种类似于第三种选项但更加强大的方法。
另一个选择是编写一个函数,返回正确编写的复数变量的字符表示形式。这就像你的第三个选项。当你要编写多个复杂变量时,这也是最简洁的做法。
最后,如果你确实担心负复数部分,但想要简单的变量列表规范,那么真正丑陋的方法如下:
write(*,'(F0.0,"+i*(",F0.0,")")') var1

或者是富有想象力的。
character(19) fmt
fmt = '(F0.0,"+",F0.0,"i")'
fmt(8:8) = MERGE('+',' ',var1%im.gt.0)
write(*,fmt) var1

或者更好的方法是使用SP控制编辑描述符,如High Performance Mark的回答所述。在输出语句的持续时间内,它临时将传输的符号模式设置为PLUS,从而强制打印否则可选的"+"符号。[或者,这可以在open时为连接本身设置sign='plus'说明符。]所有这些都是因为简单的答案是:没有内置的复杂编辑描述符。请注意保留HTML标记。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接