【问题标题】:Is there an equivalent of DEXP for complex*16 arguments in Fortran?Fortran 中是否有对应于复杂 *16 参数的 DEXP?
【发布时间】:2016-11-23 23:52:54
【问题描述】:

如问题所述:Fortran(90 及更高版本)中复杂 *16 参数是否有等效的 DEXP?

【问题讨论】:

    标签: fortran fortran90 fortran95


    【解决方案1】:

    complex*16 不是 Fortran(90 或更早或更晚)。 如果你的数据类型是complex(real64)(或者非标准的complex*16),标准的泛型exp()会选择对应的精度和范围。

    【讨论】:

      【解决方案2】:

      每个部分(实部和虚部)都是 64 位的?

      如果你说 COMPLEX(KIND=8) (intel),你会得到 64 位的实数和虚数。我需要看看 gfortran 提供了什么...

      最好(我认为最便携)使用 ISO_C_BINDING 然后“自己看”:

      PROGRAM ABC
      USE ISO_C_BINDING
      IMPLICIT NONE
      
      COMPLEX(KIND=C_FLOAT_COMPLEX)  :: A
      COMPLEX(C_DOUBLE_COMPLEX)      :: B
      COMPLEX(C_LONG_DOUBLE_COMPLEX) :: C
      
      WRITE(*,*) SIZEOF(A)=',SIZEOF(A)
      WRITE(*,*) SIZEOF(B)=',SIZEOF(B)
      WRITE(*,*) SIZEOF(C)=',SIZEOF(C)
      
      END PROGRAM ABC
      

      【讨论】:

      • 如果想要为复合体的每个部分使用 64 位存储,那么use iso_fortran_env, only : real64; complex(kind=real64) z; end 可能是最好的选择。但这并没有真正解决如何对这样一个值求幂的问题。
      • 我必须说我不知道​​。我只在 Fortran 中编写了几个月的代码,并且从以前的代码中学到了……所以基本上我将我的复杂变量声明为 complex*16,但并不知道真正做了什么。
      • Complex*16 是从 ibm360 fortran66 继承而来的。这意味着实数和虚数各有 8 个字节,因此它的工作位置与复数(real64)相同。对于提到的编译器,Real64 的值为 8。
      • 您需要多少精度是@mwoua 的问题......还有LOG10,通常不需要对LOG 或EXP 值有太多精度。通用的 EXP 涵盖了 DEXP 和其他所有内容......所以我想你可能想看看只使用 EXP 代替 DEXP。如果是 DOUBLE,则获得 DEXP,如果是 COMPLEX,则获得 CEXP。为什么要在 COMPLEX 上使用 DEXP 而不是 CEXP 值得商榷...... EXP 解决了这个问题。
      【解决方案3】:

      从 Fortran 77 开始,几乎没有理由直接使用 DEXP(),除非您将其作为参数传递。

      在普通表达式中(目前为止最常见的用法,可能是您的情况),只需使用泛型 EXP() 进行所有求幂。

      如果您遇到 DEXP() 作为参数传递给函数的罕见情况,那么不,没有等价物,您必须编写一个调用通用 EXP() 的包装函数。

      【讨论】:

        【解决方案4】:
        GNU Fortran 中的

        zexp() 和 cdexp()。 http://gcc.gnu.org/onlinedocs/gfortran/EXP.html

        【讨论】:

          猜你喜欢
          • 2019-05-15
          • 1970-01-01
          • 2015-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多