問題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』になります。
「複素数の範囲では」きちんと値を持ちます。かっこの中の「型」が重要なのです。
他にもプログラミングに特有のエラー(数値的な誤差)、というのもあって、 そこまで考慮に入れるとこのプログラムも完璧とは言えません。
ただ、少し深い知識が必要で難しいので、それについては別の機会に。