ノート:無限ループ
表示
C言語におけるサンプル
[編集]バグに関する記事なのですから、記載されているサンプルソースにバグがあるのはアタリマエでありながら、この記事のタイトル「無限ループ」を説明するため以外のバグまでもが混在しているのは不適切です。この記事は英語版からの翻訳らしいので、英語版にもサンプルソースにのみは私が手を入れました[1]。ただ、私の英語力では、英語版の本文にまで手を入れる自信が無いので、目に留まったかたには、英語版(および、その他の多言語版)の本文にも対処していただきたくお願いします。
- 2009年10月7日 (水) 08:55 (UTC) 以前の版におけるサンプル
float x = 0.1;
while (x != 1.1) {
x = x + 0.1;
printf("x = %f\n", x);
}
↑これだと、実行結果に表示されるのは、0.2, 0.3, 0.4...(無限ループ) となります(細かく言うと、"%f"だけの指定では、小数点以下第2位以下までゾロゾロ表示されるのですが、この場では無視)。わかりやすいサンプルとするためには、表示値は 0.2 からではなく 0.1 からにすべきです。これの対処は、↓こうなります。
float x = 0.1;
while (x != 1.1) {
printf("x = %f\n", x);
x = x + 0.1;
}
ここまでは英語版も修正しました。そして、このサンプルに対応する本文です。
- 2009年10月7日 (水) 08:55 (UTC) における版での本文の記述
- このループはあるシステムでは期待通りに10回実行されるだろうが(中略)浮動小数点値を使う時には、等式でテストを行なうと予想外に失敗する可能性があるため、不等式でテストすると安全である。例えば x が 1.1 と等しいかどうかをテストする代わりに x < 1.1 や x <= 1.0 でテストする。そのどちらでも、有限回数の繰り返しで脱出するのは確実である。
たしかに、等号での評価から不等号での評価に変更すれば、とりあえず「無限ループ」は回避できますが、しかし、その回数は、浮動小数点数をループカウンターに使用している限り、演算内容や値によっては、10回を想定していたものが、9回になったり11回になったりします。回数基準のループでは、浮動小数点数をループカウンターに使用している限りは根本的なバグ回避とはならず、上に引用した現状の記述は誤解を招きかねません。目に留まったかたには他の言語版にも対応させていただきたいと思います。--しまあじ 2009年10月8日 (木) 17:51 (UTC)