● 誤差について
コンピュータは有限桁演算を行いますので、計算された結果は必ずしも正確な数値になるとは限りません(人間の手計算よりも確実性はあるが、「コンピュータだから正確」とは言えない)。
通常、コンピュータ上で扱える範囲を超えた数値は、切り捨てや切り上げ、または四捨五入で丸められます。
367 / 3 → 122.333333333333333333…
切り捨て
この丸め処理により、真の計算結果との誤差が発生します。
また、2進数で表現しきれない実数を扱った場合にも、誤差が生じます。数値は通常、コンピュータにとって都合の良い 2進数に変換され記憶・演算・操作されますが、10進数の実数は 2進数で正確に表現することが難しいため、表現しきれなかった部分が誤差となって現れます。
その他にも、桁が違う値(有効桁に届かない値)を加減算する場合や、非常に近い数値同士を減算した場合等に誤差が発生する事があります。
0.06252 → 0.06252000000000001
6.532e+20 + 1000 → 6.532e+20
1.000001 - 1 → 9.999999999177334E-007
・
・
・
- 計算は一回で行った方が、誤差が少なくなります。
367 / 3 * 3 → 367
分割して計算を繰り返す場合、数値文字列に変換されたものを再び計算に使用すると、誤差が大きくなる場合があります。
@ 367 / 3 → 122.3333333333333
A 122.3333333333333 * 3 → 366.9999999999999
式が文字列によって分割されると、個々の式に関連がある事はユーザにしか判らなくなります。そのため上記の結果は、@、Aを単独で見た場合は正しい結果、となりますが、@、Aに繋がりがあると見た場合は不正確、となります。
分割した計算を行う場合はメモリを使用する事で、誤差を少なくすることができます。
@ 367 / 3 → [0] に代入
A [0] * 3 → 367
式が変形できる場合は、除算や逆数の乗算等の丸めが発生する演算を、できるだけ最後に行うようにします。
@ 367 * 3 → 1101
A 1101 / 3 → 367
- 複数パターンで表現できる式は、誤差を大きくしてしまう形を選ばないように、注意する必要があります。
例えば、500 から x パーセント分を減じる時
500 - 500 * x / 100
この式は、a - ax / 100 = a (1 - x / 100) から、
500 * (1 - x / 100)
とすることもできますが、x が大きくなると誤差が発生する場合があります。