1.2次方程式を解く

まず,2次方程式

ax2 + bx + c = 0

を解くプログラムを作成することにしましょう.3つの係数 a, b, cを始めに読み込み、2つの解を出力するようなプログラムを作成することが目的です.

解答1


いくつかの入力データに対してはきちんと結果を出してくれますが、そうは ならない場合があり、つまり上のプログラムには重要な欠陥がいくつかあり ます。

  1. 入力される係数が整数に限定されていること。
  2. "a"にゼロが入ってしまうとプログラムは正常に動作しない。
  3. 関数"sqrt"(平方根を求める組み込み関数)の中は常に正でなければ ならないが、それが保証されていない。
  4. 複素数解には対応していない。
  5. 桁落ちが発生する可能性がある。
WWWのCGIプログラムを書く時はよく”ユーザーの入力 データを仮定してはいけない”と言われています。今日の講義の主題の 1つはここにあって、プログラムの方でいろいろなユーザーからの入力データ にもたえうるような、ある意味で”がんじょうな”プログラムを作ろう、と しているわけです。
順番に対策を講じていきましょう。1.は単に変数宣言しているところを"integer"から "real"に変更すればいいですね。楽勝。楽勝。

2.はIF文を使ってプログラムの流れを変えてやります。


解答2

 

3.も2.の場合と同様、IF文で解決させましょう。


解答3

 

4.はみなさんへの課題にしておきましょう.

5.はちょっと理解しにくいですね。実は b の絶対値と b*b-4*a*c の平方根の絶対値 が近い値の時桁落ちが起きてしまいます。これを 避けるためには

  x1 = (-b - (sgn(b))* sqrt(b*b-4*a*c))/ (2*a)
ここで
  sgn(b) = 1 (b>=0) or -1 (b<0)
また他の解は解と係数の関係
  x2 = c / (a*x1)
から求める方が適切といえます。