
以下のようにすると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.ではどれがより良いのでしょうか?
単純に好みの問題なのでしょうか?
以上、よろしくお願いいたします。
No.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と同様に、計測できるほどの速度低下にはなりません。
(可読性を犠牲にするのは、「除算は遅いから使いたくない」という様な時だけにする方が良いと思います)
ご参考になれば幸いです。
No.2
- 回答日時:
計算途中で暗黙の型変換が行われるため
結果的に生成される実行ファイル(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.型変換とプロモーションが参考になると思います。
二項演算の場合、二つの式の型が異なる場合、自動的に型変換が起こります。(以下略)
No.1
- 回答日時:
Cやjavaでは,int型とdouble型の変数を演算すると,結果はdouble型になります.このため,int型同士の演算で結果をdouble型で欲しい場合には,どちらかの(或いは両方の)変数をdouble型にキャストするわけです.
よって文法上は,1,2,3とも問題無いです.実行速度の差も殆ど無いと思います.あとはソースコードの可読性の問題になります.個人的には,2.が「小数点型で結果を出す」というメッセージが強く伝わるので良いと思いますが,基本的には好みや作業グループ内でのコーディング規約に拠るものだと思います.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- C言語・C++・C# c言語について 下記の計算結果を出力するコードを記述する問題で 0-4 3.14×2 5÷3 30÷ 5 2022/05/17 22:41
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
gccを行ってもexeファイルが生...
-
c言語
-
visual studio 2022でのC#プロ...
-
C# DatagridviewにExcelシート...
-
mallocについて
-
C言語って古いですか?
-
C言語関数違いについて。
-
逆コンパイルと逆アセンブルの...
-
プログラムの実行時に'<'でリダ...
-
パソコン
-
CPUが16bitでも32bitOSでコンパ...
-
Python、プログラミングについ...
-
だれがとけるの?
-
バッチファイルで以下のような...
-
Notepad++の関数リスト表示の変...
-
VisualStudio2022でC言語プログ...
-
License='MIT' ってなんでmitな...
-
C言語 ストリームについて。
-
c言語でイベントフラグを使った...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
gccを行ってもexeファイルが生...
-
大量のデータを読み込んで表示...
-
visual studio 2022でのC#プロ...
-
C++でデスクトップGUIアプリ開...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudio2022でC言語プログ...
-
C#でログファイルにファイルパ...
-
C#でTreeViewのCheckBoxのサイ...
-
c#のTLS1.2での通信について
-
VisualStudioでC++クラスを追加...
-
C言語について。
-
int16_t の _t は何?
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
C言語の関数のextern宣言
-
c言語でイベントフラグを使った...
-
C言語 関数、変数の宣言について
-
[C言語]fputsとfprintfの違い
おすすめ情報