- ベストアンサー
「割り算」 と 「分数の掛け算」
double型の変数にある値が代入されていて、 その数を半分にしようとしました。 演算部分を /2 としたらエラーが出てしまいました。 いろいろ試した結果、*0.5とすれば ちゃんと計算されるようなのですが、 どうしてこのようなことが起こるのか、よくわかりません。 どなたか、ご教授ください。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>#define c 1 と言うことで、c は int の定数と判断されます >double b; で、格納する変数は double になっているのですが、 >b = c / 2; の右辺を見ると、 定数のintである1を、定数のintである2で割っているため、この文の結果はintになってしまいます。 本来なら0.5となるべきところですが、/ の両辺が int の場合は、結果を int で返しますので、0.5 の実数部分の0が結果となるわけです。 これを右辺の b に代入するときに 暗黙の型変換にてdouble として入れているのですが、すでに切り捨てられてしまった小数部分は帰ってこないわけですね。 2.0 とするとうまくいくのは、 / のどちらかが double の場合は、片方の int を暗黙に double に変換して double の結果を返すからですね。 演算式の、型変換について、もう一度ヘルプ等で調べて見てください。
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
bcc32で #include <stdio.h> void main(void){ double x = 3.1415926; x = x / 2; printf("x=%f\n",x); } のようなテストをしてみましたが、エラーにはなりません。 どのような「演算」だったのでしょうか?
補足
お返事、ありがとうございます。 qKAZpさんへの補足にも書きましたが、 /2.0と書けばうまくいきました。 しかし、BLUEPIXYさんに頂いた回答にあるプログラムでは 確かにちゃんと計算されるようです。 この違いが起こる理由が分かりません。
- qKAZp
- ベストアンサー率47% (71/148)
どんなエラーがでたんでしょう? たとえば / 2.0 とかだとでないんじゃないですか?
補足
お返事、ありがとうございます。 すみません、言い方が間違っていました。 エラーが出たのではなく、計算結果がゼロになってしまったのです。 おっしゃるとおり、/2.0にしたら正しい計算結果が出てきました。 なぜ、2ではダメで2.0だとOKなのでしょうか? 整数型と実数型の違いなのでしょうか? そのあたりがよくわかりません。 ちなみに、元のプログラムは #include <stdio.h> #define c 1 void main(){ double b; b = c / 2; printf("%f\n", b); } です。補足が長くなって申し訳ありません。
お礼
なるほど、わかりました!! やはり型の考え方に問題があったんですね。 もう少し勉強しなければ、と痛感しました。 ありがとうございました。