初始化复杂数组的快速准确方法是什么?以下是否存在任何差异:
complex(real64) :: x(2,2)
x = 0
x = 0d0
x = (0d0,0d0)
它们是否相同,我可以假设每个编译器都得到相同的结果吗?标准是否对此有所说明?问题是具体关于初始化为零,而不是任何其他数字。
答案 0 :(得分:2)
在得到真正的答案之前,请注意术语。在Fortran中,您所拥有的不是初始化,而是赋值。这是两个截然不同的事情。是的,很清楚这里的含义是什么,但了解这种区别可能会很好。
像x=0
这样的行是内在赋值语句。 =
左边是变量,右边是表达式。对于问题中的每一个问题,有两个注意事项:
如a related answer中所述,当变量和表达式在类型或类型参数上不同(但在这种情况下类型是一致的)时,表达式将转换为变量的类型和类型参数。
前两个分配肯定涉及类型转换:0
是一个整数,0d0
是一个(双精度)实数。虽然(0d0, 0d0)
是一个复杂的 - 因此没有类型转换 - 除非double precision
与real(real64)
相同,否则这种情况会有所不同。
所以,至少前两个我们有像等价的转换
x = CMPLX(0, KIND=real64)
x = CMPLX(0d0, KIND=real64)
和第三个也许
x = CMPLX((0d0, 0d0), KIND=real64)
使用
x = (0._real64, 0._real64)
我们可以确定变量和表达式的种类是相同的。
只要CMPLX(0, KIND=real64)
具有与(0._real64, 0._real64)
相同的值,您就可以确定作业x=0
(目前,对于标量x
)具有相同的效果x=(0._real64, 0._real64)
。这是Fortran标准规定的。
零有点特殊情况,因为它出现在每个模型编号集中,但每当使用一个(数学)数字时,可以在所有三个数字中精确表示,效果将是相同的。同样地,
x = 3.14_real64
和
x = (3.14_real64, 0._real64)
是等价的。
但也许值得注意的是,一些带有选项的编译器可能会提供有关隐式转换的警告。即使数值相等,这也是要观察到的一个差异。
来到数组/标量方面:表达式被视为一个与变量形状相同的数组,每个元素都等于该标量值。
总结:这三个任务中的每一个都具有相同的Fortran效果。作业x
之后是给定形状的数组,每个元素都具有复杂的值(0._real64, 0._real64)
。
现在,这并不是说在低级别上不可能发生令人兴奋的事情,并且零设置可能是一种特殊情况。但这是你和你的编译器(和系统)之间的事情。