命名空间
变体
操作

浮点字面量

来自 cppreference.cn
< 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 起)
存储期说明符
初始化
表达式
替代表示
字面量
布尔 - 整数 - 浮点
字符 - 字符串 - nullptr (C++11 起)
用户定义 (C++11 起)
工具
属性 (C++11 起)
类型
typedef 声明
类型别名声明 (C++11 起)
转型
内存分配
类特有函数属性
虚函数
override 说明符 (C++11 起)  
final 说明符 (C++11 起)
explicit (C++11 起)
static

特殊成员函数
模板
模板特化
参数包 (C++11 起)
杂项
 
 

浮点字面量定义一个编译时常量,其值在源文件中指定。

内容

[编辑] 语法

数字序列 十进制指数 后缀(可选) (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)

指数符号 (如果存在)为 +-

后缀 (如果存在)是 flFLf16f32f64f128bf16F16F32F64F128BF16(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::printfstd::scanf 等。有关格式描述,请参见 std::strtof

特性测试宏 Std 特性
__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 文档 关于 浮点常量