端数処理
出典: フリー百科事典『ウィキペディア(Wikipedia)』
端数処理(はすうしょり)とは、様々な計算において現れる端数が不要である場合、あるいは計算の妨げとなる端数を制御する必要がある場合などに、その端数を取り除くために行う様々な定量的処理のことである。 丸めとも呼ばれる。
目次 |
[編集] 処理方法
先に、以下の説明は正の数に対するものだと断っておく。負の数の場合については諸説あるようである。これは負の数に対する余りの扱いと同根な問題で、数直線上の位置の移動法として見るか、符号ビットを除いて数値を扱うかといった各々の立場において、それぞれの理に適った捉え方ができることに由来する。
[編集] 四捨五入・五捨六入
有効数字を n 桁とするときに、n + 1 桁目が 4 以下ならば「切り捨て」、5 以上ならば「切り上げ」によって概数を得る端数処理を四捨五入という。
同様に有効数字を n 桁とするときに、n + 1 桁目が 5 以下ならば「切り捨て」、6 以上ならば「切り上げ」によって概数を得る端数処理を五捨六入という。
複数の数値を端数処理する状況では、全てに四捨五入のみ(あるいは五捨六入のみ)を適用する場合が普通であるが、コンピュータのように有限桁の小数しか扱えない状況では、厳密に考えると平均的に値が小さく(あるいは大きく)なってしまうため、プロセッサによっては、四捨五入と五捨六入を均等に使い分け、誤差を小さくする工夫がなされているものがある。
[編集] 偶数への丸め
偶数への丸め(より正確には最近接偶数への丸め)とは、有効数字を n 桁にするとき n + 1 桁目を、「5より小さい場合切捨て」・「5より大きい場合切り上げ」、「5 の場合 n 桁目を最も近い偶数」とする処理を意味する。
「四捨五入」・「五捨六入」と比べて、 丸めと演算を交互に何度も繰り返したときの誤差の蓄積が小さい利点があり、浮動小数演算などで利用される。
日本工業規格の計測用語としての「丸め」は、この偶数への丸めのことであり、俗に「JIS丸め」とも呼ばれる。 また俗称だが、5が切り捨てられたり切り上げられたりするので「五捨五入」と呼ばれたり、偶数の上が切り捨てられ奇数の上が切り上げられるので「偶捨奇入」と呼ばれたりもする。
[編集] 例
以下の数値を上であげたような端数処理により有効数字 2 桁にする場合を考える。
もとの数値 | 切り捨て | 切り上げ | 四捨五入 | 五捨六入 | 丸め |
---|---|---|---|---|---|
8.05 | 8.0 | 8.1 | 8.1 | 8.0 | 8.0 |
8.15 | 8.1 | 8.2 | 8.2 | 8.1 | 8.2 |
8.25 | 8.2 | 8.3 | 8.3 | 8.2 | 8.2 |
8.26 | 8.2 | 8.3 | 8.3 | 8.3 | 8.3 |
8.34 | 8.3 | 8.4 | 8.3 | 8.3 | 8.3 |
8.35 | 8.3 | 8.4 | 8.4 | 8.3 | 8.4 |
8.45 | 8.4 | 8.5 | 8.5 | 8.4 | 8.4 |
[編集] 整数化を行う計算機の関数
桁を必要に応じて移動させることにより、端数の処理はしばしば数値の整数化と考えることができる。ここではそのような関数(いくつかは数学で用いられる関数の実装だが、多くは表計算ソフト等のある種のコンピュータアプリケーションにおいて実装されている端数処理専用の関数)をあげる。なお、同様の関数が多くの別名を持つであろう事は想像に難くない。あるいは同じ名前の関数がソフトによって扱いが異なる場合がありうるので注意をすることが肝要である。(そのような事態についてご存知の方は加筆・修正して下さるとありがたい。)
[編集] 切り捨て
多くのコンピュータ言語(ないしそのライブラリ)でサポートされているfloor関数は床関数の実装であり、実数(浮動小数点)から整数への切り捨てを行なう。
また、浮動小数点を整数にキャストしても切り捨てを行なうことができる。
[編集] 切り上げ
多くのコンピュータ言語(ないしそのライブラリ)でサポートされているceil関数は天井関数の実装であり、実数(浮動小数点)から整数への切り上げを行なう。
[編集] 切り落とし関数
実数 x に対し、小数点以下の全ての数字を無視した場合の整数を得る関数を truncate関数と呼ぶ。
正の数に対しては、「切捨て」となり床関数と同様であるが、負の実数の場合に挙動が異なる。
[編集] round関数には注意が必要
roundという名前の関数の挙動は、コンピュータ言語やライブラリによって動作が異なる場合が多いので、仕様書を読むなどして特に注意して使う必要がある。 一般的にはroundは四捨五入か偶数への丸めを意味することが多い。
[編集] 例
±3.7 を整数化する場合を考えよう。
- ceil(3.7) = 4, ceil(-3.7) = -3
- floor(3.7) = 3, floor(-3.7) = -4
- truncate(3.7) = 3, truncate(-3.7) = -3