
No.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で演算されます。
以上ご参考になれば。
この回答へのお礼
お礼日時:2014/02/23 04:11
キャスト変換…完全に忘れてました…
なるほどなるほど。
確かにそうです。
Aの結果内容も納得がいきました。
ご丁寧な解説ありがとうございました。
No.3
- 回答日時:
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 に代入するだけなので変換は起きません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
if関数とは?
-
プログラム言語
-
今のプログラミング言語
-
著作権法について
-
vba クリップボードクリアにつ...
-
画像生成AIのプロンプトの作り...
-
プログラミングについて
-
pythonの実行に関する質問
-
OS入ってる機器のソフト・アプ...
-
プログラミングに興味があるの...
-
CSVファイルの複数行削除
-
COPYコマンドで、最後に1文字...
-
10進数から2進数に変換 例 185 ...
-
自作scratch アニメの商用利用
-
数学、プログラミング、物理、...
-
従業員が1名だけのSierっている...
-
pip --versionがエラーになる
-
Python 3.12.2 か一番最新のパ...
-
VBAでパワーシェルを実行したい...
-
Google ColaboでGUI作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラム言語
-
vba クリップボードクリアにつ...
-
プログラミングについて
-
画像生成AIのプロンプトの作り...
-
自作scratch アニメの商用利用
-
今のプログラミング言語
-
CSVファイルの複数行削除
-
Python... 環境設定 初心者です...
-
Python 3.12.2 か一番最新のパ...
-
数学、プログラミング、物理、...
-
パイソンのソースコードをChatG...
-
pythonの実行に関する質問
-
pip --versionがエラーになる
-
Geminiフォーム 画像生成で 人...
-
OS入ってる機器のソフト・アプ...
-
Google ColaboでGUI作成
-
google Colabでmatplotlibの描...
-
Webサイト内に埋め込んだmp4動...
-
初心者powershellのPS1ファイル...
-
VBAでパワーシェルを実行したい...
おすすめ情報