端数処理

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

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

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

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

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

丸めの種類

代表的な丸め問題は

  • 分数近似
  • 周期的十進小数近似
  • 有理数を分子と分母が小さい分数に置き換えます。
  • 小数点以下の小数を桁数の少ない1つに置き換えます。
  • 10進整数をより多くの末尾のゼロを持つ整数に置き換えること、例えば23,217人を23,200人に置き換えること、または一般的には
  • 値を指定された量の倍数で置き換えます。

指定されたインクリメントへの丸め

丸めの最も一般的なタイプは、整数に丸めることであり、より一般的には、ある増分の整数倍数に丸めることです - 例えば、10分の1秒全体、1ドルの100分の1、1/2または1/8インチ全体の倍数、数十または数千全体などに丸めることです。

一般的に、数値 x を指定された増分 m の倍数に丸めるには、以下の手順が必要です。

  1. xをmで割った結果をyとします。
  2. y を整数値に丸めて q と呼びます。
  3. qmを乗算して、丸めた値zを求めます。

z = r o u n d ( x , m ) = r o u n d ( x / m )・・・m {displaystyle z=mathrm {round} (x,m)=mathrm {round} (x/m)・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・。 {\displaystyle z=\mathrm {round} (x,m)=\mathrm {round} (x/m)\cdot m\,}

例えば、x = 2.1784ドルを1セント単位に丸める(つまり、0.01の倍数に丸める)には、y = x/m = 2.1784/0.01 = 217.84を計算し、次にyを整数q = 218に丸め、最後にz = q×m = 218×0.01 = 2.18を計算する必要があります。

所定の有効桁数に丸めるときの増分mは、丸められる数字の大きさ(または丸められた結果の大きさ)に依存します。

増分mは通常、数字を表すのに使用されるどのような数字系でも有限小数です。人間に表示するためには、通常、10進数系(つまり、mは1/1000や25/100のように10のべき乗の整数倍)を意味します。デジタルコンピュータに格納されている中間値の場合は、2進数系(mは2の累乗の整数倍)を意味することが多い。

任意の実数から整数を返す抽象的な単一引数 "round()" 関数は、整数への丸めのセクションで示されているように、少なくとも十数個の明確な具体的な定義を持っています。抽象的な2引数"round()"関数はここで正式に定義されていますが、多くの場合、インクリメントに暗黙の値m = 1を指定して使用され、その後、同じ12個の明確な具体的定義を持つ同等の抽象的な単一引数関数に縮小されます。

整数への丸め

丸めの最も基本的な形式は、任意の数値を整数に置き換えることです。以下の丸めモードはすべて、前のセクションで紹介した抽象的な単一引数の "round()" 関数の具体的な実装です。

yを整数qに丸める方法はたくさんあります。

  • 下に丸める(または床を取る、またはマイナス無限大に向かって丸める):qはyを超えない最大の整数です。

q = f l l o o r ( y ) = 埋められているPs_230A糂汰 y ⌋ = - ⌈ - y 埋められているPs_2309A糂汰 {\displaystyle q=\mathrm {floor}.You're right\rheight\rrfloor =- {\displaystyle q=\mathrm {floor} (y)=\left\lfloor y\right\rfloor =-\left\lceil -y\right\rceil \,}

  • 丸め上げる(または天井を取る、またはプラス無限大に向かって丸める):qはyより小さくない最小の整数です。

q = c e i l ( y ) = ⌈ y "So_3039 SOE = - "So_303A"So_303A" - y ⌋ {\displaystyle q=\mathrm {ceil}.(y)E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:E:F} {\displaystyle q=\mathrm {ceil} (y)=\left\lceil y\right\rceil =-\left\lfloor -y\right\rfloor \,}

  • ゼロに向かって丸める切り捨てる、または無限大から遠ざける): q は y の整数部で、端数の桁を除いたものです。

 

  • y が整数であれば q は y であり、そうでなければ q は 0 に最も近い整数であり、y が 0 と q 間にあるような整数です。

 

  • 最寄に丸めます: q は y に最も近い整数です (同点突破のルールについては以下を参照してください)。

最初の4つの方法は有向丸めと呼ばれ、元の数yから丸められた値qへの変位は、すべて同じ限界値(0、+∞、または-∞)に向けられているか、または離れているので、この方法は有向丸めと呼ばれています。

y が正の場合、ラウンドダウンはラウンド-トウワード-ゼロと同じであり、ラウンドアップはラウンド-アウェイ-フロム-ゼロと同じです。y が負の場合は、丸め込みはゼロから遠ざかり、切り上げはゼロから遠ざかり、切り上げはゼロから遠ざかり、切り上げはゼロから遠ざかり、切り上げはゼロから遠ざかり、切り上げはゼロから遠ざかり、切り上げはゼロから遠ざかります。いずれにしても、yが整数の場合、qはyだけです。 これらの丸め方を以下の表に示します。

y


追い込み


総集編


ゼロに
向けて一周


ゼロ
からの円周回


最新鋭

+23.67

+23

+24

+23

+24

+24

+23.50

+23

+24

+23

+24

+2324

+23.35

+23

+24

+23

+24

+23

+23.00

+23

+23

+23

+23

+23

0

0

0

0

0

0

−23.00

−23

−23

−23

−23

−23

−23.35

−24

−23

−23

−24

−23

−23.50

−24

−23

−23

−24

-二三か二

−23.67

−24

−23

−23

−24

−24

多くの計算が順番に行われている場所では、丸め方法の選択は、結果に非常に重要な影響を与えることができます。有名な例としては、1982年にバンクーバー証券取引所によって設定された新しいインデックスがあります。株価は一般的に期間中に増加していたのに対し、それは当初1000.000で設定され、22ヶ月後には約520に低下していた。問題は、指数が毎日何千回も再計算され、常に小数点以下3桁まで切り捨てられ、四捨五入の誤差が蓄積されていたことに起因しています。より良い丸めで再計算すると、同じ期間の終わりに1098.892のインデックス値を与えた。

同点突破

yを最も近い整数に丸めるには、yが2つの整数の間でちょうど半分になる場合、つまりyの端数部分がちょうど0.5になる場合のために、いくつかのタイブレークルールが必要になります。

半分に丸める

ラウンドハーフアップ(またはプラス無限大に向かってラウンドハーフ)と呼ばれる次のようなタイブレークルールは、多くの分野で広く使われています。つまり、中途半端な値yは常に切り上げられます。

  • yの分数が正確に0.5であれば、q = y + 0.5となります。

q = 涙ぐましいPs_230Aceland Ps_230Aceland y + 0.5 ⌋ = - ⌈ - y - 0.5 涙ぐましいPs_2309 涙ぐましいPs_2309 涙ぐましいPs_2309 涙ぐましいPs_2309 涙ぐましいPs_2309 涙ぐましいPs_2309 涙ぐましいPs_2309 涙ぐましいPs_2309 涙ぐましいPs_2309 涙ぐましいPs_2309 涙ぐましいPs_2309 {\displaystyle q=\left\lfloor y+0.5\right\rfloor =-\left\lceil -y-0.5\right\rceil \,}

例えば、このルールでは、値23.5は24に丸められますが、-23.5は-23に丸められます。

これは、アメリカの小学校の数学の授業で一般的に教えられている2つのルールのうちの1つです。[]

0.5 の端数がなかった場合、四捨五入法によって導入される四捨五入誤差は非常に対称的なものになります:四捨五入されるすべての端数(例えば 0.268)に対して、同じ量だけ四捨五入される補数(すなわち 0.732)があります。ランダムな分数部分を持つ数の大きなセットを丸めるとき、これらの丸め誤差は統計的にお互いを補償し、丸められた数の期待値(平均値)は、元の数の期待値と同じになります。

しかし、ちょうど0.5の端数は常に切り上げられてしまうので、ラウンドハーフアップのタイブレークルールは対称ではありません。この非対称性は、ラウンドオフ誤差に正のバイアスを導入します。例えば、y の分数が 3 桁のランダムな 10 進数で構成されている場合、q の期待値は y の期待値よりも 0.0005 倍高くなります。このため、ラウンドハーフアップルールを用いたラウンドトゥニアレストは (曖昧に) 非対称丸めとしても知られています。

0.5で切り上げる理由の一つは、一桁の数字だけを調べる必要があるからです。例えば、17.5000000...を見たとき、最初の3つの数字、17.5は、その数字が18に切り上げられると判断します。逆のルールを使用した場合(半値下げ)、小数点以下の0桁をすべて調べて、その値が正確に17.5であるかどうかを判断する必要があります。

ラウンドハーフダウン

また、より一般的なラウンドハーフアップ(ラウンドハーフアップ法は一般的な慣例ですが、慣例に過ぎません)とは対照的に、ラウンドハーフダウン(またはマイナス無限大に向かってラウンドハーフ)を使用することもできます。

  • yの分数が正確に0.5であれば、q = y - 0.5となります。

 

例えば、23.5は23に四捨五入され、-23.5は-24に四捨五入されます。

ラウンドハーフダウンのタイブレークルールは、正確に0.5である分数は常に切り捨てられてしまうため、対称性がありません。この非対称性は、ラウンドオフ誤差に負のバイアスを導入します。例えば、y の端数が 3 桁のランダムな 10 進数で構成されている場合、q の期待値は y の期待値よりも 0.0005 低い値になります。この理由から、半値下げ丸めルールを用いた round-to-nearest は (曖昧に) 非対称丸めとしても知られています。

ゼロからの距離を半分にして丸める

一般的に教えられ、使用されている他の同点突破法は、ゼロから離れて丸い半分(または無限大に向かって丸い半分)、すなわちです。

  • yの分数が正確に0.5ならば、yが正ならばq = y + 0.5、yが負ならばq = y - 0.5となります。

 

例えば、23.5は24に四捨五入され、-23.5は-24に四捨五入されます。

この方法は、正の値と負の値を対称的に扱うので、元の数値が等確率で正または負の値であれば、全体的なバイアスはありません。しかし、この規則では、正の値には正のバイアスが、負の値には負のバイアスが導入されます。

補助的な精密桁数や金額の符号とは関係なく、最初の端数桁を考慮するだけで説明しやすいので、通貨換算や価格の丸め(最初に金額をユーロのセントなどの最小の有効細分化に変換する場合)によく使われます(金額を支払う側と受け取る側の厳密な等価性を求める場合)。

ゼロに向かって半分に丸める

また、より一般的なゼロから離れたラウンドハーフとは対照的に、ゼロに向かって半分を丸める(または無限大から半分を丸める)こともできます(ゼロから離れたラウンドハーフは一般的な慣例ですが、慣例に過ぎません)。

  • yの分数が正確に0.5ならば、yが正ならばq = y - 0.5、yが負ならばq = y + 0.5となります。

 

例えば、23.5は23に四捨五入され、-23.5は-23に四捨五入されます。

この方法はまた、正と負の値を対称に扱うので、元の数値が等しい確率で正または負の値であれば、全体的なバイアスはありません。しかし、この規則では、正の数値には負のバイアスが、負の数値には正のバイアスが導入されます。

半分を丸くして

さらに偏りの少ない同点突破ルールは、半分を丸めて偶数にすること、すなわち

  • yの分数を0.5とすると、qはyに最も近い数の整数となります。

したがって、例えば、+23.5は+24となり、+22.5は+22となり、-22.5は-22となり、-23.5は-24となる。

この方法はまた、正の値と負の値を対称的に扱うので、元の数値が等しい確率で正または負の値である場合には、全体的な偏りがありません。さらに、y値のほとんどの合理的な分布では、丸められた数値の期待値(平均値)は、たとえ後者がすべて正(またはすべて負)であったとしても、元の数値の期待値と本質的に同じです。しかし、この規則は、偶数(ゼロを含む)には依然として正のバイアスを導入し、奇数には負のバイアスを導入することになります。

round-to-nearest法のこの変形は、unbiased rounding(曖昧に、そして少し乱暴に)、収束丸め統計学者の丸めオランダの丸めガウス丸め、または銀行家の丸めとも呼ばれています。これは、簿記で広く使われています。

これは、IEEE 754 の計算関数および演算子で使用されるデフォルトの丸めモードです。

半分を奇数に丸める

ラウンドハーフからイーブンに非常に似ているもう一つの同点突破ルール、すなわち

  • yの分数を0.5とすると、qはyに最も近い奇数の整数となります。

したがって、例えば、+22.5が+23となり、+21.5が+21となり、-21.5が-21となり、-22.5が-23となる。

この方法はまた、正の値と負の値を対称的に扱うので、元の数値が等しい確率で正または負の値である場合には、全体的な偏りがありません。さらに、y値のほとんどの合理的な分布では、丸められた数値の期待値(平均値)は、たとえ後者がすべて正(またはすべて負)であったとしても、元の数値の期待値と本質的に同じです。しかし、この規則は、偶数(ゼロを含む)には依然として負のバイアスを導入し、奇数には正のバイアスを導入します。

このバリアントは、0.5 や -0.5 をゼロに丸めることを避けたい場合や、浮動小数点で表される数値のスケールを大きくすることを避けたい場合(スケーリング指数の範囲は限られています)を除き、ほとんどの計算では使用されません。実質的に、このモードは、可能な場合には範囲外の結果を避けて、タイ数の既存のスケールを維持することを好みます。

確率的な丸め

もう一つの偏りのないタイブレーク方法は、確率的な丸めです。

  • y の端数部分が 0.5 の場合、y + 0.5 と y - 0.5 の中から等確率で無作為に q を選ぶ。

round-half-to-evenと同様に、この規則は基本的に全体的な偏りがありませんが、偶数と奇数のq値の間でも公平です。一方で、結果にはランダムな要素が含まれます。同じデータに対して同じ計算を2回行うと、2つの異なる結果が得られることがあります。また、人間が(コンピュータや偶然の装置ではなく)どの方向に丸めるかを「ランダムに」決定している場合、無意識のバイアスがかかっている可能性があります。

交替制のタイブレーク

一つの方法として、多くの方法よりも曖昧なのは、半分ずつ交互に丸くすることです。

  • 端数部分が0.5の場合は、上に丸めたり下に丸めたりを交互に行います。

これは、0.5の端数部分の出現が効果的に番号を付けることができる場合、結果のランダム成分を抑制します。しかし、発生の総数が奇数である場合、最初の発生に割り当てられた丸めの方向に応じて、正または負のバイアスを導入することができます。

単純なディザリング

いくつかの文脈では、上記のすべての丸め方法が不満足な場合がある。例えば、y がオーディオ信号の正確な測定値であり、ストレージや伝送コストを削減するために整数 q に丸められているとします。y が時間とともにゆっくりと変化する場合、上記のどの丸め方法でも、q は長い間隔で±1 の突然のジャンプを挟んで完全に一定になります。 q 信号が再生されると、これらのステップは非常に不愉快なノイズとして聞こえ、2 つの整数値の間の元の信号の変動は完全に失われてしまいます。

この問題を避ける一つの方法は、各値yをその分数に等しい確率で上向きに丸め、その確率の補数で下向きに丸めることです。例えば、23.17という数字は、0.17の確率で24に丸められ、1 - 0.17 = 0.83の確率で23に丸められます。(これは y + s を四捨五入しているのと同じで、s は 0 と 1 の間に一様に分布する乱数です)。ディザリングとして知られているこの特別な丸めにより、突然のステップは、より不快ではないノイズに置き換えられ、元の信号の小さな変動もある程度保存されます。タイブレークに対する確率的アプローチのように、ディザリングにはバイアスがありません:すべての分数値が等しく可能性が高い場合、ある量だけ切り上げることは、同じ量だけ切り下げるのと同じくらい可能性が高いです。一方、ディザリングは結果にランダムな要素を導入しますが、これは確率的なタイブレークよりもはるかに大きなものです。

正確には、各ディザされた数のためのラウンドオフ誤差は、一様に分布するランダム変数になるだろう 平均値はゼロだが、標準偏差1 / 12 ≒ 0.2886 {displaystyle 1/{sqlrt {12}}}approx 0.2886}{\displaystyle 1/{\sqrt {12}}\approx 0.2886}これは、単純な予測法の標準偏差1/2よりは良いが、単純な確率論的手法よりはわずかに高い。しかし、n個の丸められた数字の和は、期待誤差0のランダム変数になるが、標準偏差n / 12のランダム変数になる {\displaystyle {\sqrt {n}}/{\sqrt {12}}}}。{\displaystyle {\sqrt {n}}/{\sqrt {12}}}(残りの雑音の合計)は半二次的に発散し、サンプルあたりのラウンドオフ誤差の標準偏差が1 / 12 n {displaystyle 1/12 n {displaystyle 1/{Sqrt {12n}}}{\displaystyle 1/{\sqrt {12n}}}となったとしても、容易に知覚できるようになるかもしれない。だから、このランダム分布は、多くのデータを丸めているいくつかのアプリケーションにとっては、まだ高すぎるかもしれない。

多次元ディザリング

単純なディザリング法のこの変形版では,依然として,その分数に等しい確率で値を丸めます.しかし,孤立したサンプルの丸めにランダム分布を使用する代わりに,各丸められたサンプルで発生する丸め誤差は,次の周囲の要素をサンプリングまたは計算するために合計されます;この累積値は,次に丸められるこれらの次のサンプリングまたは計算された値の値に追加されます.

この場合、n個の丸められた数値の合計は、期待される誤差がゼロであるが、一定の標準偏差が1 / 12の優れたランダムな変数になる{displaystyle 1/{sqrt {12}}}}。{\displaystyle 1/{\sqrt {12}}}そして、丸められたサンプルあたりの全体的な平均ラウンドオフ誤差偏差は、1 / ( n 12 ) {\displaystyle 1/(n{sqrt {12}})}となり{\displaystyle 1/(n{\sqrt {12}})}、これは、分離されたサンプルをディザリングするときの半双曲線的な収束よりも速く、双曲線的にゼロに収束するだろう。

