
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ランキング
-
2進数の足し算(C言語)
-
巨大な階乗の桁数を求めるプロ...
-
2038年問題 日付算出
-
VB.net Double と...
-
べき指数の求め方
-
プログラムについて(UNIX)
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
-
C言語の課題です
-
scanfの後のfgetsについて
-
2進数の1の数を数える問題
-
大学数学の問題です。 加法群Z/...
-
Aの値からBの値を除するとは??
-
VC++でGetKeyboardStateがうま...
-
FortranからCの関数を呼ぶ方法
-
VOID型をSTRUCTのように
-
ハノイの塔
-
2重定義って??
-
球の体積と表面積を表示するプ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
有効数字について 以前質問をし...
-
ExcelでPC(パソコン)によって...
-
c languageで 簡単な質問があ...
-
VB.net Double と...
-
O(n log n)について2
-
EXCELの関数"STDEV(標準偏差)"...
-
”/”を使わずに割り算したいんで...
-
三菱シーケンサ(Aシリーズ)で...
-
16進数 加算 減算 C言語
-
floatの有効桁数
-
2進数の足し算(C言語)
-
VB6.0での小数点の扱いについて
-
ExcelのINT関数の計算結果がお...
-
色の判定
-
BCD・HEX・BINについて
-
距離から緯度経度を求める方法
-
除算を使わずに10で割りたい。
-
VBAでミリ秒まで出力する方法
-
どんな数字を入力してもaverage...
-
VB6のFIX関数での誤差について
おすすめ情報