Fortran中是否存在内部函数来计算复数Found a matching row! MovieId=3, Title=Grumpier Old Men (1995)
的平方模|z|^2
?
如果没有,是否有比以下更简单或更好的计算方法?
z
答案 0 :(得分:3)
不,Fortran标准没有定义这样的内在例程。据我所知,目前任何广泛使用的编译器都没有提供这样的例程。
如果OP真的想避免昂贵的sqrt ,并且不喜欢她现有的解决方案,OP可以尝试:
real :: rslt
real, dimension(2) :: parts
complex :: z
...
parts = transfer(z, parts)
rslt = dot_product(parts, parts)
或者,在相同的声明下,这可能是首选的
rslt = dot_product(transfer(z, parts), transfer(z, parts))
与往常一样,如果表现对您很重要,请进行衡量。
更简单还是更好?你决定了。
与往常一样,transfer
不得由未满18岁的人或受酒精或其他影响性能的药物影响的人操作。
答案 1 :(得分:1)
只是为了好玩,这里有一些尝试使用(好的旧??)声明函数来定义abs2(),希望被内联...(不建议使用它,只是实验!)
program main
implicit none
integer, parameter :: dp = kind(0.0d0)
complex(dp) z
real(dp) abs2
abs2( z ) = real(z)**2 + aimag(z)**2 ! (could be included or macro-ed??)
! abs2( z ) = conjg( z ) * z ! maybe slower
! abs2( z ) = z % re**2 + z % im**2 ! near future
! intrinsic :: abs2 ! best solution
z = ( 1.0_dp, 2.0_dp )
print *, abs( z )**2
print *, abs2( z )
print *, abs( z + 1.0_dp )**2
print *, abs2( z + 1.0_dp )
end program
Result:
5.0000000000000009
5.0000000000000000
8.0000000000000018
8.0000000000000000
我希望z% re
和z% im
即将推出......(尚未使用gfortran-6和ifort-16)
答案 2 :(得分:1)
只需利用众所周知的公式(a+i*b)*(a-i*b) = a^2 + b^2
SquaredModulus = real part of (Z * CONJG(Z))
CONJG是complex conjugate
答案 3 :(得分:0)
https://gcc.gnu.org/onlinedocs/gfortran/ABS.html
您可能正在寻找CABS()或CDABS(),然后将其平方。我刚刚检查过,它可以与f95编译器一起使用。