Skip to content

Latest commit

 

History

History
63 lines (42 loc) · 1.53 KB

016-cpp17-core-hex-float.md

File metadata and controls

63 lines (42 loc) · 1.53 KB

16進数浮動小数点数リテラル

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ではなくpPを使う。

double d1 = 0x1p0 ;
double d2 = 0x1P0 ;

16進数浮動小数点数リテラルでは、指数部を省略できない。

int a = 0x1 ; // 整数リテラル
0x1.0 ; // エラー、指数部がない

指数部は10進数で記述する。16進数浮動小数点数リテラルは仮数部に2の指数部乗を掛けた値になる。つまり、

0xNpM

という浮動小数点数リテラルの値は

$N \times 2^M$

となる。

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。