問題4の答え
上から順に条件判断して、過不足無く尽くしていれば正解です。 real(kind=double) :: a, b, c
real(kind=double) :: x1, x2, d
print *, "### a x^2 + b x + c = 0 ###"
print *, "a = ?"
read *, a
print *, "b = ?"
read *, b
print *, "c = ?"
read *, c
if (a==0.0d0) then
print *, "1-ji houtei-siki ", b,"x +",c,"= 0"
if (b==0.0d0) then
if (c==0.0d0) then
print *, " 'x' ha nin-i."
else
print *, " kai nashi."
end if
else
x1 = -c/b
print *, " kai = ", x1
end if
else
d = b**2 - 4.0d0*a*c
if (d==0.0d0) then
x1 = b/(2.0d0*a)
print *, " juukai = ", x1
else if (d > 0.0d0) then
x1 = ( -b+sqrt(d) )/( 2.0d0*a )
x2 = ( -b-sqrt(d) )/( 2.0d0*a )
print *, " kai1 =", x1
print *, " kai2 =", x2
else
x1 = ( -b )/( 2.0d0*a ) ! real part
x2 = ( sqrt(-d) )/( 2.0d0*a ) ! imaginary part
print *, " kai1 =", cmplx(x1, x2,kind=double)
print *, " kai2 =", cmplx(x1,-x2,kind=double)
end if
end if
長いですね。でも、数学的な内容は高校レベルですよ。
最初のif文は、変数の値がゼロの場合を処理しています。
ゼロ割り(DIVISION BY ZERO)
は手計算でも遭遇する典型的なエラーですが、
プログラミングの場合も十分に注意する必要があります。 割り算には気をつける。基本ですね。
また条件の設定が甘いと
NaN
となる場合があります。『NaN』というのは「Not a Number」(非数)という意味で、
何かおかしな計算が行われた事を示しています。今の場合『sqrt(-1.0d0)』が「実数の範囲で値を持たない」ため『NaN』になります。
「複素数の範囲では」きちんと値を持ちます。かっこの中の「型」が重要なのです。
他にもプログラミングに特有のエラー(数値的な誤差)、というのもあって、 そこまで考慮に入れるとこのプログラムも完璧とは言えません。
ただ、少し深い知識が必要で難しいので、それについては別の機会に。