- ベストアンサー
簡単な乗除の計算のプログラムなのですが・・・
簡単なプログラムなのですが学校の課題で出て分からなかったので質問します。 整数x,yがx=10、y=4の時、x*y/4とx/4*yの計算結果が異なる理由を述べなさい。 という問題です。 x/4*yのx/4の計算で2.5の小数点以下が切り捨てられて2となりそこにyを乗算したからという予想を立てましたがだめでした。 どうしてなのか教えてください。お願いします。 私は今年から大学でプログラミングを習い始めた初心者です。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
正解か分かりませんが、次のようになるのではないでしょうか。 int型どうしの演算は、結果もint型になる。 よって、x*y/4=10, x/4*y=8と結果が異なる。
その他の回答 (7)
ごめんなさい。ウソでした。 この手の質問はこの回答で問題ないケースが多かったため早とちりしました。 このケースでは他の方の回答が正しいです。 一応テストしてみました。 #include <stdio.h> int x=10, y=4; int a=0,b=0,c=0,d=0; float e=10,f=4; float g=0,h=0,i=0,j=0; main(){ a = x*y/4; b = x*(y/4); c = x/4*y; d = x/(4*y); g = e*f/4; h = e/4*f; i = x*y/4; j = x/4*y; printf ("%d\n",a); printf ("%d\n",b); printf ("%d\n",c); printf ("%d\n",d); printf ("%f\n",g); printf ("%f\n",h); printf ("%f\n",i); printf ("%f\n",j); } 出力 10 10 8 0 10.000000 10.000000 10.000000 8.000000 演算子の*と/は同じ優先順位で結合規則を考慮しても同じ結果です。 ちなみに、お詫びとしてもう少し書くと、ebi_cさんのテストプログラムでは問題が発生するはずです。この場合はx,yがintですから保存されるべき答えがintで保持されてしまいます。 キャストを用いるか、x,yをfloatで定義しなければなりません。 早とちりで、恥をさらしてしまった・・・グスン・・・
どう考えても、x/4で精度を維持できないというのが理由だと思います。 閉じる前に答えを教えてください。
お礼
前者は10、後者は8になった理由はなんとなく、わかりました。 問題に対しての答えは申し訳ないのですが課題提出前なので私にもわかりません。 ありがとうございました。
- kmb01
- ベストアンサー率45% (63/138)
*,/,%は左結合型なので左から評価されます。 x/4*y は先にx/4が評価され、両方整数なので整数除算が行われます。 (2.5を切り捨てるのではなくいきなり2になります)
- JaritenCat
- ベストアンサー率37% (122/322)
すいません。回答ではないのですが、No.3の回答を書いた者です。 No.1とNo.4の回答が理解できないのですが、2項演算子*と/の優先順位は同じですよね?(ポインタの*はずっと優先順位高いですがポインタには見えないので)
お礼
補足になってしまうのですが、私が問題を確認するために作ったプログラムは以下のようなものです。 #include <stdio.h> main() { int x,y; float z; x=10; y=4; c=x/4*y; ←ここを入れ替える printf("%f",z); }
補足
ありがとうございます。 私も質問前にネットで検索したのですが*と/の優先順位が同じと書いてあったのでわからなくなってどうしようもないのでここに質問したのです。
「演算子の優先順」でしょう。 検索するなり、本を読めば判ります。
- JaritenCat
- ベストアンサー率37% (122/322)
No.2が正解だと思います。 xもyも整数型で定義されていて、数字の4も整数定数(小数の場合は4.0とする)なので、すべて整数型で計算されます。 x*y/4の場合、 10*4=40 40/4=10 x/4*yの場合、 10/4=2 2*4=8
- graduate_student
- ベストアンサー率22% (162/733)
いわゆる掛け算と割り算は左から計算するものです. つまり,x*y/4は「分子がxy,分母4」で,x/4*yは「分子がx,分母が4y」です. なので結果は異なりますね. 結果を同じにしたいのであれば,例えば,x/4*yを(x/4)*yというように括弧を付ければいいのです.
お礼
問題文の「整数x,yが~」という部分がという部分がミソなのですね。x,yをfloatで宣言したら問題は解消されました。 わかりました。 ありがとうございます。