基本データ型浮動小数点数型
IAR C/C++ コンパイラ for Armでは、浮動小数点数の値を標準IEC 60559 フォーマットで表現します。 各浮動小数点数型のサイズを以下に示します。
タイプ | サイズ | 範囲 (+/-) | 10進数 | 指数部 | 仮数部 | アライメント |
|---|---|---|---|---|---|---|
16ビット | ±2E-14 to 65504 | 3 | 5ビット | 11ビット | 2 | |
32ビット | ±1.18E-38 ~ ±3.40E+38 | 7 | 8ビット | 23ビット | 4 | |
64ビット | ±2.23E-308 ~ ±1.79E+308 | 15 | 11ビット | 52ビット | 8 | |
64ビット | ±2.23E-308 ~ ±1.79E+308 | 15 | 11ビット | 52ビット | 8 |
Cortex-M0および Cortex-M1の場合、コンパイラは非正規化数をサポートしません。非正規化数を生成する演算では、非正規化数の代わりにすべてゼロが生成されます。 その他のコアにおける非正規化数の表現については、特殊な浮動小数点数の表現を参照してください。
__fp16浮動小数点型は、ストレージ型のみです。すべての数値操作は、floatに拡張される値で動作します。__fp16とレイアウトの互換性がある、標準型_Float16もあります。一部のコアは、_Float16 値で直接数値操作をサポートします。その他のコアは、ストレージ専用型です。
注記
C/C++標準ライブラリは _Float16型をサポートしません。_Float16型で標準ライブラリ関数を使用する場合は、 _Float16値を単精度または倍精度にキャストし、適したライブラリ関数を使用する必要があります。_Float16型の文字列フォーマット指定子がないため、明示的なキャストが必要になります。
浮動小数点環境
浮動小数点値の例外フラグは、VFPユニットを持つデバイスでサポートされており、これらはfenv.hファイルで定義されます。VFPユニットを持たないデバイスの場合、fenv.hファイルで定義された関数は存在しますが、これらに機能はありません。
feraiseexcept関数は、FE_OVERFLOWやFE_UNDERFLOWを使用して呼び出された場合、inexact浮動小数点例外を引き起こしません。
32ビット浮動小数点数フォーマット
32ビット浮動小数点数を整数として表現すると、以下のようになります。

指数部は8ビット、仮数部は23ビットです。
値は以下のようになります。
(-1)S * 2(Exponent-127) * 1.Mantissa
範囲は少なくとも以下のようになります。
±1.18E-38 to ±3.39E+38
64ビット浮動小数点数フォーマット
64ビット浮動小数点数を整数として表現すると、以下のようになります。

指数部は11ビット、仮数部は52ビットです。
値は以下のようになります。
(-1)S * 2(Exponent-1023) * 1.Mantissa
範囲は少なくとも以下のようになります。
±2.23E-308 to ±1.79E+308
浮動小数点数の演算子(+、-、*、および/)の精度は、10進数で約15桁です。
特殊な浮動小数点数の表現
特殊な浮動小数点数の表現を以下に挙げます。
ゼロは、仮数部や指数部でゼロとして表現されます。符号ビットは、正または負のゼロを示します。
非数(
NaN)は、指数部を正の最大値に設定し、仮数部の最上位ビットを1に設定して表現されます。符号ビットの値は無視されます。非正規化数は、正規化数で表せる数値よりも小さい値を表現するときに使用します。この場合、値が小さくなるほど精度が低下するという欠点があります。指数部は0に設定され、数値が非正規化数であることを示します。ただし、数値は指数部が1である場合と同様に扱われます。正規化数とは異なり、非正規化数では仮数部の最上位ビット(MSB)に暗黙の1が設定されていません。非正規化数の値は次のようになります。
(-1)S * 2(1-BIAS) * 0.Mantissa
ここで、
BIASは、32ビットおよび64ビット浮動小数点値の場合、それぞれ127および1023です。