C++17では浮動小数点数リテラルに16進数を使うことができるようになった。
16進数浮動小数点数リテラルは、プレフィクス0x
に続いて仮数部を16進数(0123456789abcdefABCDEF
)で書き、p
もしくはP
に続けて指数部を10進数で書く。
double d1 = 0x1p0 ; // 1
double d2 = 0x1.0p0 ; // 1
double d3 = 0x10p0 ; // 16
double d4 = 0xabcp0 ; // 2748
指数部はe
ではなくp
かP
を使う。
double d1 = 0x1p0 ;
double d2 = 0x1P0 ;
16進数浮動小数点数リテラルでは、指数部を省略できない。
int a = 0x1 ; // 整数リテラル
0x1.0 ; // エラー、指数部がない
指数部は10進数で記述する。16進数浮動小数点数リテラルは仮数部に2の指数部乗を掛けた値になる。つまり、
0xNpM
という浮動小数点数リテラルの値は
となる。
0x1p0 ; // 1
0x1p1 ; // 2
0x1p2 ; // 4
0x10p0 ; // 16
0x10p1 ; // 32
0x1p-1 ; // 0.5
0x1p-2 ; // 0.25
16進数浮動小数点数リテラルには浮動小数点数サフィックスを記述できる。
auto a = 0x1p0f ; // float
auto b = 0x1p0l ; // long double
16進数浮動小数点数リテラルは、浮動小数点数が表現方法の詳細を知っている環境(たとえばIEEE--754)で、正確な浮動小数点数の表現が記述できるようになる。
機能テストマクロは__cpp_hex_float
, 値は201603。