1. 序章

コンピュータのメモリには有限の容量があります。 ただし、の実数は、一般に、有限の均一な表現を持ちません。 たとえば、有理数を10進値として表すことを検討してください。そうです–正確にそうすることは不可能です! コンピュータのメモリに格納できる桁数は有限であるため、コンピュータで表現する場合は、実数を何らかの方法で概算する必要があります(丸めまたは切り捨て)。

このチュートリアルでは、実際の数値計算を行う際の浮動小数点表現の基本的な考え方を確認し、浮動小数点の精度の限界を学びます。

2. 丸めと切り刻み

実数を指定された小数点以下の桁数に丸めるには、2つの区別できる方法があります。

チョッピングでは、3桁目の右側のすべての小数点を省略します。 たとえば、小数点以下を切り捨てると、が得られます。

最も近い数値への丸めでは、に最も近い小数点以下の数値を選択します。 たとえば、小数点以下を四捨五入することを検討してください。 考えられる候補は2つあります:と。 実数直線上では、はからの距離にあり、は。の距離にあります。 したがって、が最も近く、に丸めます。

直感的には、3番目の桁の右側にある数値の小数部分を比較しています。これは。です。 として、th桁をインクリメントしました。これは。です。

小数点以下を四捨五入したい場合はどうなりますか? そのことに注意してください。小数部分はです。 として、th桁は変更しません。 したがって、結果は、になります。これは実際にに最も近い値です。

一般に、桁の右側(小数点以下)の数値の小数部分とします。 の場合、th桁をインクリメントします。 の場合、th桁は変更されません。

同点の場合、が10進数の2桁の数値と等距離にある場合、奇数の場合は10進数を上げ、偶数の場合は変更しないままにします。 このように、10進数の丸め誤差は、同じくらい頻繁に正または負になります。

丸めと切り刻みの例をもう少し見てみましょう。念のため、これはに沈みます。 すべての数量を小数点以下で四捨五入することに関心があると仮定します。

チョッピングと丸めの違いは、現実の世界に影響を及ぼします。 バンクーバー証券取引所指数は1982年に取引を開始し、基準値は。 基礎となる株はまともなパフォーマンスを示していましたが、インデックスは1983年の終わりに500の安値を打ち始めました。 コンピュータプログラムは、インデックスの値を毎日何千回も再計算し、プログラムは最も近い値に丸める代わりにチョッピングを使用しました。 四捨五入された計算では、の値が得られました。

3. コンピュータ番号システム

私たちの日常生活では、基数が10進数の記数法を使用して数値を表します。 10進法では、1桁が小数点の右側の桁を表す場合、それが寄与する値はであることに注意してください。 たとえば、数字のシーケンスは次のことを意味します。

   

実際、任意の整数(またはベースとして使用できます)。 同様に、すべての実数には、次の形式の一意の表現があります。

   

またはコンパクトに、ここで、係数、システム内の数字は、のような正の整数です。

3.1. 2つの数値システム間の変換アルゴリズム

基数の異なる2つの数値システム間の変換の問題を考えてみましょう。 具体的には、バイナリ形式に変換してみましょう。 私たちは書くかもしれません:

   

最後を除いて、各用語から係数を引き出し、同等に次のように書くことができます。

   

したがって、直感的には、で除算する場合、角かっこで囲まれた式を商と呼び、除算の余りです。 同様に、、を除算すると、括弧内の式が商として返されます。 それを、残りの部分と呼びます。

一般に、が基数を持つ整数であり、基数を持つ記数法での表現を決定したい場合は、with:setとの連続除算を実行します。

   

は商であり、除算の余りです。

アルゴリズムを適用した結果を見てみましょう:

したがって、 。

3.2. 分数を別の記数法に変換する

実数が整数でない場合は、と記述します。ここで、は整数部分であり、

   

は小数部であり、ここで決定されます。

両側に基本収量を掛けると、

   

整数と小数部。 整数部分は正確に–基数で表されるの最初の桁です。 。を連続して乗算すると、連続する桁が整数部分として取得されます。

一般に、分数を基数を持つ別の記数法に変換する必要がある場合は、with:setとの連続した乗算を実行します。

   

2進数システムへの変換の例を見てみましょう。

したがって、バイナリシステムでは。

3.3. 固定小数点表現と浮動小数点表現

コンピュータは単語と呼ばれる固定サイズの情報を処理するために装備されています。 一般的なワード長は32ビットまたは64ビットです。

初期のコンピュータは、固定小数点数システムで数値計算を行いました。 つまり、実数は小数部の固定数の2進数を使用して表されました。 コンピューターのワード長がビット(符号ビットを含む)の場合、制限された間隔の数値のみが許可されます。 この制限は問題があります。たとえば、との場合でも、区間の範囲外である可能性があるためです。

浮動小数点数システムでは、実数は次のように表されます。

   

数の小数部分は仮数または仮数と呼ばれます。 指数と呼ばれ、ベースです。 、の場合、指数を常に減らし、小数点を1桁右にシフトできるためです。

