Fortran中复数的绝对值平方

时间:2017-03-15 13:34:08

标签: math fortran arithmetic-expressions

Fortran中是否存在内部函数来计算复数Found a matching row! MovieId=3, Title=Grumpier Old Men (1995) 的平方模|z|^2

如果没有,是否有比以下更简单或更好的计算方法?

z

4 个答案:

答案 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% rez% 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编译器一起使用。