Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 将复杂数组初始化为零的正确方法_Fortran - Fatal编程技术网

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)