仮数と指数は、コンピューターの固定語長によって制限されます。 は数字の数値に四捨五入され、指数は特定の範囲内にあります。

したがって、次の形式の浮動小数点数のみを表すことができます。

   

浮動小数点数システムは、基数、精度、数、およびによって完全に特徴付けられます。 、セットは、数を含めて、を含むので、

   

数字。 直感的に、サインには選択肢があります。 数字はセットから選択できます。 連続する各桁は、から選択できます。 指数は数値から選択できます。 確率の乗法により、識別可能な数があります。 数字を含めると、上記の式が得られます。

3.4. 浮動小数点数が不正確なのはなぜですか?

おもちゃの浮動小数点数体系を考えてみましょう。 セットには正確に数字が含まれています。 セット内の正の数を以下に示します。

たとえば、のすべての実数がに存在するわけではないことは明らかです。 さらに、すべての浮動小数点数が等間隔に配置されているわけではありません。 間隔は、の各累乗の係数でジャンプします。

浮動小数点数の間隔は、計算機イプシロンによって特徴付けられます。これは、次に大きい浮動小数点数までの距離です。

実数が浮動小数点システムの範囲内にある場合、明らかなことは、に四捨五入することです。ここで、はに最も近い浮動小数点数です。 で表すとエラーが発生することはすでに明らかです

興味深い質問の1つは、このエラーの大きさです。 どの時点でも丸め誤差が特定の量を超えないことを保証できれば素晴らしいと思います。 誰もが保証が大好きです! 言い換えると、相対誤差の上限を求めます。

   

前の説明から、小数に丸めるとき、小数の右側の数値の部分がよりも小さい場合は小数を変更せず、それ以外の場合は小数を.だけ上げることを思い出してください。 ここでは、10進数の基数ではなく一般的な基数を使用しています。 したがって、仮数の丸め誤差は次のように制限されます。

   

したがって、の相対丸め誤差は次のように制限されます。

   

IEEEなどの最新の浮動小数点標準は、この上限を保証します。 この上限は丸め単位と呼ばれ、で示されます。

4. 一言で言えばIEEE浮動小数点標準

浮動小数点システムの実際のコンピューターハードウェア実装は、おもちゃのシステムとは異なります。 現在のほとんどのコンピューターは、バイナリ浮動小数点演算の IEEE754標準に準拠しています。 2つの主要な基本フォーマットがあります–単精度と倍精度で、32ビットと64ビットのストレージが必要です。

単精度では、浮動小数点数は符号(ビット)、指数(ビット)、仮数(ビット)として格納されます。

倍精度では、ビットは指数に割り当てられますが、ビットは仮数に割り当てられます。 指数はとして保存されます。

通常の場合の浮動小数点数の値は次のとおりです。

   

高校で学んだ科学的記数法と同様に、2進小数点の前の桁は常にであることに注意してください。 このようにして、仮数のビットが得られます。

4.1. 浮動小数点演算の癖

次の比較を検討してください。

(0.10 + 0.20) == 0.30

この論理比較の結果は誤りです。 浮動小数点システムが壊れているため、この突然の動作が予想されます。 ただし、何が起こっているのかを詳しく見ていきましょう。

倍精度形式に入れましょう。 は正であるため、符号ビット。

基本的な科学的表記法では、と書くことができます。 これは、範囲内の数値との累乗を考慮に入れる必要があることを意味します。 の異なる累乗で割ると、次のようになります。

   

したがって、 。 指数はとして格納されるため、指数部分のビットパターンはです。

仮数は、バイナリ形式の小数部分です。 を連続して乗算すると、がすぐに得られます。 ただし、倍精度形式では仮数にビットが割り当てられるため、桁に四捨五入する必要があります。 2桁目以降の小数部が。を超えています。 したがって、小数点以下を。だけ上げます。 したがって、丸められた仮数はです。

最後に、バイナリ文字列を正しい順序で配置します。 したがって、IEEE倍精度形式では次のようになります。

   

このマシン番号はおおよそベースにあります。 同様に、浮動小数点システムで最も近いマシン番号は約です。 したがって、 。 右側では、に最も近いマシン番号はです。 そう、 。

要約すると、代数的に同等のステートメントは必ずしも数値的に同等ではありません

5. 結論

この記事では、切り刻みと最も近い端数への丸めのルールがどのように機能するかを学びました。 数値システム間の変換のためのアルゴリズムを開発しました。 また、浮動小数点システムは4倍で特徴付けられることも学びました)。 たとえば、IEEE倍精度形式はとして与えられます。 コンピューターのメモリ容量は有限であるため、マシン番号のセットは実数のサブセットにすぎません。 テクニカルスピーチでのマシン番号間の間隔は、マシンイプシロンと呼ばれます。

さらに、実数は常にコンピューター上の最も近いマシン番号に四捨五入されます。 IEEE標準では、相対的な丸め誤差が特定の量を超えないことが保証されています。 さらに、プログラマーとして、浮動小数点演算を行うときは適切な注意を払う必要があります。