web-dev-qa-db-ja.com

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

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

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

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

46
Profpatsch

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

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

3つすべての丸めがメソッド "round half up"を使用して行われる場合、結果は次のようになります(最初の列は丸めの結果、2番目の列はどのようにmany結果に丸められた数値—つまり、ヒストグラムです)。

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のうちの最も近い1000の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

結果は、単一の「半減」から10,000のうちの最も近い1000の550倍まで異なり、丸められた平均値は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

結果は、1つの「丸めの奇数」から、10,000のうちの最も近い1000の550倍まで異なり、丸められた平均値は4999.5(正しい)です。

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

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

結果は、1つの「丸めの偶数」から最も近い1000まで45倍の10,000であり、丸められた平均値は4999.5(正しい)です。

四捨五入と四捨五入が丸められた値にバイアスをかけるので、丸められた値の平均が元の値の平均と同じ期待を持たなくなり、「丸め半分が偶数」と「丸め半分が奇数」になることは明らかだと思います「片方の時間を半分に、もう片方を半分にして、バイアスを取り除きます。連続丸めはバイアスを増大させます。

偶数の丸めと奇数の丸めは、分布に独自の種類のバイアスを導入します。それぞれ、偶数桁と奇数桁へのバイアスです。どちらの場合も、このバイアスには連続する丸めが掛けられますが、丸めが奇数の場合は悪くなります。この場合の説明は単純だと思います。5は奇数なので、奇数の丸めの方が偶数の丸めよりも5で終わる結果が多くなります。したがって、next丸め。

とにかく、4つの選択肢のうち2つだけが不偏であり、2つの偏りのない選択肢のうち、丸めの半分は、繰り返し丸めの対象となる場合、最も良い振る舞いの分布を与えます。

39
hobbs

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

常に0.5を切り捨てるとします。それらのすべての小さな利払いについて考えてください、銀行は毎回半セントをポケットに入れています...

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

55
Loren Pechtel