使功能可以使用可配置的工作精度。
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
为什么这不起作用,我怎样才能实现目标?
答案 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
是值得的。即使在这里,有关于如何更好地避免编写程序员认为(与编译器不一致)的多个实现的技巧和提示是“相同的”代码。