誤差と有効数字の話の演習問題 + $\alpha$
次の3つの数のそれぞれを,有効数字6桁,4桁,2桁で(指数表記/科学的記数法は用いないで)表しなさい.丸めには四捨五入を用いること.
2357.1113
5963808000
0.0046492929
問1の3つの数を,科学的記数法を用いて有効数字4桁で表しなさい.丸めには四捨五入を用いること.
あるコンピュータプログラムに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}
$$