実際には,サンプリングされたデータの大規模なセット(オーディオ,画像,ビデオのレンダリングなど)を丸める場合,丸め誤差の蓄積は,修正された値の単純な予測丸め(ゼロに向かって丸めるなど)と一緒に最も頻繁に使用されています(ゼロに向かって丸めるなど).このエンハンスメントは、画像およびオーディオ処理で頻繁に使用されます(特に、分離された値の単純な確率論的なディザリングでは、分離されたサンプルに適用された単純な非確率論的な丸め方法で発生するモアレ効果よりも悪い場合もありますが、それでも知覚可能なノイズが発生する可能性がある、正確な再スケーリングおよびアンチエイリアシング操作のために)。

蓄積されたラウンドオフ誤差の効果的な伝播は、ラウンドするためにサンプリングされたデータの離散次元に依存してもよい:カラー画像(カラー平面の離散次元を加える)、または3次元ビデオ(離散時間次元を加える)、またはポリフォニックオーディオデータ(時間およびチャネルの離散次元を用いる)を含む2次元画像をサンプリングする場合、この誤差を好ましい方向に、または2次元画像の場合は垂直対水平のような複数の直交する次元に等しく伝播させることが依然として好ましいかもしれない。二次元画像の場合は水平方向に、または同じ位置および/またはタイムスタンプで平行なカラーチャネルに、そして(知覚モデルによれば)これらの直交離散次元の他の特性に応じて。そのような場合には、複数のラウンドオフ誤差蓄積器が使用されてもよい(離散次元ごとに少なくとも1つ)、または蓄積器の(-1)次元ベクトル(または行列)が使用されてもよい。

