プログラミングにおいて、悩ましいことの一つに「丸め誤差」があります。
この丸め誤差とはどのような誤差なのでしょうか?
この誤差の意味を理解することは、小数点以下の数値の扱い方を知ることになります。
複雑な計算式のみならず、単純な計算式においても、小数点いわゆる実数を扱う場面は多くあります。
ここで、プログラムを作成するうえで、小数点以下の数値をどう扱うのかを学んでください。
丸め誤差とは何か?
丸め誤差とは、どのような誤差でしょうか?
丸めるという意味合いには、騙すとか丸め込むとか何かと一緒にするとか、あまり良いイメージがありません。
実は、この丸め誤差というのも、同じような意味合いになるのです。
持て余された小数点以下の数値を、騙したり、丸め込んだり、何かと一緒にするということなのです。
何を言いたいかというと、本当の数値を、違う数字にしてしまうということなのです。
つまり、騙したり、丸め込んだり、何かと一緒にしてしまうのです。
偽りの数値にするように丸め込むため、「丸め誤差」と呼んでいるのです。本来の数値と偽りの数値の差分を誤差といいます。
では、なぜこのように面倒な丸めをする必要があるのでしょうか?
理由は単純です。
人間がわかりやすいように数値を単純にしたいからなのです。
とかく、小数点以下の数値は人間にとって分かりづらいです。
また、循環小数のようにいったい本当の数値はどれなの?という場合もあります。
10÷3は、3.3333・・・となり、永遠と続きます。これでは、どう数値を扱ったら良いのか分からなくなります。
そこで、小数点以下の数値を何かしらで「丸める」ということが考えられたのです。
この「何かしら」の部分に該当するのが、よく知られている、「四捨五入」や「切り上げ」、「切り捨て」なのです。
小数点第三位を四捨五入または切り上げ、切り捨てし、第二位までを有効数値とするというように、小数点の桁を指定して、小数点以下の数値を扱うかを決めることを「丸め」と呼び、丸めることで出された数値と本来の数値との差分を「誤差」と呼びます。
これが、「丸め誤差」なのです。
四捨五入・切り上げ・切り捨てとは?
小学校で習っているはずなので、あえてここでは、四捨五入などの説明は省略しますが、設計やプログラミングを行う上では、どういう意味をもつのか、その考え方を説明していきます。
設計は、仕様と呼ばれるものをもとにします。
何かしらの計算式が仕様としてまとめられているはずです。
例えば、成績の平均値や標準偏差、偏差値などの計算式がそれにあたります。
ここで、それぞれの計算式で、小数点以下をどう扱うかが仕様として決められているはずです。
四捨五入にするのか、切り上げるのか、切り捨てるのか。小数点以下は第何位までを採用するのかなどです。
つまり、各プロジェクトの仕様によって、小数点以下の数値をどう扱うかが異なるのです。
同じ平均値の計算式でも、プロジェクトAでは、小数点第三位を四捨五入、プロジェクトBでは、切り上げというように異なることがあるのです。
- プロジェクトA:69.124 ---> 69.12(小数点第三位を四捨五入)
- プロジェクトB:69.124 ---> 69.13(小数点第三位を切り上げ)
このように、丸める前の数値(69.124)は同じでも、小数点第三位の数値(4)をどう扱うかによって、結果が異なります(たまたま一致する場合もありますが)。
計算式が複雑になると、途中の式では、四捨五入で、途中は切り上げでなど、丸める方法も複合的になる場合があります。そうすると、バグが発生しやすくなります。
小数点を扱う計算式では、ひとつひとつ、丸め方を確認していかないと、最終的な計算結果が仕様と異なることになりますので、注意が必要です。
単体テストで、十分な検証を行ってください。これをおろそかにすると、後々とんでもない、障害を生むことになりますので。
丸め誤差による障害については、こちらを参照下さい。
カテゴリ:プログラミング