再び浮動小数点数について

多くの出版物がコンピューター計算の正確性の問題に専念しているという事実にもかかわらず、それらのいくつかは、我々の意見では、まだ完全に開示されていません。 すなわち:



1.有効桁数nには、浮動小数点形式のバイナリmビットコードで表される10進数が保証されます。

2.浮動小数点数の正規化は、ある数値システムから別の数値システムに変換され、算術演算がコンピューターで実行される場合、数値の表現の精度にどのように影響しますか。

3. 2進数の丸めは、10進数にどのように影響しますか。

4.機械語内の仮想ポイントの位置が、指数形式で表される数値にどのように影響するか。



以下では、これらの質問に答えようとします。



私たちの推論では、古典的な算術の観点から数値についての考えから進んでいきます。 数字を検討します。数字の有効桁数は、機械語のビットグリッドによって制限されます。 プレゼンテーションを簡素化するために、正の数のみを考慮します。



原則として、10進数に対してコンピューターで算術演算を実行する前に、それらは自然形式の2進小数形式で表示され、結果の数値は正規化された指数形式で書き込まれます。



F = M * 2 ^ -p、



ここで、Mは2進数の仮数、2 ^ -pは数値の特性、多くの場合指数と呼ばれ、pは特性の次数です。



10進数で表される2進数は、10進数に相当する2進数と呼ばれます。 2進数で表される10進数は、10進数に相当する2進数と呼ばれます。



仮数Mとして数値の自然表記を使用する場合、上記の式の特性の順序はゼロになり、特性はそれぞれ1になります。 F = M * 2 ^ 0 = Mとして表される数値があります。 たとえば、2進数F = 0.011は次数p = 0です。 数値内のポイントが条件付きで最上位桁の前に配置される場合、特性の順序はp = -1およびF = 0.11 * 10 ^ -1です。 数値のポイントが最上位桁の直後に条件付きで配置される場合、順序はp = -2およびF = 1.1 * 10 ^ -2です。 仮想ポイントを仮数Mの最下位桁の後に置くと、仮数は整数になり、そのためp = -3、F = 11 * 10 ^ -3になります。 ご覧のように、すべての場合において、特性の順序は、自然記録内の位置に対する仮想点の変位の数に等しくなります。 この例のすべての種類のエントリは同等であり、同じ意味を持ちます。



したがって、指数関数形式で表された数値の特性のインジケータの値は、仮想点の位置を考慮して、自然形式で記録された数値の点の位置を決定します。



マシン仮数の容量は、この仮数でバイナリ形式で表現できる10進数の数を一意に決定します。 また、仮数の仮想ポイントの位置により、これらの数値が配置される数値軸上の領域が決まります。 有効桁数が機械仮数の桁数を超えない2進数は正確であり、これらの2進数を10進数に変換して得られる10進数は表現可能と呼ばれます。



2進数のすべての有効数字がマシン仮数のビットグリッドに収まらない場合があるため、この数字は必要な有効数字の数に丸められます。 この番号は、最も近い表現可能なものに丸められたと呼ばれることがあります。 丸められた2進数は近似値になります。



すべての2進数は表現可能な10進数と同等であるという事実にもかかわらず、すべての10進数が機械語で表現できるわけではありません。 これは、10進数と2進数のシステムの不均衡によるものです。 したがって、10進数は基本的におよそ2進数形式で表すことができますが、すべての2進数は10進数形式で正確に表すことができます。 または言い換えれば。 有限期間の10進数に相当する2進数には、有効数字を無限に含めることができます。 有限期間の2進数に相当する10進数には、有限数の有効数字が含まれています。



おおよその数値は、真の(広義の)数値と不正な数値で構成されます。 算術演算中の数値が正しくないと、最終結果が歪められます。 これを防ぐため、概数は最も近い正しい桁に丸められます。



2進数を丸めると、丸められた数値の有効な数字の数が減り、10進数に相当する誤った数字が変更されます。 数値が正しくないと、絶対変換エラーになります。



2進数を最も近い表現可能な値に丸めると、この数値に相当する10進数を表現する際のエラーが増加します。 これは、2進数を四捨五入すると、10進数に相当する有効な2進数の数が減少するためです。



有効桁数が指定された10進数を2進数に変換した結果、2進数が得られます。10進数は、有効な数字と誤った数字の両方を含むおおよその数字になります。



有効な桁数nが、浮動小数点数の形式のバイナリmビットコードで表される10進数を持つことが保証されている有効な桁数を判断しましょう。



