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

以下のようにするとdには0.5ではなく0が代入されます。

int x = 1, y = 2;
double d = x / y;

これを回避するために以下のようにするのが一般的だと習いました。

//1.
double d = (double)(x) / y; // これでdには0.5が代入される

これを以下のようにしてしまうのに問題はあるでしょうか?

//2.
double d = (double)(x) / (double)(y);
//3.
double d = x / (double)(y);

また、1.と2.と3.ではどれがより良いのでしょうか?
単純に好みの問題なのでしょうか?

以上、よろしくお願いいたします。

A 回答 (3件)

恐れ入ります。



単純に好みの問題かと思います。
CやC++の規格に準拠したコンパイラであれば、結果的に同じ式として扱ってくれます。
***
ただし、1,2,3ではない別種の方法を良く用いるので参考までに挙げておきます。

int x = 1;
int y = 2;
double dpoX = 0;
double dpoY = 0;
double d = 0;

dpoX = (double)x;
dpoY = (double)y;
d = dpoX / dpoY; /* 計算するときには、精度を揃えておく */

整数を使う場面では整数を使い、倍精度の計算をするときには倍精度で計算するのが良いかと。混ぜると混乱の元です。
(個人的には、ハナからdoubleで取り扱うべきかと思います)

速度的には前述の1,2,3と同様に、計測できるほどの速度低下にはなりません。
(可読性を犠牲にするのは、「除算は遅いから使いたくない」という様な時だけにする方が良いと思います)

ご参考になれば幸いです。
    • good
    • 0
この回答へのお礼

なるほど。そういうやり方もあるのですね。
ありがとうございました。

お礼日時:2008/03/22 15:24

計算途中で暗黙の型変換が行われるため


結果的に生成される実行ファイル(Windowsならexe)は通常、1~3全て同じです。

最も省略して書くならxやyへの括弧も不要で
double d = (double)x / y;と書けます。(演算子、記号の優先順位は決まっています。)
見やすいかどうかという問題もありますが
それも個人差があるので、やはり好みの問題が大きいですね。

ただ個人的に3は無いかな・・・

下記URL
http://www.icepp.s.u-tokyo.ac.jp/~sakamoto/educa …
1.7.型変換とプロモーションが参考になると思います。
二項演算の場合、二つの式の型が異なる場合、自動的に型変換が起こります。(以下略)
    • good
    • 0
この回答へのお礼

参考URLありがとうございます。
勉強になります。

お礼日時:2008/03/22 15:23

Cやjavaでは,int型とdouble型の変数を演算すると,結果はdouble型になります.このため,int型同士の演算で結果をdouble型で欲しい場合には,どちらかの(或いは両方の)変数をdouble型にキャストするわけです.



よって文法上は,1,2,3とも問題無いです.実行速度の差も殆ど無いと思います.あとはソースコードの可読性の問題になります.個人的には,2.が「小数点型で結果を出す」というメッセージが強く伝わるので良いと思いますが,基本的には好みや作業グループ内でのコーディング規約に拠るものだと思います.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
とてもよく理解できました。

お礼日時:2008/03/22 15:23

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A