Fortran 将复杂数组初始化为零的正确方法
初始化复杂数组的快速而准确的方法是什么?以下方面是否存在任何差异:Fortran 将复杂数组初始化为零的正确方法,fortran,Fortran,初始化复杂数组的快速而准确的方法是什么?以下方面是否存在任何差异: complex(real64) :: x(2,2) x = 0 x = 0d0 x = (0d0,0d0) 它们是相同的吗?我能假设我在每个编译器上得到相同的结果吗?《标准》对此有什么规定吗?这个问题特别是关于初始化为零,而不是任何其他数字。在得出真正的答案之前,请注意术语。在Fortran中,这里的不是初始化,而是赋值。这是两件截然不同的事情。是的,这里的意思很清楚,但是意识到这种区别也许是好的 像x=0这样的行是内在赋值语
complex(real64) :: x(2,2)
x = 0
x = 0d0
x = (0d0,0d0)
它们是相同的吗?我能假设我在每个编译器上得到相同的结果吗?《标准》对此有什么规定吗?这个问题特别是关于初始化为零,而不是任何其他数字。在得出真正的答案之前,请注意术语。在Fortran中,这里的不是初始化,而是赋值。这是两件截然不同的事情。是的,这里的意思很清楚,但是意识到这种区别也许是好的 像
x=0
这样的行是内在赋值语句。=
左侧是变量,右侧是表达式。问题中的每一项都有两个考虑因素:
- 变量和表达式的类型或类型参数可能不同李>
- 变量是数组,表达式是标量
0
是一个整数,0d0
是一个(双精度)实数。虽然(0d0,0d0)
是一个复杂的过程-因此没有类型转换-这将是不同的类型,除非双精度
与实(real64)
相同
所以,至少对于前两个,我们有等价的转换
x = CMPLX(0, KIND=real64)
x = CMPLX(0d0, KIND=real64)
第三次呢
x = CMPLX((0d0, 0d0), KIND=real64)
与
我们可以确定变量和表达式的类型是相同的
只要CMPLX(0,KIND=real64)
具有与(0.\u real64,0.\u real64)
相同的值,您就可以确保赋值x=0
(目前,对于标量x
)具有与x=(0.\u real64,0.\u real64)
相同的效果。这是Fortran标准规定的
零在某种程度上是一种特殊情况,因为它出现在每个型号集合中,但无论何时,只要使用一个(数学)编号,它可以准确地表示在所有三个型号中,效果都是相同的。同样地
x = 3.14_real64
及
它们是等价的
不过,也许值得注意的是,一些具有某些选项的编译器可能会提供有关隐式转换的警告。这是一个即使数值相等也要观察到的差异
谈到数组/标量方面:表达式被视为与变量形状相同的数组,每个元素都等于该标量值
总结:这三个作业都有相同的Fortran效果。赋值x
之后是一个给定形状的数组,每个元素都有复数(0.\u real64,0.\u real64)
现在,这并不是说在低水平上不会有令人兴奋的事情发生,零设置可能是一种特殊情况。但这是你和你的编译器(和系统)之间的事。谢谢,我的意思是用Fortran语言进行赋值。我能从你的最后一段推断出我的问题的答案是否定的还是你不确定?我的怀疑是,零的转换总是不会失去准确性。如果它像3.14,那么所有三种赋值都会明显不同。零在某种程度上是一种特殊情况,因为该值在三种表示法中都可以精确表示(我想可能存在非常奇怪的例外情况)
integer
、双精度
和real(real64)
。其他较小的整数也将是,所以这是“特殊”的极限3.14
可能是一个不好的例子,因为它不是整数,但是x=3.14
和x=3.14d0
可能会给出不同的结果,但这取决于文字常量本身和每种类型的近似值,而不是随后到复数/实数的转换(real64)
。要更正我之前的评论:每个型号集中都明确存在零。在每个模型中,哪些其他(数学)数字可以精确表示取决于模型,但在实际水平上,1将是3.14,而不是3.14。好的,我得出结论,这样的零赋值是安全的。如果它是任何其他数字,包括一个整数,我将始终完整地编写赋值。关于编译器警告。编译器仅在RHS丢失一些数字时发出警告,例如,将1d0分配给32位实数时,而不是将另一个分配给32位实数时,例如,将1.0分配给64位实数时。由于您的“快速”,我将此问题理解为询问编译器是否可以执行不同的操作(运行时更快),但是考虑到你对我的回答的评论,这实际上可能是写作的简洁/快速?是的,快速意味着写作的简洁。通过编写(0d0,0d0)
和避免隐式转换而节省的任何时间都可以忽略不计。理想情况下,我会编写x=0
,这样可以节省几秒钟,并且有利于可读性。然而,这是一个科学的代码,我需要确切地知道在低层次上发生了什么。我目前只能访问gfortran和ifort,对他们来说,任务确实没有区别。
x = 3.14_real64
x = (3.14_real64, 0._real64)