[ 最近の出来事 ]
膨大な件数のデータ処理をする時に、ステータスバーに進捗度を表示するコードを書いていました。
ループ処理中に、処理済件数 / レコード件数を計算して、%で表示する的な処理です。
その最中に、フとある事を思いだしました。
レコード件数は、通常そんなにぴったりな件数じゃないから、割り算すると大抵端数(小数点以下)が出ます。
結果、出てくる小数点以下の桁数が一定じゃないから、大抵はこの桁揃えも処理してからステータスバーに表示する事になります。
いわゆる“丸め”(rounding)処理ですね。
こうしたプログラムに限らないで言うと、小数点以下の処理には、いろんな種類がありますね。
まず思いつくのが切り捨て、切り上げ、四捨五入。
中でも、一方的に切り上げたり切り下げたりしない四捨五入は、なんかフェアな印象というか、これにしとけばまぁそんなに間違いないと感覚的に思っていました。
でも実際のところ、対象の桁が0の時は、何もしないので、切り上げたり切り捨てたりする処理は、こんな事になりますね。
1、2、3、4 →切り捨て
5、6、7、8、9 →切り上げ
あれ? フェアじゃない。
0は切り捨て扱いと考えて、どちらも5つずつと考えるんでしょうか?
でも、四捨五入処理によって生じる誤差も考慮すると、0~9の発生頻度が等しいとするなら、
アレ? やっぱりフェアじゃない。
最大の誤差を生み出す5が切り上げ側に判断されるという事は、誤差の大きさを考慮して考えると、10:15で切り上げが多くなってしまいます。
(丸める方向が違うから、発生頻度が同じなら相殺しあって0:5じゃないか?という話もある。)
この事を知らぬまま、大量の計算を繰り返していると、誤差がどんどん大きくなってしまいます。
こんな事は、もちろん昔から世間に広く知られていて、特定の業界では対策も取られています。
為替レートなど、小数点以下を生み出す計算を、猛烈に大量にこなす銀行では、単純な四捨五入ではなく、丸め対象の数字が5の時、結果が偶数になるように切り上げたり切り下げたりする、特殊な丸めを使ってい................るらしいよ。(本当かどうか、知らん。→で、現役銀行マンに尋ねてみたのですが、彼はローン・融資的な部署で、基本的に100円単位で切り下げという事でした。なので、結局分からず。)
これが銀行型丸め(Banker's Rounding)。
1.5→2
2.5→2
3.5→4
4.5→4
って感じです。(五捨五入という呼び方もあるらしい。)
まぁ、知ってる人も多いか。
とにかく、四捨五入がそれほどフェアで無いという事が、気になった訳です。
まぁあの....色々と計算した結果に触れる事も多いじゃないですか。
ほら、アレ......QBレートとか。
もしかして、四捨五入した結果、本当よりも多めにQBレートが計算される選手が割合的に多いとしたら...。
まぁ、実際にはQBレートの計算程度で、四捨五入が問題になる事は無いんだけどね。
BGM♪: Mr Banker / Lynyrd Skynyrd
Microsoft Officeで言うと、Excelは基本的に四捨五入が行われますが、Accessでは銀行型の丸めが行われます。
仕事で本当にちゃんと作り込む人には、こうした仕様も押さえておかないと計算結果が正しく得られない原因となります。
気を付けないとね。
膨大な件数のデータ処理をする時に、ステータスバーに進捗度を表示するコードを書いていました。
ループ処理中に、処理済件数 / レコード件数を計算して、%で表示する的な処理です。
その最中に、フとある事を思いだしました。
レコード件数は、通常そんなにぴったりな件数じゃないから、割り算すると大抵端数(小数点以下)が出ます。
結果、出てくる小数点以下の桁数が一定じゃないから、大抵はこの桁揃えも処理してからステータスバーに表示する事になります。
いわゆる“丸め”(rounding)処理ですね。
こうしたプログラムに限らないで言うと、小数点以下の処理には、いろんな種類がありますね。
まず思いつくのが切り捨て、切り上げ、四捨五入。
中でも、一方的に切り上げたり切り下げたりしない四捨五入は、なんかフェアな印象というか、これにしとけばまぁそんなに間違いないと感覚的に思っていました。
でも実際のところ、対象の桁が0の時は、何もしないので、切り上げたり切り捨てたりする処理は、こんな事になりますね。
1、2、3、4 →切り捨て
5、6、7、8、9 →切り上げ
あれ? フェアじゃない。
0は切り捨て扱いと考えて、どちらも5つずつと考えるんでしょうか?
でも、四捨五入処理によって生じる誤差も考慮すると、0~9の発生頻度が等しいとするなら、
No. | 誤差 | 処理 |
0 | 0 | 切り捨て |
1 | 1 | 切り捨て |
2 | 2 | 切り捨て |
3 | 3 | 切り捨て |
4 | 4 | 切り捨て |
5 | 5 | 切り上げ |
6 | 4 | 切り上げ |
7 | 3 | 切り上げ |
8 | 2 | 切り上げ |
9 | 1 | 切り上げ |
アレ? やっぱりフェアじゃない。
最大の誤差を生み出す5が切り上げ側に判断されるという事は、誤差の大きさを考慮して考えると、10:15で切り上げが多くなってしまいます。
(丸める方向が違うから、発生頻度が同じなら相殺しあって0:5じゃないか?という話もある。)
この事を知らぬまま、大量の計算を繰り返していると、誤差がどんどん大きくなってしまいます。
こんな事は、もちろん昔から世間に広く知られていて、特定の業界では対策も取られています。
為替レートなど、小数点以下を生み出す計算を、猛烈に大量にこなす銀行では、単純な四捨五入ではなく、丸め対象の数字が5の時、結果が偶数になるように切り上げたり切り下げたりする、特殊な丸めを使ってい................るらしいよ。(本当かどうか、知らん。→で、現役銀行マンに尋ねてみたのですが、彼はローン・融資的な部署で、基本的に100円単位で切り下げという事でした。なので、結局分からず。)
これが銀行型丸め(Banker's Rounding)。
1.5→2
2.5→2
3.5→4
4.5→4
って感じです。(五捨五入という呼び方もあるらしい。)
まぁ、知ってる人も多いか。
とにかく、四捨五入がそれほどフェアで無いという事が、気になった訳です。
まぁあの....色々と計算した結果に触れる事も多いじゃないですか。
ほら、アレ......QBレートとか。
もしかして、四捨五入した結果、本当よりも多めにQBレートが計算される選手が割合的に多いとしたら...。
まぁ、実際にはQBレートの計算程度で、四捨五入が問題になる事は無いんだけどね。
BGM♪: Mr Banker / Lynyrd Skynyrd
Microsoft Officeで言うと、Excelは基本的に四捨五入が行われますが、Accessでは銀行型の丸めが行われます。
仕事で本当にちゃんと作り込む人には、こうした仕様も押さえておかないと計算結果が正しく得られない原因となります。
気を付けないとね。