namespace std {
#if defined(__STDCPP_FLOAT128_T__)
using float128_t = implementation-defined;
#endif
}
概要
128ビット四倍精度の浮動小数点数型。
内部表現
この型は、ISO/IEC/IEEE 60559 (IEEE 754) 浮動小数点数規格のbinary128フォーマットをもつ。
| 符号ビット数 |
指数ビット数 |
仮数ビット数 |
最大指数 |
| 1 |
15 |
112 |
16383 |
リテラル
値にサフィックスとしてf128もしくはF128を指定することで、std::float128_tのリテラルとすることができる。
std::float128_t a = 1.0f128;
std::float128_t b = 2.0F128;
事前定義マクロ
- この型は、事前定義マクロ
__STDCPP_FLOAT128_T__が定義されない場合、定義されない
- ISO/IEC/IEEE 60559 (IEEE 754) のbinary128フォーマットが実装される環境でこのマクロは定義される
順位
浮動小数点数の変換で使用される順位 (rank) は、以下のように定義される:
long double > double > floatのように、long doubleが最も高い順位をもつ
- 同じ値集合をもつ2つの拡張浮動小数点数型は、同じ順位をもつ
- 1つの標準浮動小数点数型だけと同じ値集合をもつ拡張浮動小数点数型は、その型と同じ順位をもつ
- 2つ以上の標準浮動小数点数型と同じ値集合をもつ拡張浮動小数点数型は、
doubleと同じ順位をもつ
注意として、浮動小数点数型T1の値集合が浮動小数点数型T2の値集合の部分集合でも上位集合でもない場合、浮動小数点数型T1とT2の変換順位は定義されない。これは、一方の型が他方より大きな範囲と低い精度の両方を持つ場合に起こり得る。例えば、std::float16_tとstd::bfloat16_tの間には変換順位が付かず、相互に暗黙変換できない。
順位が同じ浮動小数点数型は、サブ順位 (subrank) で順序付けられる。拡張浮動小数点数は、標準浮動小数点数型よりも大きなサブ順位をもつ。
昇格と変換
C言語の名残と後方互換性のために、オーバーロード解決でのfloatからdoubleへの変換は昇格と見なされるが、ほかの浮動小数点数型では昇格はない。
2つの浮動小数点型の少なくとも一方が拡張浮動小数点型である場合、変換先の型が変換元の型より大きいか等しい場合にのみ、2つの浮動小数点型間の変換が暗黙的に行われる。いかなる暗黙の変換も損失なく、値を正確に保持する。潜在的に損失のある変換はすべて明示的でなければならない。
小さい精度への変換は、()と{}による直接初期化、もしくは明示的なキャストのみ許可される。
通常の算術変換
算術演算での型変換は、以下のような規則で行われる。
- どちらかのオペランドが浮動小数点数型である場合、
- 両方のオペランドが同じ型であれば、型変換は行われない
- そうでなく、オペランドの一方が浮動小数点数型でなければ、浮動小数点数型のオペランドの型に変換される
- そうでなく、オペランドの浮動小数点数型の変換順位が等しくない場合、小さい方の順位をもつ浮動小数点数型は、もう一方の浮動小数点数型に変換される
float + doubleはdoubleに、std::float16_t + floatはfloatに変換される
- そうでなく、変換順位が等しい場合、サブ順位で比較が行われ、より大きいサブ順位をもつ浮動小数点数型に変換される
float + std::float32_tはstd::float32_tに変換される
- そうでなければ、式は不適格となる
std::float16_t + std::bfloat16_tは不適格
オーバーロード解決
- 浮動小数点数型の変換をともなうオーバーロード解決は、値を維持する変換が優先され、同じ変換順位をもつ他の浮動小数点数型への変換が優先して行われる
- 値を維持する変換が曖昧な場合、プログラムは不適格となる
- 「ひとつ上の順位をもつ浮動小数点数型に変換する」のような規則ではないため、ひとつ以上上の順位をもつ浮動小数点数型の候補が複数あると曖昧になる
備考
- この型は、C23で定義されるオプションキーワード
_Float128の別名として定義されることになるだろう
- この型は、
_Float128と相互運用できるよう実装されることが望ましい
- この型が定義される環境はISO/IEC/IEEE 60559 (IEEE 754) 準拠であるため、同じ変換順位をもつ浮動小数点数型 (
floatとstd::float32_tのような) は同じ内部表現をもつ
例
出力
1.09863
バージョン
言語
処理系
関連項目
参照