我想让 Fortran 中的子例程和函数支持实数的单精度和双精度,以及各种变量的其他类型,与 Fortran 中的内在函数相同。如果 x 是双精度,sin(x) 会给我们正弦函数的双精度值,而单精度是 x 是单精度。
我编写了以下测试,并声明了我的常量 a64 和 b64 并将它们与它们的 kind 值 (8) 相关联。如果输入变量 a 和 b 为双精度,我希望我的函数divide_real输出双精度结果,如果输入为单精度,则输出单精度。这可以通过将 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