命名空間
變體
動作

浮點數字面量

出自 cppreference.com
< cpp‎ | language
 
 
C++ 語言
一般主題
流程控制
條件執行陳述式
if
疊代陳述式 (迴圈)
for
範圍 for (C++11)
跳躍陳述式
函式
函式宣告
Lambda 函式運算式
inline 指定符
動態例外規範 (直到 C++17*)
noexcept 指定符 (C++11)
例外
命名空間
型別
指定符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
儲存期指定符
初始化
 
 

浮點數字面量定義了一個編譯期常數,其值在原始程式碼檔案中指定。

目錄

[編輯] 語法

數字序列 十進位指數 後綴 (選填) (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
  • f16 F16 定義為 std::float16_t
  • f32 F32 定義為 std::float32_t
  • f64 F64 定義為 std::float64_t
  • f128 F128 定義為 std::float128_t
  • bf16 BF16 定義為 std::bfloat16_t
(自 C++23 起)

可選的單引號 (') 可插入數字之間作為分隔符;它們在確定字面量的值時會被忽略。

(C++14 起)

[編輯] 說明

使用十進位科學記號表示法,意即浮點數字面量的值為尾數乘以 10 的 十進位指數 次方。例如,123e4 的數學意義為 123×104

若浮點數字面量以字元序列 0x0X 開頭,則該浮點數為 十六進位浮點數字面量。否則,它為 十進位浮點數字面量

對於 十六進位浮點數字面量,尾數被解釋為十六進位有理數,而指數的 數字序列 被解釋為尾數需乘以 2 的(十進位)整數冪。

double d = 0x1.4p3;// 十六進位分數 1.4 (十進位為 1.25) 縮放 23 倍,即 10.0

(自 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 文件浮點常數
English Deutsch 日本語 한국어 中文(简体) 中文(繁體)