fortran中COMPLEX的存储保证是两个REAL吗?
Is the storage of COMPLEX in fortran guaranteed to be two REALs?
许多 FFT 算法利用数组中实部和虚部交替存储的复数。通过创建一个 COMPLEX 数组并将其传递给 FFT 例程,是否可以保证它可以转换为具有交替实部和虚部组件的 REAL 数组(两倍大小)?
subroutine fft (data, n, isign)
dimension data(2*n)
do 1 i=1,2*n,2
data(i) = ..
data(i+1) = ..
1 continue
return
end
...
complex s(n)
call fft (s, n, 1)
...
(顺便说一句,维度数据 (2*n) 是否等同于说它是真实的?)
我写这个答案只是因为经验告诉我,一旦我写了这种答案,就会有一位真正的 Fortran 专家来纠正我。
我认为当前标准及其任何前身都没有明确规定 complex
将作为内存中的两个相邻 reals
来实现。但是,我认为这种实现是标准对 equivalence
和 common
的定义的必然结果。我认为我从未遇到过 complex
未作为一对 reals
.
实现的实现
标准确实保证了,虽然一个complex
可以转换成一对reals
。因此,给出一些定义:
complex :: z
complex, dimension(4) :: zarr
real :: r1, r2
real, dimension(8) :: rarr
以下内容将达到您的预期
r1 = real(z)
r2 = aimag(z)
这两个功能都是基本功能,这里有一个问题:
real(zarr)
returns 一个 4 元素实数数组,
aimag(zarr)
同时
[real(zarr), aimag(zarr)]
是一个 8 元素实数数组,其中 zarr
的实部后跟复数部分。也许
rarr(1:8:2) = real(zarr)
rarr(2:8:2) = aimag(zarr)
对你来说没问题。不过,我不确定是否有更简洁的方法来执行此操作。
亚历山大不是唯一能够引用标准的人!他引用的部分让我对非默认复数标量感到疑惑。所以我继续读下去,我认为他指向我们的部分的第 6 段是密切相关的
a nonpointer scalar object of any type not specified in items (1)-(5)
occupies a single unspecified storage unit that is different for each
case and each set of type parameter values, and that is different from
the unspecified storage units of item (4),
我认为这对此处的任何答案都没有任何影响。
没有,据我所知
您可以通过 EQUIVALENCE、COMMON 和 ENTRY 语句在实际单精度数组和复杂单精度数组之间建立存储关联。
但通常您不能将复杂数组传递给需要真实数组的子例程。
附加到 这确实在标准中规定:条款 16.5.3.2 "Storage sequence":
2 In a storage association context
[...]
(2) a nonpointer scalar object that is double precision real or
default complex occupies two contiguous numeric storage units,
强调我的。
关于存储关联上下文:条款 16.5.3.1 "General" 改为
1 Storage sequences are used to describe relationships that exist
among variables, common blocks, and result variables. Storage
association is the association of two or more data objects that occurs
when two or more storage sequences share or are aligned with one or
more storage units.
所以这发生在 common
块、显式 equivalence
和结果变量上。由于,一般情况下没有明确的说法。
我的猜测是,始终遵循这一点以确保兼容性是最方便的。
感谢 IanH 指出这一点!
许多 FFT 算法利用数组中实部和虚部交替存储的复数。通过创建一个 COMPLEX 数组并将其传递给 FFT 例程,是否可以保证它可以转换为具有交替实部和虚部组件的 REAL 数组(两倍大小)?
subroutine fft (data, n, isign)
dimension data(2*n)
do 1 i=1,2*n,2
data(i) = ..
data(i+1) = ..
1 continue
return
end
...
complex s(n)
call fft (s, n, 1)
...
(顺便说一句,维度数据 (2*n) 是否等同于说它是真实的?)
我写这个答案只是因为经验告诉我,一旦我写了这种答案,就会有一位真正的 Fortran 专家来纠正我。
我认为当前标准及其任何前身都没有明确规定 complex
将作为内存中的两个相邻 reals
来实现。但是,我认为这种实现是标准对 equivalence
和 common
的定义的必然结果。我认为我从未遇到过 complex
未作为一对 reals
.
标准确实保证了,虽然一个complex
可以转换成一对reals
。因此,给出一些定义:
complex :: z
complex, dimension(4) :: zarr
real :: r1, r2
real, dimension(8) :: rarr
以下内容将达到您的预期
r1 = real(z)
r2 = aimag(z)
这两个功能都是基本功能,这里有一个问题:
real(zarr)
returns 一个 4 元素实数数组,
aimag(zarr)
同时
[real(zarr), aimag(zarr)]
是一个 8 元素实数数组,其中 zarr
的实部后跟复数部分。也许
rarr(1:8:2) = real(zarr)
rarr(2:8:2) = aimag(zarr)
对你来说没问题。不过,我不确定是否有更简洁的方法来执行此操作。
亚历山大不是唯一能够引用标准的人!他引用的部分让我对非默认复数标量感到疑惑。所以我继续读下去,我认为他指向我们的部分的第 6 段是密切相关的
a nonpointer scalar object of any type not specified in items (1)-(5) occupies a single unspecified storage unit that is different for each case and each set of type parameter values, and that is different from the unspecified storage units of item (4),
我认为这对此处的任何答案都没有任何影响。
没有,据我所知
您可以通过 EQUIVALENCE、COMMON 和 ENTRY 语句在实际单精度数组和复杂单精度数组之间建立存储关联。
但通常您不能将复杂数组传递给需要真实数组的子例程。
附加到
2 In a storage association context
[...]
(2) a nonpointer scalar object that is double precision real or default complex occupies two contiguous numeric storage units,
强调我的。
关于存储关联上下文:条款 16.5.3.1 "General" 改为
1 Storage sequences are used to describe relationships that exist among variables, common blocks, and result variables. Storage association is the association of two or more data objects that occurs when two or more storage sequences share or are aligned with one or more storage units.
所以这发生在 common
块、显式 equivalence
和结果变量上。由于
感谢 IanH 指出这一点!