プロが教える店舗&オフィスのセキュリティ対策術

int MAX =10;

for(int i=0; i<MAX-1; i++)
{
  float A;
  A = i / ( MAX-1 );

  float B;
  B = i / ( MAX-1.0f );


  // A or Bを使って処理

}

A、Bの数値は変わるのでしょうか?
この後のコードで、
Aの場合、望んだ結果が出なかったのですが
Bの場合ですと期待通りの結果が出ました…

VisualStudio2010 C/C++ Win7 64bitです。
よろしくお願いします。

A 回答 (4件)

Aの方は、全て0になりそうですが。

どうでした?

型の違う数値演算をしているときは、
なるべく精度の高いものに合わせて計算されます。

内部的にキャストが行われているので、予めこれを読んで数式を作る必要があります。


Aの例、i=1のとき
---------------------------------------
float A;

A = (float) ( 1/9 ); // i=1のときの計算
---------------------------------------
これだと先に括弧の中は(int同士の計算ですから少数以下は切り捨てられて)0になります。

ところが演算の中にintよりも精度の高い型が含まれていると、関連する数値は全て
格上げされて(キャスト)計算されます。

double > float > int みたいな感じで、左のほうが精度が高い。
混在した時は、一番精度の高いものに変換(キャスト)してから演算が行われます。

ですので、Bの例は以下のような変換が行われています
---------------------------------------
float B;

B = (float) ( (float) 1 / 9.0f ) // i=1のときの計算
---------------------------------------

これならば小数点以下も結果に残ります。
私が書き足した(float)の部分をコンパイラが勝手にやります。

例えば以下の計算結果は0になりますが、
---------------------------------------
int b;

b = 1 / 4.0; // 4.0 が暗黙に doubleでの演算を求めている
---------------------------------------
これは一回doubleで演算し、0.25と言う答えを得てから、
intにキャストする段階で小数点以下が捨てられます。
(処理系依存ですが、考え方はこれが基本)


以下も同様のキャストが暗黙に行われる
---------------------------------------
int b;

b = 1 + 4.0; // 4.0 が暗黙に doubleでの演算を求めている
---------------------------------------
答えは5になりますが、一度内部的に 1.0 + 4.0が演算されています。
(処理系依存ですが、考え方はこれが基本)

B = i / (MAX - 1.0f );

ですと、MAXは整数ですが、1.0fが暗黙にfloatへのキャストを求めています。
ですので、(MAX - 1.0f)の戻り値の型がfloatになっています。
つまり、

B = i / 9.0f;

と透過になり、分母がfloatですので、iが整数でもfloatへのキャストが求められ、
結果的に、全てがfloatで演算されます。

以上ご参考になれば。
    • good
    • 0
この回答へのお礼

キャスト変換…完全に忘れてました…
なるほどなるほど。
確かにそうです。
Aの結果内容も納得がいきました。
ご丁寧な解説ありがとうございました。

お礼日時:2014/02/23 04:11

VC++ 独自の、ではなく、C/C++ の仕様でそうなっています。



まず基本的なことから。C/C++ の計算や代入ではその演算子の左辺と右辺とで型が違っているときは暗黙的に型変換が行われます。
http://www9.plala.or.jp/sgwr-t/c/sec04.html

A は除算の時点でその型が int / int になっているため、 計算結果も int 型にするため小数点以下を切り捨てます。
そして代入の時点で float に変換されます。

B は分母で int + float を行っているためその計算結果が float 型になり、除算が int / float となって結果も float 型になります。つまり、小数点以下を(float のできる範囲で)計算することになります。
そのあとの代入では float を float に代入するだけなので変換は起きません。
    • good
    • 0
この回答へのお礼

同文ですが皆様のお陰で解決できました。
ありがとうございました。

お礼日時:2014/02/23 04:14

i / (MAX - 1) は全て整数で演算されます。


i / (MAX - 1.0f)はMAXの10の演算相手がfloatなのでfloatに変換されて10fに、10fと1.0fの演算結果もfloatのためiもfloatに型変換されて演算されます。
算術型変換を調べてみてください。
    • good
    • 0
この回答へのお礼

同文ですが皆様のお陰で解決できました。
ありがとうございました。

お礼日時:2014/02/23 04:14

自分で結果見て経験したように変わります


Aだと(計算式内にintしか存在していないので)整数演算されて小数点以下全部なくなります
Bは浮動小数点演算されます
    • good
    • 0
この回答へのお礼

同文ですが皆様のお陰で解決できました。
ありがとうございました。

お礼日時:2014/02/23 04:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!