数値の仮数を書き込むためにマシンワードにm個の2進数が割り当てられている場合、そのような仮数に書き込むことができる最大整数はF max =(2 ^ m)-1になります。 この数値のm桁すべての値は1です。たとえば、m = 8の場合、F max = 2 ^ 8-1 = 255 = 11111111 2です。 ここで、有効桁数nの10進整数があるとします。 有効桁数nの最大10進数は、それぞれ9桁の数字で構成されます。したがって、有効桁数nの最大10進数は、F max =(10 ^ n)-1と記述できます。 たとえば、n = 2の場合、F max = 10 ^ 2 -1 = 99です。



有効数字がn桁の10進数が、m桁の仮数を持つバイナリコードで表されることが保証されるためには、条件が満たされなければなりません:(10 ^ n)-1≤(2 ^ m)-1または10 ^ n≤2 ^ m log 10⁡10^n≤log 10⁡2^ mまたはn≤m log 10 2. log 10⁡2≈0.3なので、不等式n≤0.3mが有効になります。 数値mおよびnは整数であるため、不等式

n≤⌊0.3m⌋。 したがって、m = 8の場合、n≤⌊0.3*8⌋= 2になります。



これまでのところ、整数マシン仮数について話してきました。 実際には、機械仮数は、仮想点が最高位にある小数であると考えるのが慣習です。 この仮想ポイントは、マシン仮数に書かれた整数を小数に変換します。 有効桁数mの2進整数を通常の小数である数値に変換することは、この数値に2 ^ -mの係数を乗算することと同等です。 したがって、mビット仮数の各ビットに1ユニットのみが記録され、仮想ポイントが仮数の先頭にあると想定される場合、この仮数で表される数は最大になり、M maxd = 1-2 ^ -mになります。 ここで、M maxdは、仮数部の先頭に仮想点があるmビットのマシン仮数で表現できる最大の小数です。



一方、マシン仮数が整数と見なされる場合、つまり 仮想ポイントがマシン仮数の最下位桁のすぐ後ろにある場合、 そこに書き込むことができる最大整数M maxcは1つのユニットで構成され、M maxc =(2 ^ m)-1と等しくなります。 ここでポイントが仮数の先頭に移動した場合、これはM maxd = M maxc * 2 ^ -mという事実と同等になります。



したがって、 0〜M maxc * 2 ^ -mの範囲にある小数は、mビットのマシン仮数で記述できます。 ここで、M maxcはマシン仮数に収まる最大バイナリ整数です。



一般的な場合、指数形式で表される数値の特性の次数の値のみが、仮想ポイントの選択に依存します。 番号の意味は変わりません。



たとえば、3桁のマシン仮数では、最大整数111 2 = 7を書き込むことができます。マシン仮数の最上位ビットの前に仮想ドットがあるこの数値は、値0.111 = 7 * 2 ^ -3 = 0.875になります。 最上位桁の前に仮想ドットが付いたマシン仮数で書かれた数値101 2 = 5は、値0.101 2 = 5 * 2 ^ -3 = 0.625などになります。



現在、さまざまなソースが、バイナリコードでの10進数の表現の正確性についてさまざまな意見を表しています。 2進数形式で表される10進数の2進算術演算の精度の問題に対処せずに、10進数を2進数に変換する精度を考慮します。



英語版ウィキペディア[5]は、doabl形式に関して、53ビットの機械仮数で53〜17ビットの10進数を表現できると述べています。 ただし、上記では、有効桁数n≤⌊0.3*53⌋= 15の10進数が53ビット仮数で表現されることが保証される式を導き出しました。実際、53ビット仮数に書き込める最大2進整数は次のようになります。 53単位の。 その10進値は(2 ^ 53)-1 = 9007199254740991に等しくなります。この数値には16桁の有効な10進数があります。 1を追加すると、10進数の有効桁数は変更されず、16になりますが、10進数を1つ増やしたこのバイナリ表現には、もう1桁の有効桁が既に含まれています。 したがって、16ビットの10進数のすべてが53ビットのマシン仮数で表現できるわけではありません。 同時に、このような2進仮数では、有効桁数が15以下のすべての10進数を表現できることが保証されます。有効桁数17の10進数を保証するには、少なくとも57桁の機械仮数が必要です。 ⌊0.3*57⌋= 17。



上記の例で検討した整数仮数を小数の領域にシフトするには、すべての数値に2 ^ -53のスケール係数を掛ける必要があります。 次に、53ビットのマシン仮数の最大2進小数は次のようになります。

0.11111111111111111111111111111111111111111111111111111111 = 111111111111111111111111111111111111111111111111111111 * 2 ^ -53 = 9007199254740991 * 2 ^ -小数10進数



