Help us understand the problem. What is going on with this article?

C > 浮動小数点型変数はループカウンタとして使用しない

More than 1 year has passed since last update.

引用:組込みソフトウェア開発向けコーディング作法ガイド [C言語版]のR 2.1.2

不適合
void func() {
    double d;
    for( d=0.0; d < 1.0; d += 0.1 ) {
    ...
適合
void func() {
    int i;
    for(int i=0; i < 10; i++) {
    ...

浮動小数点数は、ループカウンタとして演算が繰り返されると、誤差が累積し、意図した結果が得られないことがある。このため、ループカウンタには整数型を使用すべきである。

関連して以下を思い出した。
http://d.hatena.ne.jp/toburau/20120114/1326558361

float変数に1を1億回足した答えは1677万だ。

doubleの場合はもっと精度が高いので、上記floatのような問題はないだろうが、ループカウンタとしてdoubleを使う時はきちんとループするか確認するのがいいだろう。

。。。と書きながら疑問を持った。はたして本当にだめなのか?
http://ideone.com/GqZScD
にdouble型の1.0を1億回たすコードを用意してところ、結果は1億であった。

なぜコーディング規約で禁止されているか?
「組込み」がキーワードにあるように思う。

組込みの世界ではdoubleという型が内部的にはfloat型で実装される例がある。float型での場合、上記に見たように誤差が累積し、ループが正常に実行されなくなる。
doubleを内部的にdoubleできちんと扱う環境では、この問題は発生しない。

実行環境のdoubleの実装がどうなっているか、注意したほうがいいだろう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away