浮點數字面量
出自 cppreference.com
浮點數字面量定義了一個編譯期常數,其值在原始程式碼檔案中指定。
目錄 |
[編輯] 語法
| 數字序列 十進位指數 後綴 (選填) | (1) | ||||||||
數字序列 . 十進位指數 (選填) 後綴 (選填) |
(2) | ||||||||
數字序列 (選填) . 數字序列 十進位指數 (選填) 後綴 (選填) |
(3) | ||||||||
0x | 0X 十六進位數字序列 十六進位指數 後綴 (選填) |
(4) | (自 C++17 起) | |||||||
0x | 0X 十六進位數字序列 . 十六進位指數 後綴 (選填) |
(5) | (自 C++17 起) | |||||||
0x | 0X 十六進位數字序列 (選填) . 十六進位數字序列 十六進位指數 後綴 (選填) |
(6) | (自 C++17 起) | |||||||
1) 代表整數且無小數分隔符的 數字序列,此種情況下指數不可省略:1e10, 1e-5L。
2) 代表帶有小數分隔符的整數的 數字序列,此種情況下指數可省略:1., 1.e-2。
3) 代表小數的 數字序列。指數可省略:3.14, .1f, 0.1e-1L。
4) 代表整數且無底數分隔符的十六進位 數字序列。對於十六進位浮點數字面量,指數永不可省略:0x1ffp10, 0X0p-1。
5) 代表帶有底數分隔符的整數的十六進位 數字序列。對於十六進位浮點數字面量,指數永不可省略:0x1.p0, 0xf.p-1。
6) 代表帶有底數分隔符的小數的十六進位 數字序列。對於十六進位浮點數字面量,指數永不可省略:0x0.123p-1, 0xa.bp10l。
十進位指數 的形式為
e | E 指數符號 (選填) 數字序列 |
|||||||||
十六進位指數 的形式為
p | P 指數符號 (選填) 數字序列 |
(自 C++17 起) | ||||||||
指數符號(若存在)為 + 或 -
後綴(若存在)為 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 的 十進位指數 次方。例如,123e4 的數學意義為 123×104。
|
若浮點數字面量以字元序列 對於 十六進位浮點數字面量,尾數被解釋為十六進位有理數,而指數的 數字序列 被解釋為尾數需乘以 2 的(十進位)整數冪。 double d = 0x1.4p3; |
(自 C++17 起) |
[編輯] 附註
在 C++17 之前,十六進位浮點數字面量並非 C++ 的一部分,儘管自 C++11 起它們已可被 I/O 函式解析與列印:當啟用 std::hexfloat 時的 C++ I/O 串流,以及 C I/O 串流(如 std::printf, std::scanf 等)皆支援。格式說明請參見 std::strtof。
| 特性測試巨集 | 數值 | 標準 | 功能 |
|---|---|---|---|
__cpp_hex_float |
201603L |
(C++17) | 十六進位浮點字面量 |
[編輯] 範例
執行此程式碼
#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 標準 (ISO/IEC 14882:2020)
- 5.13.4 浮點數字面量 [lex.fcon]
- C++17 標準 (ISO/IEC 14882:2017)
- 5.13.4 浮點字面量 [lex.fcon]
- C++14 標準 (ISO/IEC 14882:2014)
- 2.14.4 浮點字面量 [lex.fcon]
- C++11 標準 (ISO/IEC 14882:2011)
- 2.14.4 浮點字面量 [lex.fcon]
- C++98 標準 (ISO/IEC 14882:1998)
- 2.13.3 浮點字面量 [lex.fcon]
[編輯] 參見
| 使用者定義字面量(C++11) | 帶有使用者定義字尾的字面量 |
| C 文件 之 浮點常數
| |