10進数を可能な限り正確に2進数に変換するには、10進数の2進数表現で、できるだけ多くの有効数字を考慮する必要があります。 理想的には、数値の2進仮数の有効桁数は、機械仮数の桁数と等しくなければなりません。 この目的のために、2進数の有効桁数が機械仮数の桁数に等しくなるか、正確に分解されなくなるまで、10進数は2の累乗で分解されます。 このようにして得られた数値は、数値の最上位桁を機械仮数の最上位桁にシフトすることによって正規化されます。 そして、数値の最上位桁のシフト数に等しいスケール係数が、特性の次数のマシン領域に配置されます。 正規化手順は、数値の値を変更しないため、表示の精度は変わりません。



たとえば、8ビットの仮数を持つコンピューターを取り上げます。 8ビットのマシン仮数で表現できる有効な10進数の桁数は、n≤⌊0.3*8⌋= 2です。 数値0.0012を与えてみましょう。 この2進数は≈0.00000000010011101010010です。 この数値を有効数字8桁に丸めます。この数値は、機械仮数の放電グリッドのサイズに対応しています。 数値0.00000000010011101 =0.00119781494140625≈0.0012を取得します。 機械仮数に数値仮数のすべての有効数字を配置することにより、この数値を正規化します。 0.00000000010011101010010 = 0.10011101 * 2 ^ -9 = 0.61328125 * 2 ^ -9 = 0.00119781494140625になります。 ご覧のとおり、数値の値は正規化後も変更されていません。 数値の表現の正確さも変わっていません。 正規化後の有効桁数は変更されていません。 同じ数字を書く別の形を手に入れました。

2進数の正規化中に、数値の最上位桁のシフト数が、数値の特徴付けの順序を記録するように設計されたマシンドメインのビット数を超えることが判明した場合、その数値は正規化形式で書き込むことができません。 この場合、数字の一部またはすべての有効数字が機械仮数の放電グリッドの外側にあるという事実により、精度が失われます。



算術演算の結果として2進数が得られる場合、そのすべての有効数字は機械仮数内にあり、算術の観点から結果を正規化することは意味がありません。



たとえば、仮数の最上位ビットの前に仮想ポイントが配置されている8ビットのマシン仮数を持つコンピューターがあるとします。 2つの2進数の差を見つけます:0.10110000-0.10010011 = 0.00011101。 差の有効数字は、機械仮数の放電グリッドに完全に収まります。 この差に相当する10進数は、0.6875-0.57421875 = 0.11328125です。 数値0.00011101を正規化します。 0.00011101 = 0.11101 * 2 ^ -3 = 0.90625 * 2 ^ -3 = 0.11328125になります。 正規化によって数値の差が変化することはなかったため、その後の計算では、数学の観点から見ると、これら2つの結果の記録は同等です。



乾燥残渣



仮数の任意の場所にある仮想ポイントを使用して、任意の数を指数関数的に表すことができます。 自然な位置からのポイントの変位は、特性の順序を記録するために割り当てられた機械語の領域に記録されます。



マシン仮数の長さは、この仮数で表現できる10進数の数を決定します。 また、仮数の仮想ポイントの位置により、これらの数値が配置される数値軸上の領域が決まります。



仮想ポイントの位置は、数値の表現の精度に影響しません。



2進数表現の精度は、仮数の有効桁数に依存します。これは機械語で記述できます。



すべての2進数は、表現可能な10進数に相当します。 10進数はすべて機械語で表現できるわけではありません。 10進数の実数は、基本的にはおおよそ2進数で表現できますが、すべての2進数は10進数で正確に表現できます。



2進数の丸めは、機械仮数の桁グリッドに収まらない桁を破棄するため、丸められた2進数の正しい桁が減少し、その結果、10進数の等価表現の精度が低下します。



2進数の実数を丸めると、10進数に相当する誤った桁が変更されますが、誤った10進数は削除されません。



正確な10進数から取得した2進数に相当する10進数の誤った10進数は、絶対変換エラーを形成します。



m桁の機械仮数では、10進数、つまりn≤⌊0.3m⌋の有効桁数を確実に表すことができます。



2進数の正規化は、丸めなしで実行された場合、数値の値を変更しません。



正規化は、丸めなしで行われた場合、数値の精度に影響しません。



ソース



1. 「浮動小数点演算について知っておくべきこと」

2.すべて、ポイント、帆走! 浮動小数点数を使用して、固定小数点精度の代替を開発する方法を学びます。

3. 「浮動小数点数を使用した操作のエラーの補正」

4. 「浮動小数点計算:結果を信頼できますか?」

5. ウィキペディア

6. www.softelectro.ru/ieee754.html

7. 「浮動小数点数の正規化は必要ですか」



All Articles