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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C++ と、 1 2022/11/07 23:45
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C++言語の16進数の表現についておしえてください 1 2022/11/14 17:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
三角比の俯角の計算
-
255の2の補数、B'00000001'が-...
-
三菱シーケンサ(Aシリーズ)で...
-
c languageで 簡単な質問があ...
-
floatの有効桁数
-
VB.net Double と...
-
ExcelのINT関数の計算結果がお...
-
0~2πの範囲を十等分して…
-
浮動小数点演算は難しいのか。
-
”/”を使わずに割り算したいんで...
-
10進数での「25」が2進数では「...
-
C言語で2進数の減算
-
VB6.0での小数点の扱いについて
-
除算を使わずに10で割りたい。
-
MATLABでの行列の全要素の和
-
O(n log n)について2
-
EXCELの関数"STDEV(標準偏差)"...
-
変換指定子%22-16gの表示...
-
powf を使わずにべき乗を計算
-
どんな数字を入力してもaverage...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
ExcelでPC(パソコン)によって...
-
ExcelのINT関数の計算結果がお...
-
16進数 加算 減算 C言語
-
VB.net Double と...
-
floatの有効桁数
-
三菱シーケンサ(Aシリーズ)で...
-
c languageで 簡単な質問があ...
-
除算を使わずに10で割りたい。
-
VBAでミリ秒まで出力する方法
-
VBAでの割り算の余りの求め方
-
VB6.0での小数点の扱いについて
-
VB6のFIX関数での誤差について
-
有効数字について 以前質問をし...
-
100桁の計算ができなくて困って...
-
浮動小数演算は実行環境の変化...
-
EXCELの関数"STDEV(標準偏差)"...
-
BCD・HEX・BINについて
-
コンピューターは指数関数をど...
-
乱数 なぜ剰余を使うのか
おすすめ情報