ローカル変数の初期化に関する驚くべき問題に遭遇しました。
ガンマーを計算する次の関数を取得しました
function gammar(z) result(gz)
implicit none
real(8),intent(out)::gz
real(8)::z,t,low,up
real(8),parameter::increment=1.0
real(8),parameter::lower_t=0.0,upper_t=10.0
integer(4)::i,n
!gz=0.0
n=(upper_t-lower_t)/increment
do i=1,n
low=lower_t+(i-1)*increment
up=lower_t+(i)*increment
gz=gz+(f(z,low)+f(z,up))*increment/2.0
end do
end function gammar
Then I call this function in main program like
df=9.0
t=0.0
write(*,*) gammar((df+1.0)/2.0)/sqrt(pi*df)/gammar(df/2.0)
答えを間違えた!! 0.126 その理由は、gammar((df+1.0)/2.0) が計算された後、ローカル変数 gz が 0 に設定されていないことがわかりました。したがって、gammar(df/2.0) を計算すると、gz はまだ古い値 24 を保持していました。最終的に,gammar(df/2.0) の答えが間違っていました 34.. ガンマー関数に gz=0.0 を追加すると、この問題は修正されました。これは本当に驚くべきことです。ガンマーが毎回呼び出されたときにローカル gz がゼロに初期化されなかったのはなぜですか?
どうもありがとう
よろしくケ