【问题标题】:Fortran "archaic" type-specific mathematical functionsFortran“古老”类型特定的数学函数
【发布时间】:2017-12-12 07:22:17
【问题描述】:

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

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

对比

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

第一个会给出意想不到的结果,而第二个会在编译时给出错误,假设我们期望 c 是真实的,但可能不小心将一些复杂的东西传递给它。上面显示的是一个最小的示例,因此每个人都可以看到c 乍一看很复杂。实际情况比这复杂得多。

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

我们将不胜感激。

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

【问题讨论】:

  • 我已经检查了可能重复的答案之前我发布了这个。我必须说,那里的答案并没有真正的帮助。
  • 如果链接不能回答你的问题,请修改它,强调没有讨论的地方,这样我们就不必重复了。 总是参考一个相关的问题,如果你读过它,以防止这种情况发生。解释为什么它没有帮助。
  • 不确定是什么问题,但这是对现在似乎已删除的评论的回应。我保留了此评论,因为它提供了有关该问题的更多信息。对不起,但我觉得它并不直截了当。我认为它确实提供了一定程度的类型安全(如果我错了请指出),但我不知道是否足以证明使用过时的函数是合理的,或者我们应该停止使用过时的函数,因为它们是过时的。您能否详细说明或提供链接以查找相关信息?谢谢
  • 感谢您解释并重新提出问题。这很公平。
  • @VladimirF 确实你是对的,我已经删除了评论以避免混淆。

标签: fortran


【解决方案1】:

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

使用旧形式会损害代码的通用性。然后,您不能简单地使用一组不同的种类参数重新编译您的代码。虽然,当您使用非标准的 real*4real*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() 和类似的丑陋。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 2010-12-03
相关资源
最近更新 更多