誤差
ここでは、誤差について扱います。誤差は、期末テストなどで聞かれやすい分野であり、用語を忘れやすい分野でもあるので、気をつけてください。
浮動小数点数
コンピューターでは、浮動小数点方式が使われます。浮動小数点方式では、仮数部と指数部によって数値を表現します。
12345=仮数部1.2345×104指数部
物理的制約があるので、仮数部と指数部は有限桁でしか扱えません。
丸め誤差
丸め誤差とは
世の中には、有限桁の小数では表せない数字は多くあります。
まずは、10 進数で考えましょう。
例えば、1/3 は有限桁の小数では表せません。0.3 も 0.33 も 0.333 も 1/3 の近似でしかありません。
たとえ、次のようにどんなに桁を大きくしても有限である限り近似であることには変わりがありません。
0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 2 進数においても同じことが起こります。
10 進数の 0.1 を 2 進数で表すことを考えます。
0.1(10)=0.0625(10)+0.03125(10)+0.00390625(10)+0.00195332(10)+⋯=161(10)+321(10)+2561(10)+5121(10)+⋯=0.0001(2)+0.00001(2)+0.0000001(2)+0.00000001(2)+⋯=0.000110011⋯(2) このように 0.1(10) は 2 進数では有限桁で表せません。
コンピューターは 2 進数で処理をするので一度 10 進数を 2 進数に変換しますが、そのときに無限桁を扱うことはできないので、有効桁以降を切り捨てることになります。これによって、誤差が出るのが丸め誤差です。
丸め誤差の例
さきほど述べたように 0.1(10) を二進数で表すと丸め誤差が発生します。そのため、例えば 0.1×3 を計算すると丸め誤差の影響が現れます。
桁落ち
桁落ちとは
有効数字 7 桁で 1001−999 を計算することを考えます。
1001=31.638584⋯≃31.63858 909=31.606961⋯≃31.60696 よって、
1001−999≃0.03162 このようにすると、有効数字が 4 桁に減ってしまいます。
このように値がほぼ同じ数値同士で減算をしたときに有効桁数が減少することによって生まれる誤差が桁落ちです。
回避策
実は今回の場合は、回避策があります。
1001−999=1001+999(1001−999)(1001+999)=1001+9991001−999=1001+9992≃31.63858+31.606962=63.245542≃0.03162278 今回の場合ならば、これで桁落ちを回避できます。
桁落ちの例
少し桁を大きくして、実際に確かめてみましょう。
上が桁落ちが起こってしまった例で、下が桁落ちを回避した例です。確かに、上はずれてしまいましたね。
情報落ち
情報落ちとは
次の場合、有効数字が 5 桁なら
1.0000×104+1.0000=1.0001×104≃1.0001×104 となって正しく計算できますが、有効数字が 4 桁だと、
1.000×104+1.000=1.0001×104≃1.000×104 となって正しく計算できません。
次のように、何度も足す場合には深刻になってきます。
1.000×104+4.000+4.000+4.000=1.0004×104+4.000+4.000≃1.000×104+4.000+4.000≃⋯≃1.000×104 このように、絶対値の大きい数と絶対値の小さい数を加減算したときに、絶対値の小さな数字が無視されてしまうことを情報落ちといいます。
回避策
これには、回避策があります。
小さい数を先に足して、その後に大きい数を足せば回避できます。
4.000+4.000+4.000+1.000×104=8.000+4.000+1.000×104=12.000+1.000×104=1.0012×104≃1.001×104 これで、有効数字 4 桁で正しい計算ができました。
情報落ちの例
10000000000 に 0.0000001 を 10000000 回足すと、10000000001 になります。しかし、上の計算では正しく計算できていません。一方、下の計算では正しく計算できます。