単精度浮動小数点数
情報処理において、単精度浮動小数点数 (Single precision floating point number) は、コンピュータの数値表現の一種である。
浮動小数点形式の標準であるIEEE 754では、単精度は32ビット（4オクテット）、倍精度は64ビット（8オクテット）である。IEEE 754-2008 では単精度の形式は正式には binary32 と呼ばれている。「単」や「倍」という表現は32ビットを1ワードとする32ビットアーキテクチャを基にしている。
単精度浮動小数点数は、同じ幅の固定小数点数に比べてより広範囲な数値を表せるようになっているが、同時に精度を犠牲にしている。
C言語、C++、C#、Java、Haskellでは単精度のデータ型を float と呼び、Pascal、MATLABなどでは single と呼ぶ。3.2以前のOctaveでは single という名前だが倍精度である。Pythonの float も倍精度である。
IEEE 754 での binary32 の定義は次の通りである。
符号ビットは表現する数値の符号（正負）を示す。指数部は 8 ビットで、符号なし整数として見た場合は 0 から 255 の値をとり、0 の時はゼロか非正規化数であることを、1 から 254 の時は -127 のゲタ履き（バイアス付き）表現で -126 から 127 の指数を、255 の時は無限大または NaN であることを示す。
指数部が 0（ゼロ、および非正規化数）の場合を除き、仮数部で表現されるビットパターンのさらにひとつ上のケタに暗黙の 1 のビットがあるとみなす表現法（いわゆる「ケチ表現」）により、通常の数（正規化された数）の精度は、24ビット相当である。従って十進に換算したとき表現できる桁数は log(2) ≈ 7.225 桁となる。標準化されたレイアウトは以下のようになる。
符号ビットを sign、バイアスつきの指数部を e、23ビットの仮数部の各ビットを b とすると、32ビットの binary32 フォーマットで表される数値は formula_1 となり、より正確に表現すると formula_2 となる。
単精度バイナリ浮動小数点数の指数部はオフセット表現を使って符号化されており、指数値がゼロのときのオフセット値（バイアス値）は127である。指数部バイアスは、エクセスNとも言う。詳しくは符号付数値表現を参照されたい。真の指数値は、指数部の値から指数部バイアスを引いた値となる。
00 と FF は予約された指数値である。
従って、全てのビットパターンが符号として意味がある。正の最小値（非正規化数）は 2 ≈ 1.4 × 10 である。正の正規化数の最小値は 2 ≈ 1.18 × 10 である。表現可能な最大値は (2−2) × 2 ≈ 3.4 × 10 である。
IEEE754 では実数値から対応する binary32 フォーマットへの変換を丸めも含めて厳密に定めている。
ここでは十進の実数値から IEEE 754 binary32 フォーマットへの変換は大まかに次のようになる。
小数部の変換:
12.375 の小数部 0.375 を例とする。これを二進の小数に変換するため、小数部に2をかけて整数部をとり、さらに2をかけて整数部をとるというように繰り返していき、小数部がゼロになるか精度の上限である二進23桁になるまで続ける。
0.375 x 2 = 0.750 = 0 + 0.750 ⇒ b = 0 となるので、二進での小数部の一桁目はゼロとなる。そこでさらに 0.750 に2をかける。
0.750 x 2 = 1.500 = 1 + 0.500 ⇒ b = 1
0.500 x 2 = 1.000 = 1 + 0.000 ⇒ b = 1 となり、小数部が 0.000 となったのでここで変換は停止する。
これで (0.375) は正確に二進で (0.011) で表されることがわかった。十進で有限桁数の小数が必ず二進で有限桁で表せるわけではない。例えば、十進の 0.1 は二進では正確に表現できないため近似値を用いることになる。
したがって、(12.375) = (12) + (0.375) = (1100) + (0.011) = (1100.011) となる。
IEEE 754 binary32 フォーマットでは、値を formula_3 という形式で表現しなければならないので、1100.011 をシフトして整数部が一桁になるようにしなければならない。この例では3桁シフトするので formula_4 となる。
最終的に formula_5 となる。
この結果から次が得られる。
したがって、IEEE 754 binary32 フォーマットで 12.375 を表すと 0-10000010-10001100000000000000000 = 41460000 となる。
注: 68.123 を IEEE 754 binary32 フォーマットで表す場合を考えてみよう。上述の技法を適用すると 42883EF9 というビット列が得られ、最後の4ビットは 1001 となる。しかし、IEEE 754 のデフォルトの丸め方式により最終的に 42883EFA となり、最後の4ビットは 1010 となる。
例: 十進の1を変換すると formula_6 となる。ここから次のことが導かれる。
従って実数 1 を IEEE 754 binary32 フォーマットで表すと 0-01111111-00000000000000000000000 = 3f800000 となる。
例: 0.25 を変換すると、formula_7 となる。ここから次のことが導かれる。
従って実数 0.25 を IEEE 754 binary32 フォーマットで表すと 0-01111101-00000000000000000000000 = 3e800000 となる。
例: 0.375 を変換すると、formula_8 となる。ここから次のことが導かれる。
従って実数 0.375 を IEEE 754 binary32 フォーマットで表すと 0-01111101-10000000000000000000000 = 3ec00000 となる。
浮動小数点数値のビット列を十六進法で表した例を以下に示す。これには符号、バイアスを加えた指数値、仮数値が含まれている。
1/3 は倍精度とは異なり、切り上げられる。これは仮数部のビット数が偶数であるため、丸める桁位置以降が codice_1 となってその桁位置で 1/2 より大きくなるためである。
16進の値 41c80000 を例として変換を行う。これを二進で表すと次のようになる。
これを、符号ビット、指数部、仮数部の3つに分割する。
ここで仮数部に暗黙の整数ビットを加える。
指数部の値から127を引いて実際の指数値を得る。
24ビットの仮数は最上位ビットが1に対応し、次の桁が0.5、その次が0.25というように、前の桁の1/2に対応している。
この例では、仮数で立っているビットは bit 23、bit 22、bit 19 の3ビットだけであり、上記の対応する値を加算することで十進での仮数が得られる。
基数 2 を指数値でべき乗したものを仮数にかけると本来の値が得られる。
従って
となる。これは次の式と等価である。
ここで formula_10 は符号ビット、formula_11 は指数部、formula_12 は仮数を基数10で表したものである。
MSX-BASICの演算ルーチンMATHPACKの場合、同様に4バイトで表すが、IEEE 754とは異なり
 syyy yyyy xxxx xxxx xxxx xxxx xxxx xxxx
であり、指数部をバイナリ、仮数部をBCDで表現する。
そのため、有効数字は正確に10進で6桁で、指数は±63乗である。
同時期の8ビットパソコンのBASICでは、多くがBCDではなく2進での演算であった（十進で計算すると誤差がない、などといった主張が大変しばしば見られるが、1.0/3.0 が正確に計算できないのは十進でも同様であり大変な誤解である。十進計算と二進計算の得失はそれぞれあるので、一概にどちらが優れているなどとは言えるものではない）。