Scheme(R5RS)やPython(この質問を参照)などのプログラミング言語は、値が周囲の整数の間に正確に収まる場合、最も近い偶数の整数に向かって丸めます。
この背後にある理由は何ですか?
次の計算を推論しやすくする数学的なアイデアはありますか?
(R5RSは、この動作のソースとしてIEEE浮動小数点標準を参照しています。)
Scheme(R5RS)やPython(この質問を参照)などのプログラミング言語は、値が周囲の整数の間に正確に収まる場合、最も近い偶数の整数に向かって丸めます。
この背後にある理由は何ですか?
次の計算を推論しやすくする数学的なアイデアはありますか?
(R5RSは、この動作のソースとしてIEEE浮動小数点標準を参照しています。)
回答:
少し前に、基本的に丸めアルゴリズムの最悪のストレステストであるため、連続丸めのテストプログラムを作成しました。
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つの偏りのない選択肢のうち、丸められた半分は、繰り返し丸められたときに最適な分布を与えます。
それは銀行家の丸めと呼ばれます。アイデアは、多くの丸め操作からの累積エラーを最小限にすることです。
常に0.5を切り捨てたとしましょう。銀行は毎回0.5セントをポケットに入れています。
常に0.5を切り上げたとしましょう。必要以上の利息を払っているので、会計は悲鳴を上げるでしょう。