4.4.1. 基本データ型

ARM 浮動小数点値は、単精度倍精度 の 2 つのデータ型のどちらかに格納されます。 本書ではこれらのデータ型を、float および double と呼びます。 これらは C 言語の型に対応しています。

単精度

float 値は 32 ビット幅です。 Figure 4.3 は、この値の構造を示しています。

Figure 4.3. IEEE 754 単精度浮動小数点形式

IEEE 754 単精度浮動小数点形式

S フィールドは数値の符号を保持します。 正の場合は 0、負の場合は 1 です。

Exp フィールドは、数値の指数を 2 の累乗として表します。 この値には 0x7F(127)だけバイアスがかけられており、値が小さくなるほど指数はゼロに近くなり、値が大きくなるほど指数は 0xFF(255)に近くなります。

以下に例を示します。

  • Exp = 0x7D(125)の場合、数値は 0.25 〜 0.5 (0.5 を含まない)になります。

  • Exp = 0x7E(126)の場合、数値は 0.5 〜 1.0 (1.0 を含まない)になります。

  • Exp = 0x7F(127)の場合、数値は 1.0 〜 2.0 (2.0 を含まない)になります。

  • Exp = 0x80(128)の場合、数値は 2.0 〜 4.0 (4.0 を含まない)になります。

  • Exp = 0x81(129)の場合、数値は 4.0 〜 8.0 (8.0 を含まない)になります。

Frac フィールドは数値の小数部を表します。 通常は先頭に暗黙の 1 ビットがありますが、このビットは領域の節約のため格納されません。

したがって、Exp0x7F である場合、以下のようになります。

  • Frac = 00000000000000000000000 (2 進数)の場合、数値は 1.0 になります。

  • Frac = 00000000000000000000000 (2 進数)の場合、数値は 1.5 になります。

  • Frac = 00000000000000000000000 (2 進数)の場合、数値は 1.25 になります。

  • Frac = 00000000000000000000000 (2 進数)の場合、数値は 1.75 になります。

したがって通常、この形式のビットパターンの数値は、以下の式によって求められます。

(-1)S * 2(Exp-0x7F) * (1 + Frac * 2-23)

上記の形式で格納された数値を正規化数と呼びます。

指数の最大値 255 と最小値 0 が使用されるのは特殊なケースです。 指数 255 は無限大を表すために使用され、非数(NaN)値が格納されます。 無限大はゼロ除算の結果として発生するか、この形式で格納するには大きすぎる値の計算結果として発生します。 NaN 値は特殊な目的に使用されます。 無限大は、Exp を 255 に設定し、Frac をすべてゼロに設定することによって格納されます。 Exp が 255 で、Frac がゼロ以外である場合、ビットパターンは NaN を表します。

指数 0 は、非常に小さな数値を特殊な方法で表すために使用されます。 Exp がゼロの場合、Frac フィールドの先頭には暗黙の 1 が付加されません。 つまり、この形式では、ExpFrac の両方をすべて 0 ビットに設定することによって 0.0 を格納できます。 また、Exp >= 1 を使用して格納するには小さすぎる数値は、通常の 23 ビットよりも低い精度で格納されます。 このような数値を非正規化数と呼びます。

倍精度

double 値は 64 ビットの値です。Figure 4.4 は、この値の構造を示しています。

Figure 4.4. IEEE 754 倍精度浮動小数点形式

IEEE 754 倍精度浮動小数点形式

前述のとおり、S は符号、Exp は指数、Frac は小数部を表します。 以下の点を除いて、float 値の説明とほとんど同じです。

  • Exp フィールドには、0x7F ではなく 0x3FF (1023)のバイアスがかけられているため、1.0 〜 2.0 の数値の Exp フィールドは 0x3FF になります。

  • 無限大と NaN を表すために使用される Exp 値は、0xFF ではなく 0x7FF (2047)です。

サンプル値

このセクションでは、浮動小数点値のサンプルを示します。

単精度浮動小数点値

Table 4.14 は、float ビットパターンのサンプルとその数学上の値を示しています。

Table 4.14. 単精度浮動小数点値のサンプル

Float 値SExpFrac数学上の値備考[1]
0x3F80000000x7F000...0001.0-
0xBF80000010x7F000...000-1.0-
0x3F80000100x7F000...0011.000 000 119a
0x3F40000000x7E100...0000.75-
0x0080000000x01000...0001.18*10-38b
0x0000000100x00000...0011.40*10-45c
0x7F7FFFFF00xFE111...1113.40*1038d
0x7F80000000xFF000...000正の無限大-
0xFF80000010xFF000...000負の無限大-
0x0000000000x00000...0000.0e
0x7F80000100xFF000...001シグナル NaNf
0x7FC0000000xFF100...000クワイエット型 NaNf

[1] 詳細については、浮動小数点値のサンプルに関する備考を参照して下さい。

倍精度浮動小数点値

Table 4.15 は、double ビットパターンのサンプルとその数学上の値を示しています。

Table 4.15. 倍精度浮動小数点値のサンプル

Double 値SExpFrac数学上の値備考[1]
0x3FF00000 0000000000x3FF000...0001.0-
0xBFF00000 0000000010x3FF000...000-1.0-
0x3FF00000 0000000100x3FF000...0011.000 000 000 000 000 222a
0x3FE80000 0000000000x3FE100...0000.75-
0x00100000 0000000000x001000...0002.23*10-308b
0x00000000 0000000100x000000...0014.94*10-324c
0x7FEFFFFF FFFFFFFF00x7FE111...1111.80*10308d
0x7FF00000 0000000000x7FF000...000正の無限大-
0xFFF00000 0000000010x7FF000...000負の無限大-
0x00000000 0000000000x000000...0000.0e
0x7FF00000 0000000100x7FF000...001シグナル NaNf
0x7FF80000 0000000000x7FF100...000クワイエット型 NaNf

[1] 詳細については、「浮動小数点値のサンプルに関する備考」を参照して下さい。

浮動小数点値のサンプルに関する備考
a

1.0 より大きい値として表現可能な最小値です。1.0 との差異は、マシンイプシロンと呼ばれます。 この値は float では 0.000 000 119、double では 0.000 000 000 000 000 222 となります。 マシンイプシロンから、その形式で追跡可能な小数点以下の値を予想できます。float では小数点以下第 6 〜 7 位の値を、double では 15 〜 16 位の値を追跡できます。

b

各形式で正規化数として表現可能な最小値です。 この値よりも小さな値は非正規化数として格納されますが、精度は高くありません。

c

ゼロと区別できる最小の正の値です。 その形式の絶対下限値になります。

d

格納可能な最大の有限値です。 この値を加算または乗算によって増やそうとすると、オーバーフローが発生し、無限大が生成されます(通常)。

e

ゼロを表します。 厳密には正のゼロです。 符号ビットに 1 が設定されたゼロ、つまり負のゼロは、演算によっては異なる方法で処理されますが、比較演算(==!= など)では、いずれのゼロも同じものとして報告されます。

f

NaN には、シグナル NaN とクワイエット型 NaN の 2 種類があります。 クワイエット型 NaN では Frac の先頭ビットが 1 で、シグナル NaN ではゼロです。 その違いは、シグナル NaN を使用すると例外が発生しますが(例外を参照)、クワイエット型 NaN では例外が発生しません。

Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0349AJ
Non-Confidential