Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:for文初期化で整数と実数を混在させると値が狂う)

for文初期化で整数と実数を混在させると値が狂う

このQ&Aのポイント
  • C++のfor文で整数と実数を混在させると値が狂う問題について解説します。
  • for文の初期化処理で変数宣言を行う際、同時に他の初期化処理を記述すると、新たな変数として宣言されてしまうことが原因です。
  • この問題を回避するには、for文外で変数を宣言し、for文の初期化処理でその変数を使用するようにしましょう。

質問者が選んだベストアンサー

  • ベストアンサー
  • maiko0318
  • ベストアンサー率21% (1483/6968)
回答No.1

>→int i と int rad がスコープ内の変数として新しく宣言される? 正解。 スコープ(forの終わりの}の外に出たらdoubleの値になります。

marriess
質問者

お礼

回答ありがとうございました. おかげ様でスッキリしました.

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

既に回答があるけど蛇足的に追加. for (あれ; これ; それ) なんか というのは, *だいたい* { あれ; while (これ) { なんか それ; } } と等価になります. つまり for (int i = 0, rad = 0.0; i <= 6; i++, rad+= drad) なんか は*だいたい* { int i = 0, rad = 0.0; while (i <= 6) { なんか i++, rad+= drad; } } と同じです. ちなみに C でもだいたい同じ.

marriess
質問者

お礼

今まではずっとCで書いてきており、今回はそれと同じ感覚で i=0;rad=0.0 while() {... となるものだと思っていました。 また、恥ずかしながら、 int A=0, B=1; といった宣言時に初期化をする書き方ができることを知りませんでした。今までは int A=0; int B=1; と書いてました^^; だから最初に気がつかなかったんですね 新しいことも知れてよかったです。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

ついでに言うと doubleには誤差が含まれています。 rad += drad のように、doube+doubleを繰り返すと、誤差が溜まることがあります。 # たとえば、0.1+0.1+..... と100回繰り返した値!=10.0 と言う事が起こり得ます。 今回の場合は rad = drad * i とするのがよいでしょう。 詳しくは、「double 誤差」辺りで検索してください。

marriess
質問者

お礼

浮動小数点の計算誤差については少しだけ知ってはいましたが,なるほどこんな対処方法もあるんですね. これはいいことを聞きました.ありがとうございました.

すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

>また,コメントアウトしてある行を有効にしてradの中身を直接表示させると, ループの外でいくつになっているのか? というのも確認してみるとよかったかも知れませんな。 http://www.ksky.ne.jp/~seahorse/cpp/loopvar.html とか。 VisualStudioなら… /Zc:forScopeオプションかな? いや、違うか??? まぁ、実際の仕様書にあたった方がいいでしょう。

marriess
質問者

お礼

>ループの外でいくつになっているのか?というのも確認してみるとよかったかも知れませんな。 確かにそうですね. 初期化部分でintを宣言したときに,ループが終わったあとのradを表示させたら,ループ前の値のままでした. これとは別に新しく変数がループ内に作られてこれが使用されていたということだったんですね. 回答ありがとうございました.

すると、全ての回答が全文表示されます。

関連するQ&A