Fortran のサブルーチンと関数が、Fortran の組み込み関数と同じように、実数の単精度と倍精度の両方、およびさまざまな変数のその他の種類をサポートするようにしたいと考えています。x が倍精度の場合、sin(x) は正弦関数の倍精度値を返しますが、単精度は x が単精度です。
次のテストを作成し、定数 a64 と b64 を宣言し、それらを kind 値 (8) に関連付けました。入力変数 a と b が double の場合は関数split_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