Skip to content

Latest commit

 

History

History
81 lines (56 loc) · 3.06 KB

ex11notebookB.md

File metadata and controls

81 lines (56 loc) · 3.06 KB

Data2023 ex11notebookB

誤差と有効数字の話の演習問題 + $\alpha$

演習問題

問1

次の3つの数のそれぞれを,有効数字6桁,4桁,2桁で(指数表記/科学的記数法は用いないで)表しなさい.丸めには四捨五入を用いること.

2357.1113

5963808000

0.0046492929

問2

問1の3つの数を,科学的記数法を用いて有効数字4桁で表しなさい.丸めには四捨五入を用いること.

問3

あるコンピュータプログラムに3つの数値を出力させたところ,次のように表示された.これらの数を大きい順にならべなさい.

1.23e+00   -3.45e+02   5.67e-01

計算誤差の話の補足

notebookA の「計算誤差」の項に,次のようなプログラムがありました.

# 変数 x を 0 で初期化して,そこに 0.1 を加えることを10回繰り返す
x = 0
for i in range(10):
    x += 0.1
print(x)

このプログラムが正確な値を求められない理由を説明します.

理由をきちんと理解するためには,コンピュータが小数を2進数でどのように表現するのかについての知識が必要ですが,ここでは簡単のため,まずは10進数で話をします.

$\frac{1}{3}$ という数を10進数の小数で表すと, $0.\dot{3} = 0.3333\cdots$ という無限小数になります.これを有限桁で,例えば小数点以下3桁までで表そうとすると,下位桁を切り捨てて $0.333$ とせざるを得ません.したがって,小数点以下3桁までしか表せない計算機で $\frac{1}{3} + \frac{1}{3} + \frac{1}{3}$ を計算しようとすると,

$$ 0.333 + 0.333 + 0.333 = 0.999 \ne 1 $$

ということになってしまいます.

$0.1$ の場合も同様のことが起こっています. $0.1$ は10進数では小数第1位までで表せる数ですが,2進数だと

$$ 0.0\dot{0}01\dot{1}_{(2)} = 0.00011001100110011\cdots _{(2)} $$

という循環小数になります.そのため,数を2進数で表すコンピュータでは, $0.1$ を有限の桁数で表せず,誤差が生じてしまう,というわけです.

ちなみに

$$ \begin{gathered} 0.5 = \frac{1}{2} = 0.1_{(2)}\\ 0.25 = \frac{1}{4} = 0.01_{(2)}\\ 0.125 = \frac{1}{8} = 0.001_{(2)}\\ 0.0625 = \frac{1}{16} = 0.0001_{(2)}\\ \end{gathered} $$

ですね.

$$ \begin{aligned} &0.0\dot{0}01\dot{1}_{(2)}\\ &= 0 \cdot\frac{1}{2} + 0\cdot\frac{1}{4} + 0\cdot\frac{1}{8} + 1\cdot\frac{1}{16} + 1\cdot\frac{1}{32} + 0\cdot\frac{1}{64} + 0\cdot\frac{1}{128} + 1\cdot\frac{1}{256} + 1\cdot\frac{1}{512} + \cdots\\ &= \frac{1}{16} + \frac{1}{32} + \frac{1}{256} + \frac{1}{512} + \frac{1}{4096} + \frac{1}{8192} + \cdots\\ &= \left( \frac{1}{16} + \frac{1}{32} \right) + \frac{1}{16}\left( \frac{1}{16} + \frac{1}{32} \right) + \frac{1}{16^2}\left( \frac{1}{16} + \frac{1}{32} \right) + \cdots \\ &= \frac{3}{32} + \frac{3}{32}\cdot\frac{1}{16} + \frac{3}{32}\cdot\frac{1}{16^2} + \cdots\\ &= \frac{\frac{3}{32}}{1-\frac{1}{16}} = \frac{1}{10} \end{aligned} $$