• 検索結果がありません。

整数の計算(1)

N/A
N/A
Protected

Academic year: 2021

シェア "整数の計算(1)"

Copied!
21
0
0

読み込み中.... (全文を見る)

全文

(1)

コンピュータ科学 III

担当:武田敦志 <[email protected]>

(2)

復習問題

演習問題

0 0 1 0 1 1 0 0 +) 1 1 0 0 0 1 0 0 0 1 1 1 1 0 0 0 0 6010 = 0 0 1 1 1 1 0 02 -6010 = 1 1 0 0 0 1 0 02

(1) 『-60』を2の補数表現(2進数8bit)で示せ

(2) 『44 + (-60)』 を

2の補数表現(2進数8bit)を使って計算せよ

(3)

今日の話

コンピュータ上の計算でおきる間違いと誤差 桁あふれ

桁数が決まっているため、有限の大きさしか扱えない 浮動小数点数

丸め誤差・桁落ち

2進数をつかった小数計算におこる誤差

コンピュータ内部では、小数点以下も2進数で表現する

(4)

整数の計算(1)

コンピュータにおける除算 加算回路を使って除算する

35 – 13 = 22

正の整数を除算 負の整数を加算 35 + (-13) = 22

負の整数をどのように表現するか?

コンピュータにおける負数の表現方法=2の補数表現

(5)

整数の計算(2)

2の補数表現

円形の数直線を使って計算

2進数 8bitの場合 111111112

-1

000000002 111111102

000000012

000000102

100000002 011111112 100000012

0 1

-2 2

-127 127

-128

整数の桁数は決まっている 不連続な部分がある

+3

+3

?

(6)

整数の計算(3)

表現できる値の範囲を超えて計算すると 間違った計算結果となる

桁あふれ

2進数8bit(2の補数表現)の場合

127 + 1 = 011111112 + 000000012 = 100000002 = -128 127 + 2 = 011111112 + 000000102 = 100000012 = -127 127 + 3 = 011111112 + 000000112 = 100000102 = -126

(7)

整数の計算(4)

整数計算を行う場合の注意

整数で表現できる値の最小値・最大値を意識する

最小値~最大値の中での計算であれば正しい結果となる

8ビット整数:

最小値 = -128 最大値 = 127

16ビット整数:

最小値 = -65536 最大値 = 65535 32ビット整数:

最小値 = - 4294967296 最大値 = 4294967295

(8)

整数の計算(5)

桁あふれを発生させるプログラム

#include <stdio.h>

int main() {

int a = 1;

int i;

for(i = 0; i < 13; i++){

printf("10%2d = %d\n", i, a);

a = a * 10;

} }

10 0 = 1 10 1 = 10 10 2 = 100 10 3 = 1000 10 4 = 10000 10 5 = 100000 10 6 = 1000000 10 7 = 10000000 10 8 = 100000000 10 9 = 1000000000 1010 = 1410065408 1011 = 1215752192 1012 = ‐727379968 実行結果

プログラム(int型は32bit

(9)

練習問題

2進数8bit(2の補数表現)の環境で、以下の計算せよ (1) 120 + 80

(2) 100 × 4

0 1 1 1 1 0 0 0 +) 0 1 0 1 0 0 0 0

1 1 0 0 1 0 0 0 = -56

0 1 1 0 0 1 0 0

×) 0 0 0 0 0 1 0 0

1 1 0 0 1 0 0 0 0 = -112

(10)

コンピュータにおける小数の表現(1)

仮数と指数を使って数値を表現することができる 仮数と指数

例:光の速さ(秒速約30万km)

300,000,000 m/s

3.0 × 10

8

m/s

仮数 指数

(11)

コンピュータにおける小数の表現(2)

コンピュータでは、小数を仮数+指数で表現する 浮動小数点数(IEEE754)

例:35.375

100011.011

2

1.00011011

2

× 2

5

仮数の小数点以下 指数

01000010000011011000000000000000

単精度 浮動小数点数(float)

指数+127 仮数の小数点以下

(12)

コンピュータにおける小数の表現(3)

浮動小数点数の最大値と最小値(単精度浮動小数点数の場合)

00000000100000000000000000000000

指数 仮数の小数点以下 指数の表現範囲: -126 ~ 127

仮数の表現範囲: 1 ~ (2 – 2-23) 最小値:1.0×2-126 ≒ 1.175494×10-38

最大値:(2 – 2-23)×2127 ≒ 3.402823×1038

