复数的fortran格式说明符

时间:2015-05-17 19:38:22

标签: fortran fortran90 gfortran

我可以在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函数。我已经使用过这些函数,并想知道是否有一种可以完成工作的内置格式。

2 个答案:

答案 0 :(得分:6)

@francescalus现有的,大多数令人满意的答案的补遗。格式字符串,例如

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

应该会显示一个复数,并在实部和虚部之间显示正确的符号;没有必要摆弄字符串以获得加号。

答案 1 :(得分:3)

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

  

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

在您说的第二个示例中,#34;无效",您会看到此格式化操作。因为格式只有一个没有重复计数的描述符,所以在不同的记录中输出值(格式返回)。

你的三个案例中的第一个是一个非常特殊的案例:它使用列表导向的输出。输出规则是

  

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

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

  

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

你可以愉快地调整你的第二次尝试,因为我们注意到你的"没有工作"因为使用复杂变量本身(而不是真实和虚构的组件)而不是

write (*, '(F0.0,"+i",F0.0)') var1

但是,当你有可能出现负面复杂的部分时,这是不对的。你需要改变中间的标志。这是可能的,使用带有条件的字符变量格式(而不是文字),但它可能不值得努力。有关其他方法的详细信息,请参阅another answer,类似于您的第三个选项,但更强大。

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

最后,如果你不得不担心负面的复杂部分,但想要一个简单的变量列表规范,那就是真正的丑陋

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

或更好地使用High Performance Mark's answer给出的SP控件编辑描述符,它暂时(在输出语句的持续时间内)将传输的符号模式设置为PLUS这会强制打印其他可选的" +"标志。 [或者,可以使用open说明符在sign='plus'中为连接本身设置此值。]

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