質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1623閲覧

c言語の除算における商の切り捨てについて

kai20000803

総合スコア29

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/04/24 04:51

質問
知恵袋でのやり取り
知恵袋でのベストアンサーの説明の中に、C言語の規格として下記のことがあり、

整数同士の除算の場合、/演算子の結果は、代数的な商から小数部を切り捨てた値とする(注87)。商a/bが表現できる場合、式(a/b)*b+a%bは、aに等しくなければならない。

注87 これは、"0方向への切り捨て"とも呼ぶ。

こちらについてなのですが、どうして「(a/b)*b+a%bは、aに等しくなければならない。」という規格にしているのでしょうか?
もし具体的な場面で、「このような場面でこの規格の方が良いから」という説明がありましたら嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

割り算の結果と余りの結果が合うように、ってことですな。
算数の結果としては当然のことを文章に書いてるだけですね

投稿2021/04/24 04:54

y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kai20000803

2021/04/24 05:44

「(a/b)*b+a%bは、aに等しくなければならない。」について どうして初めの(a/b)のところで一の位未満の商の値を出さないかということがわかりません。 もし一の位未満の商の値を出すなら、「(a/b)*b+a%bは、aに等しくなければならない。」が成り立たなくなります。 僕が質問したかった内容は、どうしてC言語の規格で商の値を一の位未満を切り捨てるのかということです。 具体的に切り捨てた方が都合が良い場面が具体的にありましたら教えていただければ嬉しいです!
hoshi-takanori

2021/04/24 06:24 編集

横から失礼します。 > どうして初めの(a/b)のところで一の位未満の商の値を出さないかということがわかりません。 C 言語では整数同士の割り算は整数を返すことになってます。そのためには小数点以下を切り捨てる、切り上げる、四捨五入する、ランダムにどちらかを選ぶ、などの選択肢がありますが、C 言語では 0 方向に切り捨てることに決めたということです。 > もし一の位未満の商の値を出すなら、「(a/b)*b+a%bは、aに等しくなければならない。」が成り立たなくなります。 話は逆で、「(a/b)*b+a%bは、aに等しくなければならない。」というのは商と余りの関係を定めたものであり、この条件を満たすように、商の定義が変われば余りの定義も変える必要があります。小数点以下を丸めないのであれば余りは常に 0 になります (実際には誤差が発生しますが、ここでは無視します) し、もしも商の小数点以下を切り上げることにしたら、1 / 2 = 1 かつ 1 % 2 = -1 になるでしょう。 > 具体的に切り捨てた方が都合が良い場面が具体的にありましたら教えていただければ嬉しいです! 例えば幅 1000px の画面に横幅 300px のカラムをいくつ配置できるか考えた場合、1000 / 300 の結果を整数で求める必要がありますし、画面からはみ出さないようにするには小数点以下は切り捨てるのが自然な選択になります。
y_waiwai

2021/04/24 07:21 編集

書こうと思ったらすべて説明されてたでござる。 #ありがとうございます > 整数同士の除算の場合、 とついてるのに注意しましょう 整数どおしの除算の結果は整数です。小数点以下は付きません
kai20000803

2021/04/24 07:40

> 例えば幅 1000px の画面に横幅 300px のカラムをいくつ配置できるか考えた場合、1000 / 300 の結果を整数で求める必要がありますし、画面からはみ出さないようにするには小数点以下は切り捨てるのが自然な選択になります。 なるほど!!理解できました!ありがとうございます!
guest

0

どうして初めの(a/b)のところで一の位未満の商の値を出さないかということがわかりません。

もし一の位未満の商の値を出すなら、「(a/b)*b+a%bは、aに等しくなければならない。」が成り立たなくなります。
僕が質問したかった内容は、どうしてC言語の規格で商の値を一の位未満を切り捨てるのかということです。

これって、「7÷4は1余り3である」に対して、「7÷4は1.75ではないか?そもそも"余り"という概念が存在することに意味があるのか?」というような意味の質問ですかね?

算数では、割り算は、
・割り切れるまで計算する
・整数部分まで計算して余りを考える
の2通りがあるので、Cも2通り用意しています。

floatdoubleの計算が前者で、intの計算が後者です。

投稿2021/04/24 07:18

otn

総合スコア84798

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そもそも計算機は無限小数を扱えません。

普通、整数計算の結果は整数として処理します。割り算の結果も断りがなければ切り捨てます。

これはC言語の都合です。数値計算用途の言語ならこの限りではありません。C言語は当初はOSとかシステム基幹部分を作るためのものであり、数値計算目的でないためこのようにしたのだと思います。

投稿2021/04/24 06:05

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問