一部の言語が最も近いEVEN整数に丸められるのはなぜですか?


44

Scheme(R5RS)やPython(この質問を参照)などのプログラミング言語は、値が周囲の整数の間に正確に収まる場合、最も近い偶数の整数に向かって丸めます。

この背後にある理由は何ですか?
次の計算を推論しやすくする数学的なアイデアはありますか?

(R5RSは、この動作のソースとしてIEEE浮動小数点標準を参照しています。)



1
IEEEは複数の丸めモードを許可します。これはそれらの1つです。一部の言語では、実行中に丸めモードを変更することもできます。
トバイアスブラント

5
Wikipediaの丸めに関するタイブレークセクションと、それぞれの背後にある協会の推論を読むことをお勧めします。


1
「正確は浮動小数点数に関する議論の問題ですが、」それは議論の問題ではなく、非常に正確に指定されています。たとえば、ここで関連する数値(42.5など)は、2進小数であるため、正確に表すことができます。正確に表現できないのは、小数を含む2進数以外の小数です。
svick 14

回答:


39

少し前に、基本的に丸めアルゴリズムの最悪のストレステストであるため、連続丸めのテストプログラムを作成しました。

0から9,999までの各数値に対して、最初に最も近い10に、次に最も近い100に、次に最も近い1000に丸められます([0,1の10,000ポイント)を3桁に丸めてから、 2、次に1)。この数値セットの平均値は4999.5です。

すべての3つの丸みが「ラウンド半分アップ」方式を使用して行われた場合、結果は次の通りです(最初の列は、丸めた結果である、2列目にはどのように多くの数字は、その結果に丸め-それは、ヒストグラムのIE)。

0     445
1000  1000
2000  1000
3000  1000
4000  1000
5000  1000
6000  1000
7000  1000
8000  1000
9000  1000
10000 555

結果は、1つの「半分に切り上げ」から10,000から550回の最も近い千倍まで異なり、平均丸め値は5055(元の平均より55.5高い)です。

3つすべての丸めが「切り捨て」で行われた場合、結果は次のようになります。

0     556
1000  1000
2000  1000
3000  1000
4000  1000
5000  1000
6000  1000
7000  1000
8000  1000
9000  1000
10000 444

結果は、1回の「切り捨て」から10,000回のうち5,000回に最も近い値であり、平均値は4944(55.5で低すぎる)です。

3つの丸めがすべて「round half odd」を使用して行われた場合、結果は次のようになります。

0     445
1000  1111
2000  889
3000  1111
4000  889
5000  1111
6000  889
7000  1111
8000  889
9000  1111
10000 444

結果は、単一の「四捨五入した奇数」から10,000回のうちの最も近い千回に550回異なり、平均丸め値は4999.5(正しい)です。

最後に、3つすべての丸めが「round half even」を使用して行われた場合、結果は次のようになります。

0     546
1000  909
2000  1091
3000  909
4000  1091
5000  909
6000  1091
7000  909
8000  1091
9000  909
10000 1091

シングルから「ラウンドの半分にも」最も近い千回の結果が異なる450万、平均丸めた値のうちの時間は4999.5(正しい)です。

切り上げられた値の平均は、元の値の平均と同じ期待値を持たなくなり、「半分の偶数」と「半分の奇数」になるように、丸められた値にバイアスをかけることは明らかだと思います「5を半分の時間で処理し、他の半分をもう半分で処理することにより、バイアスを除去します。連続的な丸めは、バイアスを乗算します。

ラウンドハーフイーブンとラウンドハーフ奇数は、それぞれ独自の種類のバイアス、つまり偶数と奇数の数字へのバイアスをもたらします。どちらの場合も、このバイアスは連続した丸めで乗算されますが、奇数の奇数の場合はさらに悪化します。この場合の説明は簡単だと思います:5は奇数であるため、奇数のラウンドハーフは偶数のラウンドハーフよりも5で終わる結果が多いため、次の丸めで特別に処理する必要がある結果が多くなります。

とにかく、4つの選択肢のうち、2つだけが偏りのないものであり、2つの偏りのない選択肢のうち、丸められた半分は、繰り返し丸められたときに最適な分布を与えます。


55

それは銀行家の丸めと呼ばれます。アイデアは、多くの丸め操作からの累積エラーを最小限にすることです。

常に0.5を切り捨てたとしましょう。銀行は毎回0.5セントをポケットに入れています。

常に0.5を切り上げたとしましょう。必要以上の利息を払っているので、会計は悲鳴を上げるでしょう。


6
しかし、なぜ偶数で奇数ではないのですか?
ラチェットフリーク

17
@ratchetfreak-ゼロから離れるのではなく、ゼロに近い小さな数字。それ以外は、それはarbitrary意的です-何かでなければなりません。
ジョナサンドゥルシー

15
@ratchetfreak:数字の1から始めて、2で割り、奇数に丸めるとどうなりますか?0.5を1に丸めます。もう一度2で割るとどうなりますか?0.5は1に丸められます。ゼロになることはありません。
gnasher729

13
偶数は、後続の丸めジレンマの必要性の確率を下げるため、奇数よりも優先されると思います。(正確に)2による除算は、実際にはかなり頻繁に行われます。
マークヴァンレーウェン14

4
統計でも重要です。データセットのすべての小数メンバーが切り上げられる場合、平均などの記述統計は、切り捨てられる場合よりも(わずかに)高くなります。Kenneth Rothmanの疫学入門では、ターミナル.5(または.005など)を常により高い数値に徐々にバイアスするように切り上げますが、常に偶数または奇数に丸めても平均は偏らないことに特に言及しています。
ウィルマーフィー14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.