単精度浮動小数点形式( FP32またはfloat32と呼ばれることもあります)は、コンピュータの数値形式であり、通常はコンピュータのメモリ内で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 進数表現など、 追加の浮動小数点型が指定されています。
単精度および倍精度の浮動小数点データ型を提供する最初のプログラミング言語の 1 つはFortranです。IEEE 754-1985 が広く採用される前は、浮動小数点データ型の表現とプロパティは、コンピュータの製造元とコンピュータ モデル、およびプログラミング言語の設計者の決定に依存していました。たとえば、GW-BASICの単精度データ型は、32 ビットの MBF浮動小数点形式でした。
単精度は、FortranではREAL、Common LispではSINGLE -FLOAT、C、C++、C#、Javaではfloat、Haskell [4]とSwiftではFloat、 Object Pascal ( Delphi )、Visual Basic、MATLABではSingleと呼ばれます。ただし、Python、Ruby、PHP、OCamlのfloatや、Octave 3.2より前のバージョンのsingleは倍精度数を指します。PostScriptのほとんどの実装と一部の組み込みシステムでは、サポートされている精度は単精度のみです 。
IEEE 754 標準: バイナリ32
IEEE 754 標準では、binary32 を次のように規定しています。
これにより、6~9桁の有効桁数の精度が得られます。最大6桁の有効桁数を持つ10進文字列をIEEE 754単精度形式に変換して通常の数値に変換し、同じ桁数の10進文字列に戻すと、最終結果は元の文字列と一致するはずです。IEEE 754単精度数を少なくとも9桁の有効桁数を持つ10進文字列に変換し、単精度表現に戻すと、最終結果は元の数値と一致する必要があります。[6]
符号ビットは数値の符号を決定しますが、これは仮数の符号でもあります。指数フィールドは、バイアス形式の 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 進桁に相当) になります。
ビットは次のように配置されます。
与えられた符号、バイアス指数e(8ビットの符号なし整数)、および23ビットの小数部を持つ32ビットのバイナリ32データによって想定される実数値は、
- 、
その結果
この例では、
- 、
- 、
- 、
- 、
- 。
したがって:
- 。
注記:
- 、
- 、
- 、
- 。
指数エンコーディング
単精度バイナリ浮動小数点指数は、ゼロ オフセットが 127 であるオフセット バイナリ表現を使用してエンコードされます。これは、IEEE 754 標準では指数バイアスとも呼ばれます。
- E最小= 01 H −7F H = −126
- E最大= FE H −7F H = 127
- 指数バイアス= 7F H = 127
したがって、オフセット バイナリ表現で定義された実際の指数を取得するには、格納されている指数からオフセット 127 を減算する必要があります。
格納された指数 00 Hと FF H は特別に解釈されます。
最小の正の正規値は であり、最小の正の(非正規)値は です。
10進数を2進数に変換する32
一般に、実数を同等の binary32 形式に厳密に変換する場合 (丸め動作を含む) は、IEEE 754 標準自体を参照してください。
ここでは、次の概要を使用して、10 進実数を IEEE 754 バイナリ 32 形式に変換する方法を示します。
- 12.375のような整数と小数部を持つ実数を考えてみましょう。
- 整数部分を2進数に変換して正規化する
- ここで示すように、次の手法を使用して分数部分を変換します。
- 2つの結果を追加し、適切な最終変換を生成するように調整します。
小数部分の変換: 12.375 の小数部分である 0.375 を考えてみましょう。これを 2 進小数に変換するには、分数を 2 倍し、整数部分を取り、新しい分数を 2 倍して、ゼロの分数が見つかるまで、または IEEE 754 バイナリ 32 形式の 23 小数桁の精度制限に達するまで繰り返します。
- 整数部分は2進小数点を表します。0.750に2を掛けて次に進みましょう。
- 、分数 = 0.011、終了
は2 進数で と正確に表せることがわかります。すべての小数が有限桁の 2 進数で表せるわけではありません。たとえば、小数 0.1 は 2 進数で正確に表すことはできず、近似値でしか表せません。したがって、
IEEE 754 binary32形式では実数値を形式(正規化数、非正規化数を参照)で表現する必要があるため、1100.011は3桁右にシフトされ、
最終的に次のことがわかります。
そこから次のことが推測されます。
- 指数は3です(したがって、バイアス形式では)
- 分数は100011です(2進小数点の右側を見ると)
これらから、12.375 の 32 ビット IEEE 754 binary32 形式表現を形成できます。
注: 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 binary32 形式表現を形成できます。
例3: 0.375という値を考えてみましょう。
したがって、0.375 の表現を決定した後、上記のように進めることができます。
- 指数は−2です(バイアス形式では)
- 分数は1です(1.1の2進小数点の右側を見ると1です)
これらから、実数 0.375 の 32 ビット IEEE 754 binary32 形式表現を形成できます。
バイナリ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 00000000000000000000001 2 = 0000 0001 16 = 2 −126 × 2 −23 = 2 −149 ≈ 1.4012984643 × 10 −45
(最小の正の非正規数)
0 00000000 111111111111111111111111 2 = 007f ffff 16 = 2 −126 × (1 − 2 −23 ) ≈ 1.1754942107 ×10 −38
(最大の非正規数)
0 00000001 00000000000000000000000 2 = 0080 0000 16 = 2 −126 ≈ 1.1754943508 × 10 −38
(最小の正の正規数)
0 11111110 11111111111111111111111 2 = 7f7f ffff 16 = 2 127 × (2 − 2 −23 ) ≈ 3.4028234664 × 10 38
(最大の正規数)
0 01111110 111111111111111111111111 2 = 3f7f ffff 16 = 1 − 2 −24 ≈ 0.999999940395355225
(1未満の最大の数字)
0 01111111 0000000000000000000000000 2 = 3f80 0000 16 = 1 (一)
0 01111111 00000000000000000000001 2 = 3f80 0001 16 = 1 + 2 −23 ≈ 1.00000011920928955
(1より大きい最小の数字)
1 10000000 0000000000000000000000000 2 = c000 0000 16 = −2
0 00000000 00000000000000000000000 2 = 0000 0000 16 = 0
1 00000000 00000000000000000000000 2 = 8000 0000 16 = −0
0 11111111 0000000000000000000000000 2 = 7f80 0000 16 = 無限大
1 11111111 0000000000000000000000000 2 = ff80 0000 16 = −無限大
0 10000000 10010010000111111011011 2 = 4049 0fdb 16 ≈ 3.14159274101257324 ≈ π ( パイ )
0 01111101 01010101010101010101011 2 = 3eaa aaab 16 ≈ 0.333333343267440796 ≈ 1/3
x 11111111 1000000000000000000000001 2 = ffc0 0001 16 = qNaN (x86 および ARM プロセッサの場合)
x 11111111 0000000000000000000000001 2 = ff80 0001 16 = sNaN (x86 および ARM プロセッサの場合)
デフォルトでは、 1/3 は、有効桁のビット数が偶数であるため、倍精度のように切り捨てられるのではなく、切り上げられます。 丸め点を超える 1/3 のビットは、最後の桁の単位1010...の 1/2 より大きい値になります。
qNaNと sNaN のエンコーディングはIEEE 754では指定されておらず、プロセッサごとに異なる方法で実装されています。x86ファミリとARMファミリのプロセッサは、有効桁フィールドの最上位ビットを使用して、静止 NaN を示します。PA -RISCプロセッサは、このビットを使用してシグナリング NaN を示します。
最適化
浮動小数点形式の設計により、生のビット パターンの整数ビューから2 を底とする対数の近似値を簡単に生成できるため、さまざまな最適化が可能になります。整数演算とビット シフトにより、コンピューター グラフィックスで一般的に必要とされる逆平方根(高速逆平方根)の近似値が得られます。
参照
- IEEE754 規格
- ISO/IEC 10967、言語に依存しない算術演算
- プリミティブデータ型
- 数値安定性
- 科学的記数法
参考文献
- ^ 「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 ソース コード
