浮動小数点リテラル
浮動小数点リテラルは、ソースファイルで値が指定されるコンパイル時定数を定義します。
目次 |
[編集] 構文
| digit-sequence decimal-exponent suffix (オプション) | (1) | ||||||||
digit-sequence . decimal-exponent (オプション) suffix (オプション) |
(2) | ||||||||
digit-sequence (オプション) . digit-sequence decimal-exponent (オプション) suffix (オプション) |
(3) | ||||||||
0x | 0X hex-digit-sequence hex-exponent suffix (オプション) |
(4) | (C++17以降) | |||||||
0x | 0X hex-digit-sequence . hex-exponent suffix (オプション) |
(5) | (C++17以降) | |||||||
0x | 0X hex-digit-sequence (オプション) . hex-digit-sequence hex-exponent suffix (オプション) |
(6) | (C++17以降) | |||||||
decimal-exponent は以下の形式です。
e | E exponent-sign (オプション) digit-sequence |
|||||||||
hex-exponent は以下の形式です。
p | P exponent-sign (オプション) digit-sequence |
(C++17以降) | ||||||||
exponent-sign は、存在する場合、+ または - のいずれかです。
suffix は、存在する場合、f、 l、 F、 L、 f16、 f32、 f64、 f128、 bf16、 F16、 F32、 F64、 F128、 BF16(C++23以降) のいずれかです。サフィックスは浮動小数点リテラルの型を決定します。
- (サフィックスなし) は double を定義します。
-
f Fは float を定義します。 -
l Lは long double を定義します。
|
(C++23から) |
|
オプションで、数字の間に区切り文字としてシングルクォート (') を挿入できます。これらはリテラルの値を決定する際には無視されます。 |
(C++14以降) |
[編集] 説明
10進数の科学的記法が使用されます。これは、浮動小数点リテラルの値が、仮数に decimal-exponent の累乗である10を掛けたものであることを意味します。例えば、123e4 の数学的意味は 123×104 です。
|
浮動小数点リテラルが文字列 _16進浮動小数点リテラル_ の場合、仮数は16進数の有理数として解釈され、指数の digit-sequence は、仮数をスケーリングする必要がある2の(10進数)整数べき乗として解釈されます。 double d = 0x1.4p3; |
(C++17以降) |
[編集] 備考
16進浮動小数点リテラルはC++17までC++の一部ではありませんでしたが、C++11以降、I/O関数で解析および出力できます。C++のI/Oストリーム (std::hexfloat が有効な場合) とCのI/Oストリーム (std::printf、 std::scanf など) の両方で対応しています。std::strtof で書式の説明を参照してください。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_hex_float |
201603L |
(C++17) | 16進浮動小数点リテラル |
[編集] 例
#include <iomanip> #include <iostream> #include <limits> #include <typeinfo> #define OUT(x) '\n' << std::setw(16) << #x << x int main() { std::cout << "Literal" "\t" "Printed value" << std::left << OUT( 58. ) // double << OUT( 4e2 ) // double << OUT( 123.456e-67 ) // double << OUT( 123.456e-67f ) // float, truncated to zero << OUT( .1E4f ) // float << OUT( 0x10.1p0 ) // double << OUT( 0x1p5 ) // double << OUT( 0x1e5 ) // integer literal, not floating-point << OUT( 3.14'15'92 ) // double, single quotes ignored (C++14) << OUT( 1.18e-4932l ) // long double << std::setprecision(39) << OUT( 3.4028234e38f ) // float << OUT( 3.4028234e38 ) // double << OUT( 3.4028234e38l ) // long double << '\n'; static_assert(3.4028234e38f == std::numeric_limits<float>::max()); static_assert(3.4028234e38f == // ends with 4 3.4028235e38f); // ends with 5 static_assert(3.4028234e38 != // ends with 4 3.4028235e38); // ends with 5 // Both floating-point constants below are 3.4028234e38 static_assert(3.4028234e38f != // a float (then promoted to double) 3.4028234e38); // a double }
実行結果の例
Literal Printed value 58. 58 4e2 400 123.456e-67 1.23456e-65 123.456e-67f 0 .1E4f 1000 0x10.1p0 16.0625 0x1p5 32 0x1e5 485 3.14'15'92 3.14159 1.18e-4932l 1.18e-4932 3.4028234e38f 340282346638528859811704183484516925440 3.4028234e38 340282339999999992395853996843190976512 3.4028234e38l 340282339999999999995912555211526242304
[編集] 参照
- C++23標準 (ISO/IEC 14882:2024)
- 5.13.4 浮動小数点リテラル [lex.fcon]
- C++20 standard (ISO/IEC 14882:2020)
- 5.13.4 浮動小数点リテラル [lex.fcon]
- C++17 standard (ISO/IEC 14882:2017)
- 5.13.4 浮動小数点リテラル [lex.fcon]
- C++14 standard (ISO/IEC 14882:2014)
- 2.14.4 浮動小数点リテラル [lex.fcon]
- C++11 standard (ISO/IEC 14882:2011)
- 2.14.4 浮動小数点リテラル [lex.fcon]
- C++98 標準 (ISO/IEC 14882:1998)
- 2.13.3 浮動小数点リテラル [lex.fcon]
[編集] 関連項目
| ユーザー定義リテラル(C++11) | ユーザー定義サフィックス付きリテラル |
| Cドキュメント (浮動小数点定数)
| |