C++1zから、浮動小数点数リテラルを16進数で表記できるようになります。
たとえば、IEEE 754で定められている、単精度浮動小数点数の正の正規化数のうち最小の値である2-126は、10進数表現では1.17549e-38f
ですが、16進数で表記すれば0x1.0p-126f
のように書きやすくなります。
#include <iostream> #include <limits> int main() { std::cout << std::numeric_limits<float>::min() << std::endl; // ライブラリ機能で最小値を取得 std::cout << 0x1.0p-126f << std::endl; // リテラルで最小値を直接表記する std::cout << std::hexfloat << 0x1.0p-126f << std::endl; // 16進数表記で出力 }
出力:
1.17549e-38 1.17549e-38 0x1p-126
標準ライブラリへの追従
C++11時点で、標準ライブラリでも浮動小数点数の16進数表現を扱ういくつかの機能がありました。
std::printf()
の%a
/%A
フォーマットは、浮動小数点数を16進数表現で出力します- 16進数表現の浮動小数点数を入出力するIOマニピュレータの
std::hexfloat
、それと元に戻すstd::defaultfloat
- 文字列を浮動小数点数に変換する
std::strtod()
とstd::strtold()
も16進数表現を扱えます
今回の機能追加は、ライブラリに言語機能が追従した形になります。
構文
浮動小数点数の16進数表現は、以下の構文になります:
- 頭に
0x
もしくは0X
を付ける (意味的な違いはない) - 仮数部
- 16進数の値
- 小数点 (仮数部の小数点数以下は省略可)
- 16進数の値
- 指数部
p
- 符号 (
+
か-
か指定なし) - 10進数の指数
- 浮動小数点数の型を決めるサフィックス
また、浮動小数点数の16進数リテラルもまた、ユーザー定義浮動小数点数リテラルの対象となります。
参照
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。