浮動小数点数

浮動小数点数（ふどうしょうすうてんすう、英: floating-point number）は、実数をコンピュータで処理（演算や記憶、通信）するために有限桁の小数で近似値として扱う方式であり、コンピュータの数値表現として広く用いられている。多くの場合、1ビットの符号部、固定長の指数部、固定長の仮数部、の3つの部分を組み合わせて、数値を表現する。
概要.
この節はパターソンらの記述に基づく。
実数は0以上かつ1以下のような有限の範囲でも、無限個の値（種類）が存在するため、コンピュータでは妥当なビット数で有限個の値（種類）の近似値で扱う必要がある。
実数-1/3は無限小数となるが、有限桁の小数で近似値を表記できる。下の例では10進数での4桁としている。
下の2つの表記は科学記数法 (scientific notation) とよばれ、小数点より左側の整数部分を1桁とする。
科学記数法のうち、左側の1桁を0以外（10進表記では1から9）にしたものを、正規化数 (normalized number) とよび、
一番下の表記が該当する。
実数-1/3はまた、有限桁2進数の小数でも、近似値で表記できる。下の例では2進数17桁としている。
2進数の小数も科学記数法で表記できる。
上記は同じ値を、小数点位置を移動し異なる表記にしているため、浮動小数点と呼ばれる。一番下の表記は、正規化数である。
コンピュータ処理に適した暗黙の基数2について、符号 (sign) S、仮数 (significand) F、指数 (exponent) Eにより、
浮動小数点数は下記の式で表記できる。
浮動小数点数のフォーマット.
浮動小数点数のフォーマットには、以下で説明するものや、イクセス64 など多数ある。
IEEE方式（IEEE 754 形式）.
IEEE 754 形式の
で表現されている。各部は次のように定義されている。
つまり、IEEE 754 形式で表現する値は
である。
ただし、IEEE 754 形式の指数部は複雑で、以下のような役割も持つ。
0 を 0 で割ろうとすると NaN になる。また、formula_1 も、求めるとNaNになる。
IEEE 754 で表現するまでの過程.
2.5を例にとると、
であることから、まず次のように考える。
仮数部は1未満でなければならないため、仮数の値2.5を（この例では右へ）シフトし正規化する。基数は2、コンピュータの内部表現は2進法であるため、シフト量は1ビットである。さらに、右シフトしてになったことを相殺するため、指数に1を加える（もし左シフトなら、指数から1を引く）。
値をシフトすることで表現範囲を広げ、丸め誤差を少なくなるようにしている。この操作を正規化という。正規化は基数の±1乗を繰り返し求めればよい。
このままでは (−1)0 × 1.25 × 21 となり、仮数の絶対値は1未満ではないが、仮数部は 仮数 − 1 と決められているため、次のようになる。
指数部は、指数に127をバイアスすることが決まっているため
2進法では、
浮動小数点は、最上位ビットから符号部、指数部、仮数部の順に符号化するため
bfloat16.
IEEE 754 形式から派生した浮動小数点数の形式。符号部 1 ビット ・ 指数部 8 ビット ・ 仮数部 7 ビットである。
つまり、bfloat16 形式で表現する値は
である。
採用事例
FP8.
IEEE 754 形式から派生した浮動小数点数の形式。以下の2種類がある。
採用事例
IBM方式.
IBM方式は、IBM社がSystem/360で導入し、以後同社の標準としてSystem/370などのメインフレームで使った方式である（1994年4月発表のSystem/390では、従来形式のサポートは残すもののIEEE 754を使用するよう改めた）。指数部が2の冪ではなく16の冪を表すという特徴がある。この方式は、より大きな範囲を少ないビット数の指数部で表すことができ、そのぶんのビットを仮数部の桁数に使うことで精度も確保できるように一見思える。しかし、仮数部にケチ表現を使うことができず、さらに指数部の変化の前後で、仮数部のLSBが表現する値の刻み幅が16倍変化するため、2べきの場合に比べて最悪の場合には2進で3ビット分の精度が損なわれるため、一般には大成功であったと評されたSystem/360の設計において良くなかった点の一つとして挙げられる。（浮動小数点数の加減算の際に必要となる仮数部のシフトが4ビット単位となるのでシフト回数が減ることで演算が程度高速になる利点も16進数が採用された理由であった。）
特に単精度において、前世代機の（全部で36ビット）よりも桁数を減らした（32ビット）ことと相まって精度が大きく損なわれた。その他にも問題があり、ユーザグループであるSHAREから改善提案が出され、その多くを受け入れて多大なコストのかかる改修をおこなったほどであり、これを記憶しているIBMの古参社員は「身の縮む思い」をおぼえているという。
また、計算対象の数値がベンフォードの法則に従って分布していた場合、計算対象として精度の低い数（仮数部の最上位4ビットが0b0001）の現れる確率は1/15にはならず、もっと高い。
IBM方式の単精度浮動小数点数では、符号部1ビット、指数部7ビット、仮数部24ビットで表現されている。各部は次のように定義されている。
符号部は仮数の符号を表す。
指数部は−1663～−16−64と16−64～1663の範囲が表現できる。
IBM方式で表現するまでの過程.
1.5を単精度のIBM方式で表現するには、次のようになる。
仮数部は1未満でなければならないため、値を（この例では右へ）シフトする。ただし、基数が16で、コンピュータの内部表現は2進法であるため、シフト量は4ビットである（24 = 16）。加えて正規化し、その結果は次の通り。
次に指数部を、64をバイアスしたゲタ履き表現（エクセス64）で表現する。バイアスにより、0～127のビットパターンで、整数値−64～+63を表現するということになる（−64 + 64 = 0、63 + 64 = 127）。
よって、今回の例では以下のようになる。
2進法では、
浮動小数点は、最上位ビットから符号部、指数部、仮数部の順に符号化するため
指数部と仮数部を可変とする方式.
任意精度演算と、従来の指数部と仮数部を共に固定長とする形式の中庸と言えるような方式が、いくつか提案されている。絶対値が1に近い値では指数部の桁数を短くし、仮数部の桁数を多くとって、よく使われる値を精度よく表現する。絶対値が極端に大きい値や小さい値には、精度とひきかえに指数部の桁数を増やすことで対応する。以下で述べる方式を提案している文献では、アプリケーションとして、通常の浮動小数点計算には、指数が大きくなり過ぎることがあって向かないとされているをうまく扱えたという例が示されている。
松井・伊理の表現法.
松井正一と伊理正夫が提案した方式で、符号と絶対値による表現法である。論文中に示された例では、64ビットの倍精度浮動小数点数として、仮数部の長さnを示す情報6ビットと、（符号部を含む）mビットの指数部とnビットの仮数部（m+n = 58）からなる。彼らは、オーバーフローを起こさせないための、より大きい数やより小さい数の表現や、無限大などの例外的な値を含めた算術（IEEE標準の±∞や−0の扱いに似ているが、より拡張されている）も提案している。
浜田のURR.
浜田穂積が提案した方式で、Universal Representation of Real numbersの意でURRと名付けられている。−∞ ～ 0 ～ ∞ の区間を、次のように分割しながら、二進法による表現に対応付ける、というのが基本的な考え方で、「符号と絶対値」形ではなく、浮動小数点の表現としては比較的珍しい2の補数の形をしている。
ここで±1の前後は、区間の両端の比が2なので、指数部の表現は終わったとみなすことができ、残りの桁は仮数部のように扱う（±1の前後は、以後は1/2で等差分割する）。次のように分割を続ける。
以降は、符号ビットが0である0 ～ 0.5 と 2 ～ ∞ の区間に絞って説明する。
ここで、2 = 220、4 = 221、16 = 222、256 = 223 である。このように 0 や ±∞ を含む区間は「二重指数分割」する。
このように、区間の両端の比が2より大きい場合は、「等比分割」する。
以上のような操作の結果として、指数部が0以上の場合は
指数部が0未満の場合は
ビット反転して0以上にした後に上述の方法を適用した指数部を、再びビット反転したものとなる。
こうして、負数に拡張されたガンマ符号によって自分の長さを含む指数部と、残りの仮数部から成る、と見ることができるような表現が得られる。
利点として、ビット表現を固定小数点数と解釈しても値・絶対値の大小関係が一致しているため、
という点が挙げられる。また、1の近くでは桁数のほとんどが仮数部となるので精度が高い。
欠点としては、精度が変化するため従来の精度一定を前提としたノウハウに修正が必要かもしれない、−∞を除くワードのあらゆるビット表現に浮動小数点数としての意味が与えられるため、例外的な値を表現する方法を別に考えなければいけない、などといった点がある。浜田は1000...を符号なしの∞（射影モード用。符号なしの0と対応する）とし、表現可能な最大と最小の絶対値を持つ値を、具体的にその値を表すのではなく±∞と±0を表現するものとする（0は、通常の0を符号なしの0とし、符号付きの+0や−0は、無限大で割った結果など例外的な値としてのみ現れる）、という方法を提案している。
この表現法の初出は1981年だが、1983年に改良版が提案されているのでそちらをまずは参照すべきである。
いくつかの実装の報告や改良の提案などがある。
GustafsonのPosit.
この方法は浜田方式のリバイバルのようなものである。