これらのケースのいくつかでは、サンプルとラウンドするデータの離散次元は、非直交的に扱われてもよい。例えば、カラー画像を扱う場合、各物理的次元(高さ、幅、および任意で時間)の三色カラープレーンデータは、知覚的カラーモデルを使用してリマップされ、ラウンドオフエラーアキュムレータは、各直交カラープレーンに独立してエラーを伝播する代わりに、色相や彩度よりも高い確率で明度を維持するように設計されます。そして、立体音響オーディオデータにおいて、2つの丸められたデータチャネル(左および右)は、ゼロの周りのバランスのとれた方法で、残りのラウンドオフ誤差の大部分を吸収するそれらの有効差に優先して、それらの平均値を保持するために一緒に丸められてもよい。

単純分数への丸め

ある文脈では、与えられた数 x を「きちんとした」分数に丸めることが望ましい場合があります - すなわち、分子 m と分母 n が与えられた最大値を超えない最も近い分数 z = m/n です。この問題は、値を固定の10進数や2進数に丸めたり、与えられた単位mの倍数に丸めたりする問題とはかなり異なります。

目盛り付き丸め

このタイプの丸めは、対数スケールへの丸めとも呼ばれ、指定されたインクリメントへの丸めの変形ですが、結果のスケールと大きさに応じてインクリメントが変更されます。具体的には、有効数字の数を制限して、丸めて非有効数字を削除することを目的としています。このタイプの丸めは、限られた精度の浮動小数点値で計算された数値(IEEE-754のfloat型やdouble型など)で暗黙のうちに発生しますが、より一般的には、任意の有効桁数の正の実数と厳密に正の実数ベースを持つ任意の実数を丸めるために使用されることがあります。

