具有可配置的实际精度的调用功能

时间:2014-03-11 09:00:24

标签: fortran gfortran

目标:

使功能可以使用可配置的工作精度。

当我尝试这个时:

program vierkantsvergelijking
implicit none

integer, parameter :: dp = kind(0.d0)
integer, parameter :: sp = kind(0.0)

print *, algoritme1(-5771.,2.,dp)
contains

  function algoritme1(b,c,wp) result( solution)
    integer :: wp ! working precision
    real(kind=wp) :: b,c,D
    real(kind=wp), dimension(2) :: solution
    D = sqrt((b/2)**2 - c)
    solution(1) = -b/2 + D
    solution(2) = -b/2 - D
  end function algoritme1

end program

我得到: 错误:参数'b'中的类型不匹配(1);将REAL(4)传递给UNKNOWN

为什么这不起作用,我怎样才能实现目标?

1 个答案:

答案 0 :(得分:5)

是的,或者说不是,这不会起作用,也不会起作用。英特尔Fortran编译器抱怨这一行:

real(kind=wp) :: b,c,D

A kind type parameter must be a compile-time constant.   [WP]

它也对real(kind=wp), dimension(2) :: solution提出同样的抱怨。这是Fortran的一个根深蒂固的特色。

要做你想做的事,你必须沿着这些界线定义一个通用界面

interface algoritme1
    procedure :: algoritme1_sp, algoritme1_dp
end interface

并为这两个程序编写代码。然后编译器可以确定函数签名调用哪一个;可能会有sp个参数,其他dp个参数。

您可能认为这一切都意味着Fortran不会执行通用程序,我会将这个问题留给诡辩者和语言挑剔者。搜索generic programming in Fortran是值得的。即使在这里,有关于如何更好地避免编写程序员认为(与编译器不一致)的多个实现的技巧和提示是“相同的”代码。