“浮動小数点の不正な使用”というメッセージがでて、 その原因がわからなかった人は、 おそらく、ポインタのいちばん基本的なところがわかっていない。 10章の一番最初のほうを読み直しておくこと。
sum * sum - 4 * prodを何度も計算するのはよくない。 効率が悪いし、見た目が悪いし、間違いが入り込みやすい。 同じ理由で sqrtを2度呼ぶのも良くない。
sqrtの結果と0の大小を比べても意味がない。
/* 間違い */
if (sqrt(sum * sum - 4 * prod) < 0) …
sqrtの引数を0と比べる。
double det, r; det = sum * sum - 4 * prod; if (det < 0) { return 1; } r = sqrt(det); …
sum * sum - 4 * prodやsqrtの結果をint型に代入すると、 小数点以下がおちてしまう。
未提出者が39名いる。
(x, y) → (x cosθ - y sinθ, x sinθ + y cosθ) という回転の写像は、 工学部としてはやはり常識である。 (x + y i と cosθ + i sinθ の積を計算せよ。)
*px(あるいは*py)を書き換える前に *py(あるいは*px)の値を計算するために、 *px(あるいは*py)の値を保存しなければいけない。
*px = *px * cos(theta)- *py * sin(theta); *py = *px * sin(theta)+ *py * cos(theta);とすると、*pyの計算の時には*pxの値が変わってしまっている。
関数の型 — void rotate(double *px, double *py, double theta) — を勝手に変えてはいけない。
*(vc+i)は C言語ではvc[i]とまったく同じ意味なので、 *(vc+i)という形で使うとポインタのメリットがない。 ポインタらしい効率のよいプログラムにするには、ポインタのインクリメント(++)• デクリメント(--)を利用する。
未提出が 7名いる(考察も未提出・提出遅れは減点する。)