例えば、工学グラフィックスでは可変ステップを持つ対数スケールのデータ(例えば波の長さなど)を表現するために使用したり、統計データでは指数関数的に伸びる幅の間隔内で実数のクラスを定義するために使用することができます(ただし、最も一般的な使用は10や2のような整数ベースでの使用です)。[出典?]

このタイプの丸めは、固定されたゼロではない実数のスケーリング係数s(最も頻繁に使用される場合、この係数はs=1です)と固定された正の基底b>1(必ずしも整数である必要はなく、スケーリング係数とは異なる場合が多いです)、およびその基底の有効桁数の固定された整数数n>0(これは丸めに使用する増分の値を決定し、丸められた数の計算された実効的なスケールと共に決定します)によって定義される対数スケールに基づいています。

第一引数の数(および結果として得られる丸められた数)は、最初に指数記法 x = s-a-m-bc で表現され、符号 s は +1 または -1 であり、絶対数 a は半開の正の区間 [1/b,1] に制限され、指数 c は任意の (正または負の) 整数です。この表現では、すべての有効数字は、整数部が常にゼロである絶対仮数の小数部にあります。

元の数(または丸められた数)が0の場合、絶対マンティッサaは0として定義され、指数cは任意の値に固定されます(ほとんどの規約では0ですが、いくつかの浮動小数点表現ではヌル絶対マンティッサを使用することはできませんが、指数cは数値0自体を表現するために特定の最大負の値を予約しています)。であり、符号sは-1か+1のどちらかを任意に選択することができます(単純なゼロの場合は一般的に+1に設定され、数値表現で正のゼロと負のゼロを区別できる場合は、最終的に同じ数値0を表現していても、丸められた値の引数と同じ符号に設定されます)。

