ブログ - JIS丸め
25年くらい前,C言語の入門期に,仕事で多倍長演算ライブラリを作った.そのライブラリはとある経理システム向けに作ったのだけれど,その時のシステムの派生系が,子会社でまだ動いていると聞いてびっくりした.
当時,32bitコンピュータだったのだけれど,long型で表現できるのは符号付で-2,147,483,648 ~ 2,147,483,647の範囲.表現できるのが20億.その会社,当時はわからないけれど,合併前は資本金2,337億円,売上9,555億円だったので普通に桁が足りない.COBOLなら簡単なのに.
それでC言語だと多倍長演算ライブラリが必要になってくる.最初はビット配列を作っていたけれど,不動小数点演算で行き詰まって最終的にstr型の配列を作って値をセットして桁があがるとか下がるとかずっとモヤモヤして四則演算をずっと考えていた数ヶ月.いまでも割り算はもっと効率的にできたのでは?なんて思うこともあるのだけれど,そんなクソ実装で,どうにか完成させた.
最初に利用したシステムが保有株を計算するシステムで,昨年の実績データとの引き合わせで,最終的に1円違った.多かったのか少なかったのかは忘れたけれど,その1円の原因が小数点8桁目の四捨五入の処理.
その時の先輩が「経理の場合は数処理は切り捨てだろう」とさも当たり前のように即答していた.インターネットがまだ普及してない時代.当時も簿記3級を保有していたけれど知らなかったんだが,今の自分なら,毎年の青色申告で「100円未満切り捨て」とか普通にあるので迷うことはないな.
それでやっと本題.
経理的には切り捨てしているけれど,日本工業規格のJIS 8401に「数値の丸め方」というのが定義されている.これはISO 31-0をベースにしているそうだ.それでなんと2つルールがある.
規則A
端数が0.5より小さい場合切り捨て.0.5より大きい場合切り上げ.
端数が0.5丁度なら,偶数になる方へ丸める.
規則B
四捨五入.
これまでの私の人生で,12.25を小数点第1位で丸めると,12.3になるのだと思っていたけれど,これは規則Bにあたる.規則Aだと12.2だ.
普通の計算機だと規則Bなのだけれど,じゃぁなぜ規則Aが存在するのかというと,丸め処理による誤差が最小になるからだそうです.ここが理解できん...規則Bだと元の数値に0.5を足して切り捨てすれば得られるので計算ロジックは楽ですね.
ほんとかどうか知らないけれど,四捨五入を確率で示していることがあって,次の通り.
四捨は4要素,五入の方が5要素なので繰り上がる率が高いらしい.ほんとか?そうなのか?
まだ,頭の中で理解できてないな...幼少の頃から「そういうもんだ」と頭にインプットした知識は,裏付けがないので説明できない...
それで世の中のシステムでは,要件定義で丸め規則を決めているのかパラメータ私にしているのかどうなのかなぁ.
当時,32bitコンピュータだったのだけれど,long型で表現できるのは符号付で-2,147,483,648 ~ 2,147,483,647の範囲.表現できるのが20億.その会社,当時はわからないけれど,合併前は資本金2,337億円,売上9,555億円だったので普通に桁が足りない.COBOLなら簡単なのに.
それでC言語だと多倍長演算ライブラリが必要になってくる.最初はビット配列を作っていたけれど,不動小数点演算で行き詰まって最終的にstr型の配列を作って値をセットして桁があがるとか下がるとかずっとモヤモヤして四則演算をずっと考えていた数ヶ月.いまでも割り算はもっと効率的にできたのでは?なんて思うこともあるのだけれど,そんなクソ実装で,どうにか完成させた.
最初に利用したシステムが保有株を計算するシステムで,昨年の実績データとの引き合わせで,最終的に1円違った.多かったのか少なかったのかは忘れたけれど,その1円の原因が小数点8桁目の四捨五入の処理.
その時の先輩が「経理の場合は数処理は切り捨てだろう」とさも当たり前のように即答していた.インターネットがまだ普及してない時代.当時も簿記3級を保有していたけれど知らなかったんだが,今の自分なら,毎年の青色申告で「100円未満切り捨て」とか普通にあるので迷うことはないな.
それでやっと本題.
経理的には切り捨てしているけれど,日本工業規格のJIS 8401に「数値の丸め方」というのが定義されている.これはISO 31-0をベースにしているそうだ.それでなんと2つルールがある.
規則A
端数が0.5より小さい場合切り捨て.0.5より大きい場合切り上げ.
端数が0.5丁度なら,偶数になる方へ丸める.
規則B
四捨五入.
これまでの私の人生で,12.25を小数点第1位で丸めると,12.3になるのだと思っていたけれど,これは規則Bにあたる.規則Aだと12.2だ.
普通の計算機だと規則Bなのだけれど,じゃぁなぜ規則Aが存在するのかというと,丸め処理による誤差が最小になるからだそうです.ここが理解できん...規則Bだと元の数値に0.5を足して切り捨てすれば得られるので計算ロジックは楽ですね.
ほんとかどうか知らないけれど,四捨五入を確率で示していることがあって,次の通り.
1 2 3 4
5 6 7 8 9
まだ,頭の中で理解できてないな...幼少の頃から「そういうもんだ」と頭にインプットした知識は,裏付けがないので説明できない...
それで世の中のシステムでは,要件定義で丸め規則を決めているのかパラメータ私にしているのかどうなのかなぁ.