単精度浮動小数点形式
単精度浮動小数点形式( FP32、float32、floatとも呼ばれる) は、コンピュータの数値形式で、通常はコンピュータのメモリ内で32 ビットを占め、浮動小数点基数を使用して幅広い動的な数値を表します。
浮動小数点変数は、精度を犠牲にして、同じビット幅の固定小数点変数よりも広い範囲の数値を表現できます。符号付き32ビット整数変数の最大値は2 31 − 1 = 2,147,483,647ですが、IEEE 754 32ビット基数2の浮動小数点変数の最大値は(2 − 2 −23 ) × 2 127 ≈ 3.4028235 × 10 38です。小数点以下7桁のすべての整数、および整数-149 ≤ n ≤ 127の任意の2 nは、IEEE 754単精度浮動小数点値に正確に変換できます。
IEEE 754規格では、32ビットの2進数形式は正式にはbinary32と呼ばれています。IEEE 754-1985ではsingleと呼ばれていました。IEEE 754では、64ビットの2進数倍精度や、最近では10進数表現など、追加の浮動小数点型が規定されています。
単精度および倍精度の浮動小数点データ型を提供した最初のプログラミング言語の一つはFortranでした。IEEE 754-1985が広く採用される以前は、浮動小数点データ型の表現と特性は、コンピュータメーカーやコンピュータモデル、そしてプログラミング言語設計者の決定に依存していました。例えば、GW-BASICの単精度データ型は、32ビットのMBF浮動小数点形式でした。
単精度は、FortranではREAL(4)またはREAL*4と呼ばれます。[1] Common LispではSINGLE-FLOAT、[2] PL/Iではp≤21のfloat binary(p) 、 DFP(IEEE 754 DFP)属性が適用されるかどうかに応じてpの最大値となるfloat decimal(p)、IEEE 754をサポートするC、C ++(Cにある場合)、C#、Javaではfloat、[3] Haskell [4]とSwiftではfloat 、[5] Object Pascal(Delphi)、Visual Basic、MATLABではSingleです。ただし、Python、Ruby、PHP、OCamlでのfloat、およびOctaveのバージョン3.2より前のバージョンでのsingleは、倍精度数を指します。PostScriptのほとんどの実装と一部の組み込みシステムでは、サポートされている精度は単精度のみです。
| Floating-point formats |
|---|
| IEEE 754 |
|
| Other |
| Alternatives |
| Tapered floating point |
IEEE 754規格: バイナリ32
IEEE 754 標準では、binary32 は次のように規定されています。
これにより、6桁から9桁の有効桁数が得られます。有効桁数が最大6桁の10進文字列をIEEE 754単精度形式に変換して通常の数値に変換し、その後同じ桁数の10進文字列に戻すと、最終結果は元の文字列と一致するはずです。IEEE 754単精度数値を有効桁数が少なくとも9桁の10進文字列に変換し、その後単精度表現に戻すと、最終結果は元の数値と一致するはずです。[6]
符号ビットは数値の符号を決定します。これは仮数の符号にもなります。「1」は負数を表します。指数フィールドは0から255までの8ビットの符号なし整数で、バイアス形式です。127という値は実際の指数ゼロを表します。指数の範囲は-126から+127(したがって指数フィールドでは1から254)です。これは、バイアス指数値0(すべて0)と255(すべて1)が特別な数(非正規数、符号付きゼロ、無限大、およびNaN)のために予約されているためです。
正規数の真の仮数部には、2 進小数点の右側の 23 個の小数ビットと、値 1 を持つ暗黙の先頭ビット(2 進小数点の左側) が含まれます。非正規数とゼロ (最小の正の正規数よりも大きさが小さい浮動小数点数) は、バイアス指数値 0 で表され、暗黙の先頭ビットの値は 0 になります。したがって、仮数部の 23 個の小数ビットのみがメモリ形式に表示されますが、正規値の場合、全体の精度は 24 ビット (log 10 (2 24 ) ≈ 7.225 の 10 進数に相当) です。非正規数では、最小の非ゼロ値に対して 1 ビットまで精度が低下します。
ビットは次のように配置されます。
与えられた符号、バイアス指数E(8ビットの符号なし整数)、および23ビットの小数部を持つ与えられた32ビットのバイナリ32データによって想定される実数値は、
- 、
結果は
この例では:
- 、
- 、
- 、
- 、
- 。
したがって:
- 。
注:
- 、
- 、
- 、
- 。
指数エンコード
単精度バイナリ浮動小数点指数は、ゼロ オフセットが 127 であるオフセット バイナリ表現を使用してエンコードされます。これは、IEEE 754 標準では指数バイアスとも呼ばれます。
- E min = 01 H −7F H = −126
- E max = FE H −7F H = 127
- 指数バイアス= 7F H = 127
したがって、オフセット バイナリ表現で定義された実際の指数を取得するには、格納された指数からオフセット 127 を減算する必要があります。
格納された指数 00 Hおよび FF Hは特別に解釈されます。
| 指数 | 分数 = 0 | 分数 ≠ 0 | 方程式 |
|---|---|---|---|
| 00 H = 00000000 2 | ±ゼロ | 非正規数 | |
| 01 H , ..., FE H = 00000001 2 , ..., 11111110 2 | 正常値 | ||
| FF H = 11111111 2 | ±無限大 | NaN (静音、シグナリング) | |
最小の正の正規値は であり、最小の正の(非正規)値は です。
10進数を2進数に変換する32
一般に、実数をそれと同等の Binary32 形式に厳密に変換する (丸め動作を含む) 方法については、IEEE 754 標準自体を参照してください。
ここでは、次の概要を使用して、基数 10 の実数を IEEE 754 バイナリ 32 形式に変換する方法を示します。
- 12.375のような整数部と小数部を持つ実数を考えてみましょう。
- 整数部分を2進数に変換して正規化する
- 次に示す手法を使用して分数部分を変換します。
- 2つの結果を追加し、適切な最終変換を生成するように調整します。
小数部の変換: 12.375 の小数部である 0.375 を考えてみましょう。これを二進小数に変換するには、分数に 2 を掛け、整数部を取り、新しい分数に 2 を掛ける処理を、ゼロの小数部が見つかるまで、または IEEE 754 バイナリ 32 形式では小数部の桁数が 23 桁に達するまで繰り返します。
- 整数部は2進小数点を表します。0.750に2を掛けて次に進みましょう。
- 、分数 = 0.011、終了
は2進法では と正確に表せることがわかります。すべての小数が有限桁の2進法で表せるわけではありません。例えば、小数点0.1は2進法では正確に表すことはできず、近似値でしか表せません。したがって、
IEEE 754の2進32形式では実数値を形式(正規化数、非正規化数を参照)で表現する必要があるため、1100.011は3桁右にシフトされ、
最終的に次のことがわかります。
そこから次のことが推測されます。
- 指数は3です(したがって、バイアスされた形式では)
- 分数は100011です(2進小数点の右側を見てください)
これらから、12.375 の 32 ビット IEEE 754 バイナリ 32 形式表現を形成できます。
注: 68.123 を IEEE 754 バイナリ 32 形式に変換することを検討してください。上記の手順を使用すると、最後の 4 ビットが 1001 になるはずです。ただし、IEEE 754 形式のデフォルトの丸め動作により、最後の 4 ビットが 1010 になる が取得されます。
例 1:小数点 1 を考えてみましょう。次のことがわかります。
そこから次のことが推測されます。
- 指数は0である(したがって、バイアスされた形式では
- 分数は0です(1.0の2進小数点の右側を見るとすべてです)
これらから、実数 1 の 32 ビット IEEE 754 バイナリ 32 形式表現を形成できます。
例2:値0.25を考えてみましょう。次のことがわかります。
そこから次のことが推測されます。
- 指数は−2である(バイアスされた形式では)
- 分数は 0 です (1.0 の 2 進小数点の右側を見るとすべて 0 です)
これらから、実数 0.25 の 32 ビット IEEE 754 バイナリ 32 形式表現を形成できます。
例3: 0.375という値を考えてみましょう。
したがって、0.375 の表現を決定した後、上記のように進めることができます。
- 指数は−2である(バイアスされた形式では)
- 分数は1です(1.1の2進小数点の右側を見ると1です)
これらから、実数 0.375 の 32 ビット IEEE 754 バイナリ 32 形式表現を形成できます。
32進数を10進数に変換する
この例では、 binary32 値41C80000が 16 進数である場合は、まずそれを 2 進数に変換します。
次に、それを符号ビット、指数、仮数の 3 つの部分に分解します。
- 符号ビット:
- 指数:
- 仮数部:
次に、暗黙の24ビットを仮数部に加算します
- 仮数部:
127 を引いて指数値をデコードします。
- 生の指数:
- 復号された指数:
仮数部の24ビット(暗黙の24ビットを含む)のそれぞれ、ビット23からビット0は、1から始まり、各ビットが半分になる値を表します。次のように表されます
ビット23 = 1ビット22 = 0.5ビット21 = 0.25ビット20 = 0.125ビット19 = 0.0625ビット18 = 0.03125ビット17 = 0.015625。。ビット6 = 0.00000762939453125ビット5 = 0.000003814697265625ビット4 = 0.0000019073486328125ビット3 = 0.00000095367431640625ビット2 = 0.000000476837158203125ビット1 = 0.0000002384185791015625ビット0 = 0.00000011920928955078125
この例では、仮数部にビット 23、ビット 22、ビット 19 の 3 つのビットが設定されています。これらのビットによって表される値を加算することで、仮数をデコードできます。
- デコードされた仮数部:
次に、底2を指数で乗算して、最終結果を取得します
したがって
これは次と同等です。
ここで、 sは符号ビット、xは指数、mは仮数です
小数値の精度制限(1~16777216)
- 1から2までの小数:固定間隔2 −23(1+2 −23は1の次に大きい浮動小数点数)
- 2から4までの小数:固定間隔2 −22
- 4から8までの小数:固定間隔2 −21
- …
- 2 nから 2 n+1までの小数:固定区間 2 n−23
- …
- 2 22 =4194304から2 23 =8388608までの小数:固定間隔2 −1 =0.5
- 2 23 =8388608 から 2 24 =16777216までの小数: 固定間隔 2 0 =1
整数値の精度制限
- 0から16777216までの整数を正確に表現できる(-16777216から0までの負の整数にも適用)
- 2 24 =16777216 から 2 25 =33554432 までの整数は 2 の倍数(偶数)に丸められます。
- 2 25から 2 26までの整数は4 の倍数に丸められます
- …
- 2 nから 2 n+1までの整数は2 n−23の倍数に丸められます。
- …
- 2 127から 2 128までの整数は 2 104の倍数に丸められます
- 2 128以上の整数は「無限大」に丸められます。
単精度の注目すべきケース
これらの例は、浮動小数点値のビット表現(16進数と2進数)で示されています。これには、符号、(バイアス付き)指数、および仮数部が含まれます
0 00000000 0000000000000000000000012= 0000 000116= 2 −126 × 2 −23 = 2 −149 ≈ 1.4012984643 × 10 −45 0 00000000 1111111111111111111111112= 007f ffff16= 2 −126 × (1 − 2 −23 ) ≈ 1.1754942107 × 10 −38 0 00000001 0000000000000000000000002= 0080 000016= 2 −126 ≈ 1.1754943508 × 10 −38 0 11111110 111111111111111111111112= 7f7f ffff16= 2 127 × (2 − 2 −23 ) ≈ 3.4028234664 × 10 38 0 01111110 111111111111111111111112= 3f7f ffff16= 1 − 2 −24 ≈ 0.999999940395355225 0 01111111 0000000000000000000000002= 3f80 000016= 1 0 01111111 0000000000000000000000012= 3f80 000116= 1 + 2 −23 ≈ 1.00000011920928955 1 10000000 0000000000000000000000002= c000 000016= -2 0 11111111 000000000000000000000002= 7f80 000016= 無限大 0 01111101 010101010101010101010112= 3eaa aaab16≈ 0.333333343267440796 ≈ 1/3 x 11111111 10000000000000000000000012= ffc0 000116= qNaN (x86およびARMプロセッサの場合) |
デフォルトでは、1/3 は倍精度のように切り捨てではなく切り上げます。これは、仮数部のビット数が偶数であるためです。1/3 の丸め点を超えるビットは、最後の桁の単位1010...の 1/2 よりも大きい値です。
qNaNとsNaNのエンコーディングはIEEE 754では規定されておらず、プロセッサごとに実装が異なります。x86ファミリおよびARMファミリのプロセッサは、仮数フィールドの最上位ビットを使用してQuiet NaNを示します。PA -RISCプロセッサは、このビットを使用してSignaling NaNを示します。
最適化
浮動小数点形式の設計により、生のビットパターンの整数ビューから2を底とする対数の近似値を容易に生成できるため、さまざまな最適化が可能になります。整数演算とビットシフトにより、コンピュータグラフィックスで一般的に必要とされる逆平方根(高速逆平方根)の近似値を生成できます
参照
参考文献
- ^ “REAL声明”. scc.ustc.edu.cn . 2021年2月24日時点のオリジナルよりアーカイブ。 2013年2月28日閲覧。
- ^ 「CLHS: 型 SHORT-FLOAT、SINGLE-FLOAT、DOUBLE-FLOAT...」www.lispworks.com。
- ^ 「プリミティブデータ型」。Javaドキュメント。
- ^ 「6つの定義済み型とクラス」haskell.org . 2010年7月20日.
- ^ 「Float」。Apple開発者ドキュメント。
- ^ William Kahan (1997年10月1日). 「二進浮動小数点演算におけるIEEE標準754の現状に関する講義ノート」(PDF) . p. 4. 2012年2月8日時点のオリジナル(PDF)からのアーカイブ。
外部リンク
- ライブ浮動小数点ビットパターンエディタ
- オンライン計算機
- 単精度の IEEE 754 数値のオンラインコンバータ
- IEEE 倍精度、単精度、半精度間の変換を行う C ソースコード