x = a-s-bc のようなスケーリングされた指数表現も同様に使用でき、符号付きの仮数aはゼロに等しいか、2つの半開区間(-1,-1/b]と[+1/b,+1]のいずれかの範囲内にありますが、これは以下のアルゴリズムの場合になります。

このスケーリングされた丸めを計算するステップは、一般的には以下のようになります。

  1. xが0の場合は単純にxを返し、そうでない場合はxを返します。
  2. xを指数表現に変換する。
    x = a
    s b c {\displaystyle x=a\cdot s\cdot b^{c},},}. {\displaystyle x=a\cdot s\cdot b^{c}\,}
    1. x'をスケーリング係数sで割って、xの非スケーリング値とする。
      x ′ = x / s {displaystyle x'=x/s/s,} .
      {\displaystyle x'=x/s\,}
    2. スケーリング指数cを1+絶対値x'の基底b対数を整数に切り捨てて(マイナス無限大に向かって)
    3. 符号付きの仮面のaは、x'をbで割った積をcの乗にする。
      a = x ′
      b - c = x / s b - c {displaystyle a=x'\cdot b^{-c}=x/s/s {\displaystyle a=x'\cdot b^{-c}=x/s\cdot b^{-c}\,}
  3. この表現の丸められた値を計算します。
    1. c'をx'の初期スケーリング指数cとする。
      c ′ = c {displaystyle c'=c\,}
      {\displaystyle c'=c\,}
    2. mは、保持する有効数字の数に応じて、仮名のaを丸めるための増分である。
      m = b - n {displaystyle m=b^{-n},}
      {\displaystyle m=b^{-n}\,}
    3. a'は、この増分mと選択された丸め方で丸められた符号付きの仮名aである。
    4. a'の絶対値がbよりも低くない場合、nをデクリメントし(増分mbを乗算)、スケーリング指数c'を増分し、符号付き仮数aをbで除算し、同じ式で新しい符号付き仮数aのa'への丸め込みを再開します; このステップは、abtractの"round()"関数が常にaを0に向かって丸めている場合(すなわち、単純な切り捨ての場合)にのみ避けることができます。このステップは、abtractの"round()"関数が常にaを0に向かって丸めている場合(すなわち、単純な切り捨てである場合)だけ避けられますが、aを無限大に向かって丸めている場合には必要です。
  4. 丸めた値を返します。
    y = s c a l e d r o u n d ( x , s , b , n ) = a
    ′ ⋅ s b c ′ = r o u n d ( x / s b n - c ′ )⋅ s b c ′ - n {displaystyle y=mathrm {scaledround} (x.s,b,n)=a'\cdot s\cdot b^{c'}=mathrm {round} (x/s\cdot b^{n-c'}) .{\displaystyle y=\mathrm {scaledround} (x,s,b,n)=a'\cdot s\cdot b^{c'}=\mathrm {round} (x/s\cdot b^{n-c'})\cdot s\cdot b^{c'-n}\,}

抽象的な "round()" 関数では、このタイプの丸めは、次のセクションでより完全に説明されている整数への丸めモードのいずれかを使用することができますが、最も頻繁に最も近いモードへの丸めが行われます (後述のタイブレークルールもより完全に説明されています)。

例えば

  • 1.234のスケーリングされた丸めで、10進数でスケーリング係数1、有効数字3桁(最大相対精度=1/1000)を使用して、任意の丸め使用して最寄りモードに丸めた場合、1.23を返します。
  • 1.236の同様のスケールの丸めは1.24を返します。
  • 21.236の同様の縮尺丸めは21.2を返します。
  • 321.236 の類似のスケール丸めは 321 を返します。
  • ラウンドダウンモードを使用している場合、ベース10と有効数字3桁(最大相対精度=1/1000)のスケーリングファクター1の1.234のスケーリングされた丸めは、1.23を返します。
  • 1.236 の同様のスケール丸めも 1.23 を返します。
  • 3π / 7 ≈ 6.8571 ≒ 6.8571 〃 π 2 - 4 {displaystyle ぞくぞくと丸められた 3π / 7 ≒ 6.8571 〃 2 - 4 {displaystyle ぞくぞくと丸められた 3π / 7 〃 6.8571cdot pi \cdot 2^{-4}} {\displaystyle \scriptstyle 3\pi /7\;\approx \;6.8571\cdot \pi \cdot 2^{-4}}with scaling factor πをベース2と有効数字3桁(最大相対精度=1/8)にすると{\displaystyle \scriptstyle \pi }、ラウンドダウンモードの時には、π2・4=3π/8 {displaystyle \cdot pi \cdot 2^{-4}; =\;3\pi /8} .{\displaystyle \scriptstyle 6\cdot \pi \cdot 2^{-4}\;=\;3\pi /8}
  •  
  • similar scaled rounding of π / 7 ≈ 4.5714 ≒ 4.5714 "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "So_303E" "{\displaystyle \scriptstyle \pi /7\;\approx \;4.5714\cdot \pi \cdot 2^{-5}}LoHan Machinery Co.
  • similar scaled rounding of π / 8 = 4 ⋅π ⋅ 2 - 5 {displaystyle \scriptstyle \pi /8;=\;4\cdot \pi \cdot 2^{-5}} {\displaystyle \scriptstyle \pi /8\;=\;4\cdot \pi \cdot 2^{-5}}will also return 4 π ⋅π 2 - 5 = π / 8 {displaystyle \scriptstyle 4\cdot \pi \cdot 2^{-5};=\;2 ⋅π /8} .{\displaystyle \scriptstyle 4\cdot \pi \cdot 2^{-5}\;=\;\pi /8}
  • {\displaystyle \scriptstyle 4\cdot \pi \cdot 2^{-6}\;=\;\pi /16}.

利用可能な値に丸める

完成品の製材、筆記用具、コンデンサなどは、通常、数種類の規格サイズしか販売されていません。

多くの設計手順では、近似値を計算する方法を記述し、「最も近い基準値に丸める」、「最も近い基準値に丸める」、「最も近い基準値に丸める」、「最も近い基準値に丸める」などの表現を使用して、ある程度の標準的なサイズに「丸める」方法を説明しています。

好ましい値のセットが対数スケールで等間隔である場合、任意の値に最も近い好ましい値を選択することは、一種の尺度付き丸めとして見ることができます。そのような「丸められた」値は、直接計算することができます。

浮動小数点丸め

浮動小数点演算では、丸めは、与えられた値xを指定された有効桁数の値zに変えることを目的としています。言い換えれば、z は z の大きさに依存する数 m の倍数でなければなりません。数 m は浮動小数点型の基底の累乗(通常は 2 または 10)です。

この詳細とは別に、上で説明した丸めのすべてのバリエーションは、浮動小数点数の丸めにも適用されます。このような丸めのアルゴリズムは、上記のスケーリング丸めのセクションで紹介していますが、一定のスケーリング係数 s=1、整数の基底値 b>1 を用いています。

丸められた結果がオーバーフローするような結果については、有向丸めの結果は、丸めの方向に応じて、適切な符号付き無限大か、または最も高い表現可能な正の有限数(x が負の場合は最も低い表現可能な負の有限数)のいずれかになります。偶数への丸めの通常の場合のオーバーフローの結果は、常に適切な無限大となります。

さらに、丸められた結果がアンダーフローしてしまう場合、すなわち指数が最小の表現可能な整数値を超える場合、有効な結果は、ゼロ(表現がゼロの符号の区別を維持できる場合は符号付きの可能性があります)か、最小の表現可能な正の有限数(または、xが負の場合は最大の表現可能な負の有限数)、場合によっては非正規の正または負の数(仮に仮数がすべての有効桁を格納している場合)のいずれかになります。この場合、丸めの方向によっては、最上位の桁をゼロに設定しても最上位の桁は下位に格納され、この格納された仮数は最上位の桁を落とすことはありません(ベース b=2 の場合、最上位の桁は常に 1 であるため)。偶数への丸めの通常の場合のアンダーフローの結果は、常に適切なゼロになります。

二重丸め

数値を異なる精度に連続して2回丸めても、後者の精度の方が粗い場合は、指示丸めの場合を除いて、最終的な精度に1回丸めた場合と同じ結果になることは保証されません。例えば、9.46を10進数で1つに丸めると9.5、偶数への半値丸めを使って整数に丸めると10になりますが、直接整数に丸めた場合は9になります。

いくつかのコンピュータ言語とIEEE 754-2008規格では、簡単な計算では結果を二重に丸めてはいけないと規定されています。これは、異なるマシン上で同じように動作するように設計されているため、Javaでは特に問題となっていましたが、x87浮動小数点でこれを実現するためには、特別なプログラミングのトリックを使用しなければなりませんでした。Java言語は、違いが重要でない場合には異なる結果を許容し、結果が正確に適合しなければならない場合には"strictfp"修飾子を使用することを要求するように変更されました。

丸め算による正確な計算

丸め算を使って、離散的な領域と範囲を持つ関数の正確な値を評価することができます。例えば、整数 n が完全な二乗であることがわかっている場合、n 浮動小数点値 x に変換し、浮動小数点で x の近似平方根 y を計算し、y を最も近い整数 q に丸めて平方根を計算することができます。 n があまり大きくなければ、y の浮動小数点の丸め誤差は 0.5 以下になるので、丸められた値 qn の正確な平方根になります。

テーブルメーカーのジレンマ

ウィリアム・カハンは、超越的な関数の丸めの未知のコストのために、「テーブルメーカーのジレンマ」という言葉を造語しました。

"2つの浮動小数点引数ごとに正しく丸められたy^wを計算するのにどれだけのコストがかかるかは誰にもわかりません。代わりに、評判の良い数学ライブラリでは、基本的な超越関数はほとんどが 1/2 ulp を少し超えた範囲内で、ほぼ常に 1 ulp 以内で計算されています。なぜY^WはSQRTのように1/2 ulp以内に丸められないのでしょうか?それがどれだけの計算量になるか誰も知らないからです...。超越的な式を計算し、事前に割り当てられた桁数に正しく丸めるために、どれだけの余分な桁数を運ばなければならないかを予測する一般的な方法は存在しません。有限の余分な桁数が最終的には十分であるという事実(もし本当ならば)さえも、深い定理かもしれません。"

IEEE浮動小数点標準は、加算、減算、乗算、除算、平方根、浮動小数点剰余が、無限精度演算の正確な丸められた結果を与えることを保証しています。しかし、より複雑な関数についてはそのような保証はなく、一般的にはせいぜい最後のビットの範囲内でしか正確な結果が得られません。

Gelfond-Schneider定理とLindemann-Weierstrass定理を用いて、標準的な初等関数の多くは、有理な非ゼロ引数が与えられたときに超越的な結果を返すことが証明できます。しかし、正しく丸められた結果が保証される前に、どのくらい正確な結果を計算する必要があるかについて、ある精度の限界を決定することは、多くの計算時間を必要とするかもしれません。

現在、完全な精度を提供するパッケージがいくつか存在します。MPFRパッケージは、正しく丸められた任意の精度の結果を提供します。IBMは高速で正確なIEEE素関数のためのパッケージを書いており、将来的には標準ライブラリがそのような精度を提供するかもしれません。

いくら桁数を計算しても正しく丸めることができないような、よく定義された計算可能な数を考案することは可能です。例えば,ゴールドバッハの推測が真だが証明できない場合,0.5 + 10-n(nは4より大きい偶数で2つの素数の和ではない最初の偶数で,そのような数がない場合は0.5)を正確に四捨五入することは不可能です.しかし,これは,たとえその推測が証明不可能であっても,任意の精度に近似することができます.

歴史

丸めの概念は非常に古く、おそらく除算の概念よりも古いものです。メソポタミアで発見されたいくつかの古代の粘土のタブレットには、逆数の丸められた値と60の基底の平方根を持つ表が含まれています。π、年の長さ、月の長さへの丸められた近似値もまた古代のものです。

ラウンド・トゥ・イーブン法は、1940年以来、ASTM(E-29)の標準となっています。unbiased roundingstatistician's roundingという用語の由来は、かなりわかりやすいものです。1906年の第4版『確率とエラーの理論』の中で、ロバート・シンプソン・ウッドワードはこれを「コンピュータのルール」と呼び、それが数学の表を計算する人間のコンピュータによって当時一般的に使用されていたことを示しています。チャーチル・アイゼンハートの1947年の論文"Effects of Rounding or Grouping Data" (in Selected Techniques of Statistical Analysis, McGrawHill, 1947, Eisenhart, Hastay, and Wallis, editors)は、データ分析において、この慣習がすでに"十分に確立されていた"ことを示しています。

銀行員の丸め」という言葉の由来は、まだ不明瞭なままです。もしこの丸め方が銀行で標準的に行われていたとしたら、その証拠を見つけるのは非常に困難である。それどころか、欧州委員会の報告書「The Introduction of the Euro and the Rounding of Currency Amount(ユーロの導入と通貨額の丸め)」の第2章では、銀行では丸めの標準的な方法がそれまで存在しなかったことを示唆しており、「中途半端な」金額は切り上げられるべきであると規定している。

1980年代まで、浮動小数点コンピュータの演算に使用される丸め方は、通常、ハードウェアによって固定されており、文書化されておらず、一貫性がなく、コンピュータのブランドやモデルごとに異なっていました。この状況は、IEEE 754浮動小数点規格がほとんどのコンピュータメーカーで採用されるようになってから変わりました。この規格では、ユーザーはいくつかの丸めモードの中から選択することができ、それぞれのケースで結果がどのように丸められるかを正確に指定することができます。これらの機能により、数値計算がより予測しやすく、機械に依存しないものになり、区間演算の効率的で一貫性のある実装が可能になりました。

プログラミング言語の丸め関数

ほとんどのプログラミング言語は、さまざまな方法で小数を丸めるための関数や特別な構文を提供しています。FORTRANやCなどの初期の数値言語は、通常は切り捨て(ゼロに向かって)という1つの方法しか提供していません。このデフォルトの方法は、整数変数に小数を代入するときや、配列のインデックスとして小数を使用するときなど、特定の文脈で暗示される可能性があります。その他の種類の丸めは、明示的にプログラムしなければなりません。例えば、正の数を最も近い整数に丸めるには、0.5を足して切り捨てることで実装できます。

しかし、過去数十年の間に、ほとんどの言語の構文および/または標準ライブラリは、一般的に少なくとも4つの基本的な丸め関数(上/天井、下/床、最近接、およびゼロに向かって)を提供してきました。タイブレークの方法は、言語やバージョンによって異なる場合があり、プログラマが選択できる場合もあります。いくつかの言語では、IEEE-754の浮動小数点規格に倣って、これらの関数を倍精度の浮動小数点の引数を取り、同じ型の結果を返すように定義しています。IEEEの倍精度フォーマットは52ビットの分数ビットを持っているので、このアプローチは32ビットの整数を持つ言語でのスプリアスオーバーフローを避けることができるかもしれません。PHP のような言語の中には、値を指定した小数点以下の桁数に丸める関数を提供しているものもあります(例えば 4321.5678 から 4321.57 や 4300 など)。さらに、多くの言語では、「printf」などの文字列書式設定関数を提供しており、これを使用することで、ユーザーが指定した小数点以下の桁数(精度)に丸めて、小数の数値を文字列に変換することができます。一方、切り捨て(ゼロに丸める)は、今でも多くの言語で使われているデフォルトの丸め方法であり、特に2つの整数値の除算に使われています。

反対に、CSSとSVGは、数値と測定値に対して特定の最大精度を定義しておらず、それらは、無限の精度を持つかのように、Document Object ModelとInterface-description言語のインターフェイスで文字列として扱われ、公開され、整数と浮動小数点値を区別しません。

その他の丸め基準

一部の分野や機関では、丸めの基準や指示が出されています。

アメリカの気象観測

66年半ばに発行されたガイドラインでは、米国連邦気象調整官事務所は、気象データは「半分に丸める」というタイブレークルールで、最も近い丸い数字に丸めるべきであると決定しました。例えば、整数に四捨五入した1.5は2になり、-1.5は-1になります。それ以前のタイブレークルールは「ゼロから半分に丸める」でした。

気象学のネガティブゼロ

気象学者の中には、0.0度から-0.5度(排他的)の間の温度を整数に丸めたものを示すために「-0」と書く人もいます。この表記は、負の符号が重要であると考えられる場合に使用されます; 例えば、摂氏温度を四捨五入するときに、零度以下は凍結を示します。[]

関連ページ

質問と回答

Q:「丸め」とはどういう意味ですか?


A:丸めとは、ある数値を、ほぼ等しいが、より短く、より単純で、より明確な形を持つ別の数値に置き換えることです。

Q:四捨五入の例を教えてください。
A:四捨五入の例としては、23.74米ドルを24米ドルに丸めたり、312/937の分数を1/3に丸めたり、2 { {displaystyle {sqrt {2}}} 式を1.41に丸めることがあります。

Q:なぜ数字を丸めるのですか?


A:数字を丸めるのは、元の値より書きやすく、扱いやすい値を得るためです。また、計算された数値の精度を示すために行われることもあります。

Q:四捨五入の潜在的な問題点は何ですか?


A:丸めは結果として多少の丸め誤差を生じさせますし、場合によっては、計算の過程で誤差が蓄積され、結果を無意味なものにしてしまうこともあり得ます。また、超越数学関数の丸めについては、切り上げか切り下げかを判断するために何桁余分に計算する必要があるのかが事前に分からないため、正確な丸めが困難な場合があります。

Q:丸めと量子化との関係は?


A:丸めは、物理量を数値やデジタル信号で表現する量子化と類似しています。

AlegsaOnline.com - 2020 / 2023 - License CC3