01111111011111111111111111111111

指数 仮数の小数点以下

(13)

コンピュータにおける小数の表現(4)

2進数の小数(小数点以下の計算)

0.12 = 1/2 0.012 = 1/4 0.0012 = 1/8

0.0112 = 3/8 = 0.375 2進数から10進数への変換

10進数から2進数への変換 0.375

= 375/1000

= 1011101112/111110100002

= 0.0112

11111010002 101110111.0002 0.0112

11111010 002 01111101 0002

1111101 0002 02

(工夫をすれば簡単に計算可能)

(14)

練習問題

下記の小数を2進数で表現せよ (1) 0.625

(2) 9.4375

0.625 = 5/8 = 0.1012

0.4375 = 7/16 = 0.01112

9.4375 = 10012 + 0.01112 = 1001.01112

(15)

少数計算に発生する誤差(1)

2進数の無限小数

(例)

0.1 = 1/10

= 0.00011001100...2

10進数と2進数では、無限小数となる値に違いがある

10102 1.000000000000002

0.0001100110011.... 2

10102 11002 10102

100002 10102

11002 10102

10... . 2

(16)

少数計算に発生する誤差(2)

丸め誤差

コンピュータ表現できる小数の長さは有限

10進数では有限でも、2進数だと無限小数になるものがある

0.1 = 0.00011001100...2 ⇒ 0.000110102 = 0.1015625

(例)2進数(小数点以下8bit)で表現する場合

入力 内部表現 出力

0.2 = 0.00110011000...2 ⇒ 0.001100112 = 0.19921875

入力 内部表現 出力

(17)

少数計算に発生する誤差(3)

丸め誤差を確認するプログラム

#include <stdio.h>

int main() {

float a = 1.1;

double b = 1.1;

printf("a = %.20f\n", a);

printf("b = %.20f\n", b);

}

a = 1.10000002384185791016 b = 1.10000000000000008882 実行結果

プログラム

float型の小数点以下は23bit

double型の小数点以下は52bit

(18)

少数計算に発生する誤差(4)

桁落ち

コンピュータ内の少数の桁数は有限

近似値で計算している場合がある

(例)2進数(小数点以下8bit)で表現

『(0.2 - 0.1) × 10』を計算する

0.1 ⇒ 0.000110102 0.2 ⇒ 0.001100112

0.2 - 0.1 = 0.000110012 = 0.09765625 (0.2 - 0.1) × 10 = 0.9765625

(19)

少数計算に発生する誤差(5)

桁落ちが発生するプログラム

#include <stdio.h>

int main() {

float a = 1.0 + 2.0 / 1000.0;

float b = 1.0 + 1.0 / 1000.0;

float c = (a ‐ b) * 1000.0;

printf("2.0 ‐ 1.0 = %.20f\n", c);

}

(0.002 ‐ 0.001) * 1000 = 0.99992752075195312500 実行結果

プログラム

(20)

練習問題

次の数値・計算を2進数(小数点以下8bit)で表現せよ (1) 0.7

(2) 0.7 - 0.5

(3) (0.7 / 4 - 0.5 / 4) × 4 0.101100112

0.101100112 - 0.100000002 = 0.001100112

= 0.19921875

(0.001011012 - 0.001000002)× 102 = 0.000011012×102

= 0.001101002 = 0.203125

(21)

まとめ

コンピュータ上の計算でおきる間違いと誤差 桁あふれ

桁数が固定のため、有限の大きさしか扱えない 最小値・最大値を意識して計算させる必要がある 浮動小数点数

仮数と指数で表現する

小数点以下も2進数で表現する 丸め誤差・桁落ち

10進数では有限小数であっても、

2進数では無限小数になることがある

近似された小数で計算すると、誤差が発生する

参照

関連したドキュメント

チューリング機械の原論文 [14]

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計

項   目  単 位  桁   数  底辺及び垂線長 m 小数点以下3桁 境界辺長 m  小数点以下3桁

、肩 かた 深 ふかさ を掛け合わせて、ある定数で 割り、積石数を算出する近似計算法が 使われるようになりました。この定数は船

操作内容/項目説明 振込金額を入力します。 【留意点】 ・半角数字(最大10桁)

彩度(P.100) 色の鮮やかさを 0 から 14 程度までの数値で表したもの。色味の

捕獲数を使って、動物の個体数を推定 しています。狩猟資源を維持・管理してい くために、捕獲禁止・制限措置の実施又

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計