浮動小数点数
[Wikipedia|▼Menu]

浮動小数点数(ふどうしょうすうてんすう、: floating-point number)は、実数コンピュータで処理(演算や記憶、通信)するために有限桁の小数で近似値として扱う方式であり[1]コンピュータの数値表現として広く用いられている。多くの場合、符号部、固定長の指数部、固定長の仮数部、の3つの部分を組み合わせて、数値を表現する。
概要

この節はパターソンらの記述に基づく[1]

実数は0以上かつ1以下のような有限の範囲でも、無限個の値(種類)が存在するため、コンピュータでは妥当なビット数で有限個の値(種類)の近似値で扱う必要がある。

実数-1/3は10進数表現では無限小数となるが、有限桁の小数で近似値を表記できる。下の例では10進数での4桁としている。-1/3-1 x 0.33333333333333...-1 x 0.3333 x 100-1 x 3.333 x 10-1

下の2つの表記は科学記数法 (scientific notation) とよばれ、小数点より左側の整数部分を1桁とする。科学記数法のうち、仮数部の最上位の桁が0以外(10進表記では1から9)であるものを、正規化数 (normalized number) とよび、上記の最後の表示が該当する。

実数-1/3はまた、2進数でもその近似値を有限桁の小数で表記できる。下の例では2進数17桁としている。-1/3-1 x 0.01010101010101010101010101010101...-1 x 0.0101010101010101-1 x (2-2 + 2-4 + 2-6 + 2-8 + 2-10 + 2-12 + 2-14 + 2-16)-1 x (1/4 + 1/16 + 1/64 + 1/256 + 1/1024 + 1/4096 + 1/16384 + 1/65536)-0.333328247(近似値の10進数表記)

2進数の小数も科学記数法で表記できる。-1 x 0.0101010101010101 x 20-1 x 0.101010101010101 x 2-1-1 x 1.01010101010101 x 2-2

上記は同じ値を、小数点の位置を移動し異なる表記にしているため、浮動小数点と呼ばれる。一番下の表記は、正規化数である。

コンピュータ内部での演算処理に最も適した浮動小数点数の表現は基数2であり、符号 (sign) S、仮数 (significand) F、指数 (exponent) Eにより下記の式で表記できる。(-1)S x F x 2E

数値に対する演算をあまり行なわずに数値を格納したり比較をする場合,あるいは演算が10進数でなければ正しく表せないような(お金の計算などの)用途では,計算機内部で10進数表現が用いられる場合がある。
浮動小数点数のフォーマット

浮動小数点数のフォーマットには、以下で説明するものの他、以前は多数あった。

IEEE方式(IEEE 754。最も広く採用されている標準規格

IBM方式(IBMのメインフレームおよびそれを模倣した各社の互換マシンで使われていた。指数部を基数16で表現するのが特徴)

指数部と仮数部を可変とする方式(これは研究用の面が強い。以下の該当する節で詳述)

IEEE方式(IEEE 754 形式)詳細は「IEEE 754」を参照「半精度」、「単精度」、「倍精度」、および「四倍精度」も参照単精度浮動小数点数型式
sign:符号部、exponent:指数部、fraction:仮数部倍精度浮動小数点数型式

IEEE 754 形式の

半精度浮動小数点数では、符号部 1 ビット ・ 指数部 5 ビット ・ 仮数部 10 ビット

単精度浮動小数点数では、符号部 1 ビット ・ 指数部 8 ビット ・ 仮数部 23 ビット

倍精度浮動小数点数では、符号部 1 ビット ・ 指数部 11 ビット ・ 仮数部 52 ビット

四倍精度浮動小数点数では、符号部 1 ビット ・ 指数部 15 ビット ・ 仮数部 112 ビット

で表現されている。各部は次のように定義されている。

符号部は、 0 を正、1 を負とする

仮数部は、整数部分が 1 であるような2進小数の小数部分(ケチ表現)を表す

指数部は、符号なし2進整数とし、半精度では 15、単精度では 127、倍精度では 1023、四倍精度では 16383 のゲタを履かせたゲタ履き表現で表す

つまり、IEEE 754 形式で表現する値は半精度の場合: (−1)符号部 × 2指数部 − 15 ×(1 + 仮数部)単精度の場合: (−1)符号部 × 2指数部 − 127 ×(1 + 仮数部)倍精度の場合: (−1)符号部 × 2指数部 − 1023 ×(1 + 仮数部)四倍精度の場合: (−1)符号部 × 2指数部 − 16383 ×(1 + 仮数部)

である。

ただし、IEEE 754 形式の指数部は複雑で、以下のような役割も持つ。

通常の浮動小数点数(正規化数)を表現するのは、指数部が単精度で 254 ? 1(127 ? −126)、倍精度で 2046 ? 1(1023 ? −1022)の範囲のときである

指数部が、単精度の場合 255(128)、倍精度の場合 2047(1024)のとき:仮数部が 0 以外の場合は、非数(NaN; Not a Number)を表す仮数部が 0 の場合は、符号部が 0 のときは正の無限大、符号部が 1 のときは負の無限大を表す

指数部が 0(単精度の場合 −127、倍精度の場合 −1023)のとき:非正規化数

指数部、仮数部ともに 0 のときは ±0 を表す

0 を 0 で割ろうとすると NaN になる。また、 − 1 {\displaystyle {\sqrt {-1}}} も、求めるとNaNになる。
IEEE 754 で表現するまでの過程

2.5を例にとると、

仮数の符号は、+

仮数の絶対値は、2.5

IEEE 754の基数は、2で固定(簡単のため、以下では省略)

指数は、0

であることから、まず次のように考える。(−1)0 × 2.5 × 20

仮数部は1未満でなければならないため、仮数の値2.5を(この例では右へ)シフトし正規化する。基数は2、コンピュータの内部表現は2進法であるため、シフト量は1ビットである。さらに、右シフトして.mw-parser-output .frac{white-space:nowrap}.mw-parser-output .frac .num,.mw-parser-output .frac .den{font-size:80%;line-height:0;vertical-align:super}.mw-parser-output .frac .den{vertical-align:sub}.mw-parser-output .sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}1⁄2になったことを相殺するため、指数に1を加える(もし左シフトなら、指数から1を引く)。値をシフトすることで表現範囲を広げ、丸め誤差を少なくなるようにしている。この操作を正規化という。正規化は基数の±1乗を繰り返し求めればよい。

このままでは (−1)0 × 1.25 × 21 となり、仮数の絶対値は1未満ではないが、仮数部は 仮数 − 1 と決められているため、次のようになる。(−1)0 × (1 + 0.25) × 21

符号部は、0

仮数部は、0.25

指数は、1

指数部は、指数に127をバイアスすることが決まっているため(−1)0 × (1 + 0.25) × 2(128 − 127)

符号部は、0

仮数部は、0.25

指数部は、128

2進法では、

符号部(1ビット):+ → 0

仮数部(23ビット):0.25 → 01000000000000000000000

指数部(8ビット):128 → 10000000

浮動小数点は、最上位ビットから符号部、指数部、仮数部の順に符号化するため2進値:01000000001000000000000000000000、16進値:40200000
bfloat16

IEEE 754 形式から派生した浮動小数点数の形式。符号部 1 ビット ・ 指数部 8 ビット ・ 仮数部 7 ビットである。

つまり、bfloat16 形式で表現する値は(−1)符号部 × 2指数部 − 127 ×(1 + 仮数部)

である。

採用事例

インテル - Intel Xeon Cooper Lake マイクロアーキテクチャ以降、Nervana NNP-L1000 など

ARMアーキテクチャ - Armv8.6-A[2]

Google - Tensor Processing Unit 2.0 以降

NVIDIA - Ampere マイクロアーキテクチャ以降

Amazon.com - AWS Inferentia、Amazon Elastic Inference など

FP8

IEEE 754 形式から派生した浮動小数点数の形式。以下の2種類がある。

E4M3 - 符号部 1 ビット ・ 指数部 4 ビット ・ 仮数部 3 ビット

E5M2 - 符号部 1 ビット ・ 指数部 5 ビット ・ 仮数部 2 ビット

採用事例

NVIDIA - Hooper マイクロアーキテクチャ以降[3]

FP6、FP4もNvidia社がGPU製品Blackwell(2024年3月発表)でAI用を想定して導入した。
IBM方式「en:IBM hexadecimal floating-point」も参照

IBM方式は、IBM社がSystem/360で導入し、以後同社の標準としてSystem/370などのメインフレームで使った方式である(System/390では、従来形式のサポートは残すもののIEEE 754を使用するよう改めた)。指数部が2のではなく16の冪を表すという特徴がある。この方式は、より大きな範囲を少ないビット数の指数部で表すことができ、そのぶんのビットを仮数部の桁数に使うことで精度も確保できるように一見思える。しかし、仮数部にケチ表現を使うことができず、さらに指数部の変化の前後で、仮数部のLSBが表現する値の刻み幅が16倍変化するため、2べきの場合に比べて最悪の場合には2進で3ビット分の精度が損なわれるため、一般には大成功であったと評されたSystem/360の設計において良くなかった点の一つとして挙げられる。(浮動小数点数の加減算の際に必要となる仮数部のシフトが4ビット単位となるのでシフト回数が減ることで演算が@media screen{.mw-parser-output .fix-domain{border-bottom:dashed 1px}}15%[要出典]程度高速になる利点も16進数が採用された理由であった。)

特に単精度において、前世代機のIBM 7094(全部で36ビット)よりも桁数を減らした(32ビット)ことと相まって精度が大きく損なわれた。その他にも問題があり、ユーザグループであるSHAREから改善提案が出され、その多くを受け入れて多大なコストのかかる改修をおこなったほどであり、これを記憶しているIBMの古参社員は「身の縮む思い」をおぼえているという[4]

また、計算対象の数値がベンフォードの法則に従って分布していた場合、計算対象として精度の低い数(仮数部の最上位4ビットが0b0001)の現れる確率は1/15にはならず、もっと高い[5]

IBM方式の単精度浮動小数点数では、符号部1ビット、指数部7ビット、仮数部24ビットで表現されている。各部は次のように定義されている。

符号部は、0を正、1を負とする

仮数部は、1未満の16進小数とする

指数部は、16を基数とした指数に64をバイアスした値で表す

符号部は仮数の符号を表す。指数部は−1663?−16−64と16−64?1663の範囲が表現できる。
IBM方式で表現するまでの過程

1.5を単精度のIBM方式で表現するには、次のようになる。(−1)0 × 1.5 × 160

仮数部は1未満でなければならないため、値を(この例では右へ)シフトする。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:47 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef