“Fortran”;古语;特定类型的数学函数

“Fortran”;古语;特定类型的数学函数,fortran,Fortran,我正在做一个几年前开始的项目。最近,该小组中有一位新成员建议用泛型函数取代所有古老的特定类型的数学函数。例如,建议将cdexp(c)和dexp(d)替换为exp(c)和exp(d)。然而,另一位参与该项目多年的成员不愿意这样做,因为他认为dexp(d)会仔细检查d的类型,并确保我们不会意外地将复杂参数传递为真实参数,并产生类似于以下代码片段中的错误: program main real*8 :: a = 3.d0 real*8 :: b = 2.d0 comple

我正在做一个几年前开始的项目。最近,该小组中有一位新成员建议用泛型函数取代所有古老的特定类型的数学函数。例如,建议将
cdexp(c)
dexp(d)
替换为
exp(c)
exp(d)
。然而,另一位参与该项目多年的成员不愿意这样做,因为他认为
dexp(d)
会仔细检查
d
的类型,并确保我们不会意外地将复杂参数传递为真实参数,并产生类似于以下代码片段中的错误:

program main
  real*8     ::  a = 3.d0
  real*8     ::  b = 2.d0
  complex*16 ::  c = (7.d0, 8.d0)
  a = b + exp(c)
  write(6,*) a                                                                                                                                                                                               
end program main
vs

第一个将给出意外的结果,而第二个将在编译时给出错误,假设我们期望
c
是真实的,但可能不小心向其中传递了复杂的内容。上面显示的是一个最小的示例,因此每个人都可以看到
c
乍一看是复杂的。实际情况远比这复杂

我的问题是,这种说法是否证明了使用古老的特定于类型的数学Fortran函数是合理的,还是我们真的应该听从建议,用更一般的函数替换特定于类型的函数

任何帮助都将不胜感激


我在发帖之前已经读过了。这里的答案只是说,过时的是过时的,通用的可以自动处理参数类型。根本没有提到,这种古老的形式有助于双重检查类型,并允许在编译时发现一些bug。我认为这个问题的关注点与那个问题明显不同。

我不认为旧的形式有用。错误检查是可疑的。您可以使用编译器选项检查从double到real的隐式转换

使用旧的表单将损害代码的通用性。然后不能简单地用一组不同的种类参数重新编译代码。尽管如此,当您使用非标准的
real*4
real*8
时,您也无法轻松更改这些类型。这是我的一个主要原因,我经常在单精度和双精度之间切换,只是用一个不同的常数重新编译

例如,对于第一个代码,您会收到一条警告:

> gfortran -Wall dexp.f90 
dexp.f90:5.6:

  a = b + exp(c)
      1
Warning: Possible change of value in conversion from COMPLEX(8) to REAL(8) at (1)
要捕获使用的单精度变量而不是双精度变量,必须启用
Wconversion extra

> gfortran -Wconversion-extra dexp.f90 
dexp.f90:5.7:

  a =  exp(c)
       1
Warning: Conversion from REAL(4) to REAL(8) at (1)

一些编译器将无法捕捉到这一点(英特尔?),您的同事可能有一些观点,但我不相信它克服了
dexp()
和类似工具的丑陋。

在发布此信息之前,我已经检查了可能的副本中的答案。我必须说,那里的答案没有真正的帮助。如果链接没有回答你的问题,请修改它,使它强调那里没有讨论的要点,这样我们就不必重复了。如果你阅读了相关的问题,一定要参考它,以防止出现这种情况。解释为什么没有帮助。不确定是什么问题,但这是对一条评论的回应,该评论现在似乎被删除了。我保留了这一评论,因为它提供了关于这个问题的更多信息。很抱歉,我觉得这并不简单。我认为它确实提供了一定程度的类型安全性(如果我错了,请指出),但我不知道这是否足以证明使用过时函数是正确的,或者我们应该停止使用过时函数,因为它们是过时的。你能详细说明一下吗?或者给我提供一个链接来查找相关信息吗?谢谢你解释并重新开始这个问题。这很公平。@VladimirF确实你是对的,我已经删除了评论以避免混淆。我已经与英特尔和solarisstudio核实过了。两个编译器都不能为隐式转换提供警告。相关
> gfortran -Wconversion-extra dexp.f90 
dexp.f90:5.7:

  a =  exp(c)
       1
Warning: Conversion from REAL(4) to REAL(8) at (1)