6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-03

引用:組込みソフトウェア開発向けコーディング作法ガイド [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の実装がどうなっているか、注意したほうがいいだろう。

6
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?