天国にいけるC言語入門 シーズン1 パソコン超初心者がゼロから東方風シューティングをつくる編 ver.0.4.15.789 RELIEF
☆コンピュータに扱える数値には範囲があります。 その5 コンピュータ内における整数値同士の割り算の計算順序について考察してみます。
☆コンピュータに扱える数値には範囲があります。 その5 コンピュータ内における整数値同士の割り算の計算順序について考察してみます。
☆コンピュータに扱える数値には範囲があります。 その5 コンピュータ内における整数値同士の割り算の計算順序について考察してみます。
ソーラー 「マックス
いま
計算式
(10000 + 888100-555) * 100000/ 55
(10000 + 888100-555) * 100000/ 55の中から
100000/55 "だけ"を引き抜いて計算しましたね。
この計算式
(10000 + 888100-555) * 100000/ 55
は
まず
(10000 + 888100-555)=897545が計算され
次に
その897545と100000がかけあわされた
89754500000を
最後に55で割るという順序で
計算されています
つまり
100000/55を先に引き抜いて
計算しても(100000/55を計算すると小数点以下の部分が出てくるのでその部分を切り捨てて整数値だけをのこしても)
そのような
計算順序でコンピュータは計算を行っていないので
意味ないかもしれない・・・?」
ぶーにゃん 「うちも そうおもうにゃん。」
マックス 「ぬわにぃ」
ソーラー 「マックス これを見てください。
4×1
________ =2
2
マックス 「? これは?」
ソーラー 「いま私たちが
計算式
(10000 + 888100-555) * 100000/ 55に
ついておこなったことを
わかりやすく
この
4×1
________ =2 をもちいて説明してみます。
2
ソーラー 「このすぐ上の計算式はまちがっていないですね。
マックス?」
マックス 「ああ。」
ソーラー
「
わたしたちは
(10000 + 888100-555) * 100000/ 55の
100000/ 55を抜き出して先に計算しました。
これは
4×1
________ =2
2
において
1/2を抜き出し計算したことになります。
つまり
4 × 1
___ _____ と式を分割したことになります。
1 2
」
(10000 + 888100-555) ×100000/ 55と式を分割したことになります」
マックス 「そうだが・・・???」
ソーラー 「つまり
前のエピソードの計算のときも
そうなのですが
マックスは
このように
4×1
________
2
から
1/2を
とりだして
先に1/2だけに整数値同士の割り算
のルールを適用したというわけです。
つまり
とりだした
1
___ の計算結果を
2
1
___ =0.5
2
でなく
(整数同士の割り算の結果は小数点以下を
切り取られるというルールにより)
0.5の小数点以下の部分が切り取られ
1
___ =0
2
と
したのですね。
(10000 + 888100-555) ×100000/ 55
なら
100000/ 55の計算結果の小数点以下の部分が切り取られるので
(10000 + 888100-555) ×1818
にしたというわけです
」
マックス「ああおう💦 マ、マズイかも・・」
ソーラー
「そうなると
4 1
___ × _____ の計算結果は
1 2
4 1 4
___ × _____ =_____ × 0 =0
1 2 1
という結果になってしまいます。(^^)
2にならないですね。
(10000 + 888100-555) ×100000/ 55の計算結果は
1631900000
なのですが
(10000 + 888100-555) ×1818の計算結果は
1631736810
となってしまいます
。。。。。。。。。。。。。。。。。。。。。
ちょこっと解説
整数値1と2同士の割り算
1/2
の計算結果は
実際にプログラムを組んで確かめてみるとわかるように
#include <stdio.h>
int main(void)
{
printf("あなたの預金額はただいま%d円です。\n",1/2);
return 0;
}
プログラムの実行結果
あなたの預金額はただいま0円です。
と
0になります
ちょこっと解説
。。。。。。。。。。。。。。。。。。。。。。
明らかに
この結果はおかしいですね。マックス。
4 1
___ × _____ =2
1 2
にならなければ いけないのですから
このようになったのは一部分の1/2だけとりだして
いきなり1/2に
整数値同士の割り算のルールを適用したからなんですね
コンピュータの計算においては
4×1
_________
2
は
💖数式の上辺4×1が計算されたあと、出た計算結果4を💖
💖下辺の2で割るという順序で💖
計算が行われ
その上辺の計算結果4を2で割る時に
整数値同士の割り算のルールが適用されるんです
同様に
(10000 + 888100-555) * 100000/ 55
は
数式の上辺(10000 + 888100-555) * 100000が計算され、
出てきた計算結果89754500000を
下辺の55で割るという順序で
計算が行われます。
その上辺の計算結果89754500000を55で割る時に
最後に
整数値同士の割り算のルール
🌞計算結果に小数点以下の部分が出てくる場合は🌞
🌞小数点以下の部分が切り取られる🌞
が適用されることになるんです」
マックス 「ううっ いやあん。」
顔を両手でうめるマックス。
ソーラー 「つまり
(10000 + 888100-555) * 100000/ 55で
さきに
100000/ 55をとりだして
整数値同士の割り算のルールを適用したら
計算結果がおかしくなるんだな これが。
さきに
100000/ 55をとりだして実行したなら
100000/ 55は
1818.181818181818・・・・・
なので
小数点以下の部分が切り取られ
1818となります
それに
(10000 + 888100-555)が掛け合わされる
(10000 + 888100-555) * 1818
が実行されると
計算結果は
1631736810
となります
ですが
プログラムにおいて
(10000 + 888100-555) * 100000/ 55は
ふっつうに上辺すべてを計算してから
55で割るという順序で計算が行われます
この場合は
小数点以下の部分が出てこないので
小数点以下の部分が切り取られるようなことが起こることもなく
計算結果は
1631900000となります・・・
というかなるはずなのですが・・・・・・」
マックス「ふっつ~~ん💖」
ソーラー「
つまるところ 冒頭で述べたように
(10000 + 888100-555) * 100000/ 55
は
まず(10000 + 888100-555)=897545が計算され
次にそれが100000とかけあわされ
"最後に55で割る"という順序で
コンピューター内で計算されているのです。
ようするに
コンピュータの計算順序は
上辺が全て計算されてのち、その計算結果が
下辺で割られるという順序になっているんだね。😊
(^^)/」
ぶーにゃん ソーラー
「とはいっても 私たちも大分以前には
この仕組みを理解してなかったんだな。
( ̄∇ ̄;)ハッハッハ(*´▽`*)」
マックス 「あっああん💧 てんC なぐさめて お願いぃ」
てんC 「ま、まだ大丈夫です。これから これから」
ソーラー 「猫、ぶっかけちゃえ~~(^^)」
猫をほうりなげる。
ぶーにゃん 「にゃ~~~ん💖」
🐈~~🐈~~🐈
空中で🐈をダイビングcatch
マックス 「それ あはは、気持ちいいじゃないか~」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます