単精度浮動小数点数
[Wikipedia|▼Menu]

情報処理において、単精度浮動小数点数 (たんせいどふどうしょうすうてんすう、: single-precision floating-point number)は、コンピュータの数値表現の一種である。本来の単精度浮動小数点数とは、倍精度浮動小数点数に対比して使われる用語であって倍精度浮動小数点数が無いシステムであれば単に浮動小数点数と呼ばれるべきものである(また浮動小数点数はもともと固定小数点数と対比させた言葉であった)。そうして、単精度はシステムの基本となる精度であり、バイトマシン(キャラクターマシン)が普通になる前のワードマシンにおいて1語長分の記憶場所を占める浮動小数点数であるのが普通である。昔のFORTRAN言語では、整数型と実数型は同じ語長を占めることを前提に言語の規格が制定されていたりもした。その記憶語1単位分のを占める実数型が単精度であり、記憶語2単位分を占める実数型は倍精度と呼ばれた。Crayのベクトルマシンのような語長が64ビットである科学技術専用計算機では、たとえば単精度とは64ビットを意味した。

現在の浮動小数点形式の標準であるIEEE 754では、単精度は32ビット(4オクテット)、倍精度64ビット(8オクテット)である。IEEE 754-2008 では単精度の形式は正式には binary32 と呼ばれている。「単」や「倍」という表現は32ビットを1ワードとする32ビットアーキテクチャを基にしている。

単精度浮動小数点数は、同じ幅の固定小数点数に比べてより広範囲な数値を表せるようになっているが、同時に精度を犠牲にしている。

ほとんどのプログラミング言語では標準の組み込み型として定義されている。C言語C++C#JavaHaskellでは単精度のデータ型を float と呼ぶ[1]が、C/C++の規格ではIEEE 754に準拠することは要求されていない。MATLABでは single と呼ぶ。PascalおよびVisual Basic .NETでは Single と呼ぶ。.NET Framework共通型システムではSystem.Single構造体型として定義されており、各.NET言語における組み込み型はこの型へのエイリアスである。@media screen{.mw-parser-output .fix-domain{border-bottom:dashed 1px}}バージョン3.2以前のOctaveでは single という名前だが倍精度である[要出典]。Pythonの float は倍精度であり、単精度のサポートはない。F#の単精度は float32 または single であり、倍精度は float または double である。
IEEE 754 での単精度浮動小数点数の形式: binary32

IEEE 754 での binary32 の定義は次の通りである。

符号ビット: 1ビット

指数部の幅: 8ビット

仮数部の幅: 23ビット

符号ビットは表現する数値の符号(正負)を示す。指数部は 8 ビットで、符号なし整数として見た場合は 0 から 255 の値をとり、0 の時はゼロか非正規化数であることを、1 から 254 の時は -127 のゲタ履き(バイアス付き)表現で -126 から 127 の指数を、255 の時は無限大または NaN であることを示す。

指数部が 0(ゼロ、および非正規化数)の場合を除き、仮数部で表現されるビットパターンのさらにひとつ上のケタに暗黙の 1 のビットがあるとみなす表現法(いわゆる「ケチ表現」)により、通常の数(正規化された数)の精度は、24ビット相当である。従って十進に換算したとき表現できる桁数は log10(224) ? 7.225 桁となる。標準化されたレイアウトは以下のようになる。

符号ビットを sign、バイアスつきの指数部を e、23ビットの仮数部の各ビットを b-n とすると、32ビットの binary32 フォーマットで表される数値は ( − 1 ) sign ( 1. b − 1 b − 2 . . . b − 23 ) 2 × 2 e − 127 {\displaystyle (-1)^{\text{sign}}(1.b_{-1}b_{-2}...b_{-23})_{2}\times 2^{e-127}} となり、より正確に表現すると value = ( − 1 ) sign ( 1 + ∑ i = 1 23   b − i 2 − i ) × 2 e − 127 {\displaystyle {\text{value}}=(-1)^{\text{sign}}\left(1+\sum _{i=1}^{23}\ b_{-i}2^{-i}\right)\times 2^{e-127}} となる。
指数部の符号化方式

単精度バイナリ浮動小数点数の指数部はオフセット表現を使って符号化されており、指数値がゼロのときのオフセット値(バイアス値)は127である。

Emin = 01H?7FH = ?126

Emax = FEH?7FH = 127

指数部バイアス = 7FH = 127

指数部バイアスは、エクセスNとも言う。詳しくは符号付数値表現を参照されたい。真の指数値は、指数部の値から指数部バイアスを引いた値となる。

00H と FFH は予約された指数値である。

指数部仮数部がゼロの場合仮数部がゼロでない場合式
00H0, ?0非正規化数(?1)signbits×2?126× 0.significandbits
01H, ..., FEH正規化数(?1)signbits×2exponentbits?127× 1.significandbits
FFH±無限NaN (quiet, signalling)

従って、全てのビットパターンが符号として意味がある。正の最小値(非正規化数)は 2?149 ? 1.4 × 10?45 である。正の正規化数の最小値は 2?126 ? 1.18 × 10?38 である。表現可能な最大値は (2?2?23) × 2127 ? 3.4 × 1038 である。
十進表現から binary32 フォーマットへの変換

IEEE754 では実数値から対応する binary32 フォーマットへの変換を丸めも含めて厳密に定めている。

ここでは十進の実数値から IEEE 754 binary32 フォーマットへの変換は大まかに次のようになる。

実数値を 12.375 のように整数部と小数部で表すものとする。

整数部を
二進法で表現したものに変換する。

小数部を以下に示す技法で変換する。

2つの変換結果を組み合わせ、さらに変換を加えて最終的な表現を得る。

小数部の変換:

12.375 の小数部 0.375 を例とする。これを二進の小数に変換するため、小数部に2をかけて整数部をとり、さらに2をかけて整数部をとるというように繰り返していき、小数部がゼロになるか精度の上限である二進23桁になるまで続ける。

0.375 x 2 = 0.750 = 0 + 0.750 ⇒ b?1 = 0 となるので、二進での小数部の一桁目はゼロとなる。そこでさらに 0.750 に2をかける。

0.750 x 2 = 1.500 = 1 + 0.500 ⇒ b?2 = 1

0.500 x 2 = 1.000 = 1 + 0.000 ⇒ b?3 = 1 となり、小数部が 0.000 となったのでここで変換は停止する。

これで (0.375)10 は正確に二進で (0.011)2 で表されることがわかった。十進で有限桁数の小数が必ず二進で有限桁で表せるわけではない。例えば、十進の 0.1 は二進では正確に表現できないため近似値を用いることになる。

したがって、(12.375)10 = (12)10 + (0.375)10 = (1100)2 + (0.011)2 = (1100.011)2 となる。

IEEE 754 binary32 フォーマットでは、値を ( 1. x 1 x 2 . . . x 23 ) 2 × 2 e {\displaystyle (1.x_{1}x_{2}...x_{23})_{2}\times 2^{e}} という形式で表現しなければならないので、1100.011 をシフトして整数部が一桁になるようにしなければならない。この例では3桁シフトするので ( 1.100011 ) 2 × 2 3 {\displaystyle (1.100011)_{2}\times 2^{3}} となる。

最終的に ( 12.375 ) 10 = ( 1.100011 ) 2 × 2 3 {\displaystyle (12.375)_{10}=(1.100011)_{2}\times 2^{3}} となる。

この結果から次が得られる。

指数部は 3 となる(バイアスを加えるので実際は 130 = 1000 0010 となる)。

仮数部は 100011 となる(小数点より右側だけを仮数とする)。

したがって、IEEE 754 binary32 フォーマットで 12.375 を表すと 0-10000010-10001100000000000000000 = 41460000H となる。

注: 68.123 を IEEE 754 binary32 フォーマットで表す場合を考えてみよう。上述の技法を適用すると 42883EF9H というビット列が得られ、最後の4ビットは 1001 となる。しかし、IEEE 754 のデフォルトの丸め方式により最終的に 42883EFAH となり、最後の4ビットは 1010 となる。

例: 十進の1を変換すると ( 1 ) 10 = ( 1.0 ) 2 × 2 0 {\displaystyle (1)_{10}=(1.0)_{2}\times 2^{0}} となる。ここから次のことが導かれる。

指数は 0 である(バイアスを加えるので 127 = 0111 1111 となる)。

仮数は 0 である(小数点より右側はゼロなので仮数部のビット列は全てゼロになる)。

従って実数 1 を IEEE 754 binary32 フォーマットで表すと 0-01111111-00000000000000000000000 = 3f800000H となる。

例: 0.25 を変換すると、 ( 0.25 ) 10 = ( 1.0 ) 2 × 2 − 2 {\displaystyle (0.25)_{10}=(1.0)_{2}\times 2^{-2}} となる。ここから次のことが導かれる。

指数は -2 である(バイアスを加えるので 127+(?2)= 125 = 0111 1101 となる)。

仮数は 0 である(小数点より右側はゼロなので仮数部のビット列は全てゼロになる)。

従って実数 0.25 を IEEE 754 binary32 フォーマットで表すと 0-01111101-00000000000000000000000 = 3e800000H となる。

例: 0.375 を変換すると、 0.375 = ( 1.1 ) 2 × 2 − 2 {\displaystyle 0.375={(1.1)_{2}}\times 2^{-2}} となる。ここから次のことが導かれる。

指数は -2 である(バイアスを加えるので 127+(?2)= 125 = 0111 1101 となる)。

仮数は 1 である(1.1 の小数点より右側は 1 = x1 のみである)。

従って実数 0.375 を IEEE 754 binary32 フォーマットで表すと 0-01111101-10000000000000000000000 = 3ec00000H となる。
単精度浮動小数点数の例


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

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