数値の「丸め」という言葉は、数値を、ほぼ等しいが、より短く、より単純な、またはより明示的な形を持つ別の値に置き換えることを意味する。例えば、US$23.74はUS$24に丸めることができ、又は、分数312/937は1/3に丸めることができ、又は、式2 {\displaystyle {\sqrt {2}}}{\displaystyle {\sqrt {2}}} as 1.41。

丸めは、元の値よりも書きやすく、扱いやすい値を得るために行われることが多いです。これは、計算された数値の精度を示すためにも行われます。例えば、123,456として計算されたが、数百単位以内の精度であることが知られている量は、"約123,500"と表現する方が良いでしょう。

一方で、丸めは結果に丸め誤差をもたらす可能性があります。丸めは多くの計算でほとんど避けられません。特に、整数演算や固定小数点演算で2つの数値を割るとき、平方根、対数、サインなどの数学関数を計算するとき、または有効桁数が固定された浮動小数点表現を使用するときなどに、丸め誤差が発生することがあります。一連計算の中で、これらの丸め誤差は一般的に蓄積され、特定の「条件の悪い」ケースでは、結果を無意味なものにしてしまうことがあります。

超越的な数学関数の正確な丸めは、切り上げか切り下げかを解決するために計算しなければならない余分な桁数が事前にわからないので難しい。この問題は「テーブルメーカーのジレンマ」と呼ばれています(後述)。

丸めは、物理量を数字やデジタル信号で符号化しなければならないときに発生する量子化と多くの類似点があります。

丸めの定義(簡潔なまとめ)

丸めとは、元の実数値や理論上の精密な値を、利用可能な表現(桁数やビット幅で制約された形式)に近い代表値へ置き換える操作です。丸めの目的は主に次のとおりです:

  • 表現を簡潔にする(例:表示や記録のため)
  • 計算資源の節約(有限のメモリや演算精度に合わせる)
  • 測定の不確かさや有効桁数を反映する

丸めの代表的な種類

丸めにはいくつかの方法があり、選び方によって誤差の性質(偏りや分散)が変わります。代表的なものを挙げます:

  • 切り捨て(round toward zero):符号に関係なく小さいほうへ切り捨てる。整数除算などで一般的。
  • 切り上げ(ceil)・切り下げ(floor):常に上または下へ丸める。用途が限定的だが単純。
  • 四捨五入(round half away from zero):0.5以上なら上へ、それ未満なら下へ。日常的な“丸め”のイメージ。
  • 偶数丸め(round to nearest, ties to even):最も一般的な浮動小数点の規則(IEEE 754のデフォルト)。最も近い表現へ丸め、ちょうど中間(tie)のときは最下位ビットが偶数になる方へ丸めて系統的な偏りを減らす。
  • 確率的(確率丸め、stochastic rounding):中間値は確率的に上か下へ丸める。特に機械学習などで誤差が蓄積する場合に有用なことがある。

丸め誤差の性質と問題点

丸めによる誤差(丸め誤差)は次のような特徴を持ちます:

  • 個々の丸め誤差は通常小さいが、繰り返し計算や大規模な合計で蓄積して有意な誤差になる。
  • 順序依存性:加算などの操作順序を変えると結果が変わる(非結合性)。
  • 打ち消し(catastrophic cancellation):ほぼ同じ大きさの数を引き算すると、有効な桁数が失われて誤差が相対的に大きくなる。
  • バイアス(偏り):常に切り捨てるなど偏った丸めは平均的に誤差が一方向に偏ることがある。

浮動小数点と丸め(IEEE 754)

実装面では、特に浮動小数点表現が広く使われます。IEEE 754標準は一般に次のような丸めモードを定義しています:

  • round to nearest, ties to even(最も近い値、端数は偶数へ)
  • round toward zero(ゼロ方向へ丸め)
  • round toward +∞(常に上へ)
  • round toward −∞(常に下へ)

IEEE 754のデフォルトである「最近接、タイは偶数へ」は、長期的な偏りを小さくする利点があります。また、丸め誤差は通常「1/2 ulp(unit in the last place)」以下に抑えられることが示せますが、演算の組合せによっては誤差が累積することに注意が必要です。

テーブルメーカーのジレンマ(Table Maker's Dilemma)

超越関数(例:sin、exp、logなど)を正確に丸めるとき、ある入力について丸めをどちらにするべきか(切り上げか切り下げか)を決定するには、関数の値の真の値と丸め境界との比較を行う必要があります。しかし、真の値を丸め境界以下の差で評価するためには、追加の桁あるいは高精度での評価が必要となり、どの程度の余分な桁が必要か事前に分からないことがあります。これが「テーブルメーカーのジレンマ」で、正確な丸め(correct rounding)が難しい理由です。

丸め誤差への対策と実務上のベストプラクティス

  • 精度を上げる:必要に応じて高精度(多倍長)演算を用いて中間誤差を抑える。任意精度ライブラリやlong doubleなど。
  • 丸めは最後に行う:中間結果での不要な丸めを避け、最終表示や保存の直前だけで丸めする。
  • 数値安定性の良いアルゴリズムを選ぶ:Kahanの補正和(Kahan summation)など誤差を制御する手法を用いる。
  • 順序を工夫する:合計する項を大きさ順に合わせるなど、誤差が小さくなる順序で計算する。
  • 誤差評価を行う:数値解析的に誤差の上界を見積もる、あるいは区間演算で保証を得る。
  • 適切な表現を選ぶ:金融計算では10進固定小数点やdecimal型を使い、二進丸めによる不都合を避ける。
  • 確定的な丸め規則を明示する:仕様でどの丸めモードを使うかを明確にして、実装間での違いを回避する。
  • ライブラリを活用:正確な丸めが必要な場合は、正しく丸められた数学関数を提供するライブラリ(例:CR-LIBMのような取り組み)を使う。

まとめ

丸めは有限の表現で計算や表示を行ううえで不可避な操作であり、利便性と誤差というトレードオフを伴います。丸めの方式によって誤差の性質(偏りや分散)は異なるため、用途に応じて適切な丸め方法と数値的手法を選ぶことが重要です。特に浮動小数点演算ではIEEE 754の丸めモードの理解、安定なアルゴリズムの採用、誤差の評価と管理が不可欠です。