俺氏、本を読む

30歳になるまでに本を読んで勉強しようかと。主に啓発、お金についての本を読むつもり。一応プログラマーなのでその辺のことも

基数変換や数値演算による誤差

コンピュータで数値を表現する際には、誤差に注意する必要があります。
10進数から2進数へ基数変換するだけでも誤差が出ることがあり、
また、コンピュータ内部では限られたけた数でデータを表現するので、
いろいろな誤差や、表現しきれないことが出てきます。

基数変換と誤差

10進数の0.4を2進数に変換する場合で考えてみます。
0.4という数は有限のけたで表されているので、こういった数のことを
有限小数と呼びます。
0.4を2進数に変換すると、割り切れず循環する、次のような数になります。
 
(0.4)₁₀=(0.01100110011001100110)₂=(0.0110)₂
 
有限小数で表せない小数を無限小数といいますが、そのうち上記のように
0110の部分が繰り返される小数のことを循環小数と呼びます。
0.4という有限小数は、10進数から2進数に変換しただけで循環小数となるのです。
逆に2進数から10進数への基数変換の場合には、有限小数を変換すると、
必ず有限小数になります。

数値演算と誤差

コンピュータでは限られた数でデータを表現するので、
いろいろな誤差や、表現しきれないことが出てきます。
具体的には、次のようなことで誤差が生じます。

けた落ち

値がほぼ等しい二つの数値の差を求めた時、有効数字の
けた数である有効けた数が減ることによって発生する誤差です。
 
  256.432 有効けた数6けた
- 256.431 有効けた数6けた
―――――――――――――
   0.001 有効けた数が1けたになってしまう!

情報落ち

絶対値が非常に大きい数値と小さな数値の足し算や引き算を行ったとき、
小さい数値が計算結果に反映されないことによって発生する誤差です。
 
  256.432 有効けた数6けた
+  0.000011 非常に小さい数
―――――――――――――
  256.432011 有効けた数の関係で無視される

※けた落ちと情報落ちは混同されやすいので、
 有効けた数が減るのがけた落ち
 小さい数値の情報が落ちるのが情報落ちと覚えましょう。

丸め誤差

指定された有効けた数で演算結果を表すために、切り捨て、
切り上げ、四捨五入などで下位のけたを削除することによって発生する誤差です。

打ち切り誤差

無限級数で表される数値の計算処理を有限の回数で打ち切ったことによって発生する誤差です。

オーバフロー

演算結果が有限のけた内で表せる範囲を超えることによって、
使用している記述方法では値が表現しきれなくなることです。

アンダーフロー

浮動小数点数演算において、演算結果の指数部が小さくなりすぎ、
使用している記述方法では値が表現しきれなくなることです。
つまり、浮動小数点数表記では、0や0に近い数値を表現することが出来ません。

広告を非表示にする