我想让Fortran中的子例程和函数支持实数的单精度和双精度,以及各种变量的其他精度,与Fortran的内在函数相同。如果x是双精度,则sin(x)将为我们提供正弦函数的双精度值,而单精度是x是单精度。
我编写了以下测试,并声明了常量a64和b64并将它们与它们的种类值(8)关联。我希望函数 divide_real 如果输入变量a和b为双精度,则输出双精度结果;如果输入为单精度,则输出单精度。可以通过将rk参数作为函数的输入来实现,但是编译器会抱怨rk尚未声明或变量未还原为常量表达式(GNU编译器)。
有关如何使其正常工作的任何提示?
program test_kinds
implicit none
real(kind=4) :: a32,b32
real(kind=8) :: a64,b64,divide_reals
a64=atan(0.40)
b64=atan(0.30)
a32=a64
b32=b64
write(*,*) '32 bits :: ',divide_reals(a32,b32,4)
write(*,*) '64 bits :: ',divide_reals(a64,b64,8)
end program test_kinds
function divide_reals(a,b,rk)
implicit none
integer,intent(in) :: rk
real(kind=rk),intent(in) :: a,b
real(kind=rk) :: divide_reals
divide_reals=a/b
end function divide_reals