「ブロック機能」のリニューアルについて

c言語について
下記の計算結果を出力するコードを記述する問題で

0-4
3.14×2
5÷3
30÷7のあまりの数
(7+32)÷5

写真は答えです

質問なのですが、

ans5 = …7+32)/(double)5;のところで

何故(double)の入力が必要なのですか?

「c言語について 下記の計算結果を出力する」の質問画像
教えて!goo グレード

A 回答 (5件)

Cを含め多くの言語では、「整数÷整数」は整数になります。

つまり、割り切れない時は整数値に切り捨て。

3 / 2 ⇒ 1
3.0 / 2.0 ⇒ 1.5

なので、割り切れない場合に切り捨てずに実数値で答えが欲しい場合は、割る数か割られる数の少なくとも一方を実数化する必要があるので、(double)を付けます。
整数値の前に (double) と書くと実数化されるのはご存じでしょうか?
逆に実数値に (int) を付けると切り捨てで整数化されます。
    • good
    • 0

ans3 も同じなんだけど


5/3 と書くと 式は整数型で 1 になりますが
5.0/3.0 と書くと 式は 倍精度浮動小数点 で 1.66666666・・・
になります。

ans5 も (7+32)/5 なら整数の 7 に
(7+32)/5.0 とか (7.0+32)/5 とか
(7+32)/(double)5 とかなら 倍精度浮動小数点の 7.8 になります。

数値のリテラルが表す型、
数値演算がどの型でどのように行われ、
どの型が返るのか(型昇進や算術型変換)

は C の基本です。
よく理解していないとたんまりバグを生むので
要注意です。
    • good
    • 0

除法の計算結果が異なります



(int値) / (int値)
→ 剰余を無視して、商のint値を計算

(int値) % (int値)
→ 商を無視して、剰余のint値を計算

(int値) / (double値)
→ (double値) / (double値) に暗黙的に拡張
→ 実数には剰余の概念がないので、商のdouble値を計算

(double値) / (int値)
→ 同上
    • good
    • 0

> 何故(double)の入力が必要なのですか?



実際(double)を外してみればいいです。
例えば、

#include <stdio.h>

int main(void) {
 printf("%d\n", (7 + 32)/5);
 return 0;
}

みたいにして。
(7 + 32)/5 の答えが7になるから。

どういう解が欲しいか、ってのは場合によるんだけど(例えば商だけが欲しい場合は上の計算結果で良い)、仮にこういう「小数点以下まで割った解が欲しい」場合、型変換とか「キャスト」と言うのを行います。
5は整数型だけど、(double)をキャストすると5.0と言うdouble型になる。
言い換えると、他の手としては、例えば、

#include <stdio.h>

int main(void) {
 printf("%lf\n", (7 + 32)/(1.0 * 5));
 return 0;
}

とか、

#include <stdio.h>

int main(void) {
 printf("%lf\n", 1.0 * (7 + 32)/5);
 return 0;
}

とか、割る方か割られる方かどっちかに1.0を掛けて計算させる、なんつー事もやります(double型である1.0を掛ければ自然とどっちかはdouble型になる)。

➜ sho215 ./a.out
7.800000
➜ sho215
    • good
    • 0

さあねえ。


倍精度で求めろとか問題に記述があるんじゃないの?
    • good
    • 0

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

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

教えて!goo グレード

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

人気Q&Aランキング