浮点数字面量
来自cppreference.com
浮点数字面量定义一种编译时常量,其值于源文件中指定。
语法
| 数字序列 十进制指数 后缀 (可选) | (1) | ||||||||
数字序列 . 十进制指数 (可选) 后缀 (可选)
|
(2) | ||||||||
数字序列 (可选) . 数字序列 十进制指数 (可选) 后缀 (可选)
|
(3) | ||||||||
0x | 0X 十六进制数字序列 十六进制指数 后缀 (可选)
|
(4) | (C++17 起) | |||||||
0x | 0X 十六进制数字序列 . 十六进制指数 后缀 (可选)
|
(5) | (C++17 起) | |||||||
0x | 0X 十六进制数字序列 (可选) . 十六进制数字序列 十六进制指数 后缀 (可选)
|
(6) | (C++17 起) | |||||||
1) 数字序列 表示无小数点的整数,此时指数不是可选的:
1e10、1e-5L2) 数字序列 表示带小数点的整数,此时指数是可选的:
1.、1.e-23) 数字序列 表示小数。指数是可选的:
3.14、.1f、0.1e-1L4) 十六进制 数字序列 表示无基底分隔符的整数。十六进制浮点数字面量的指数总是必选的:
0x1ffp10、0X0p-15) 十六进制 数字序列 表示带基底分隔符的整数。十六进制浮点数字面量的指数总是必选的:
0x1.p0、0xf.p-16) 十六进制 数字序列 表示带基底分隔符的小数。十六进制浮点数字面量的指数总是必选的:
0x0.123p-1、0xa.bp10l十进制指数 拥有下列形式
e | E 指数正负号 (可选) 数字序列
|
|||||||||
十六进制指数 拥有下列形式
p | P 指数正负号 (可选) 数字序列
|
(C++17 起) | ||||||||
指数正负号 若存在则为 + 或 -。
后缀 若存在,则为 f、F、l、L、f16、f32、f64、f128、bf16、F16、F32、F64、F128、BF16(C++23 起) 之一。后缀决定浮点数字面量的类型:
- (无后缀)定义
double f F定义floatl L定义long double
- (无后缀)定义
|
(C++23 起) |
|
数字间可插入作为分隔符的单引号( |
(C++14 起) |
解释
使用十进制科学计数法,表示浮点数字面量的值是有效数字乘以 10 的 十进制指数 次幂。例如 123e4 的数学含义是 123×104。
|
若浮点数字面量以字符序列 对于十六进制浮点数字面量,其有效数字被解释为十六进制有理数,而指数的 数字序列 被解释成有效数字所要乘的 2 的幂的(十进制)整数指数。
|
(C++17 起) |
注解
虽然十六进制浮点数字面量直到 C++17 才成为(标准)C++ 的一部分,但是从 C++11 开始它们已经可以通过输入/输出函数被解析和打印:开启 std::hexfloat 的 C++ 输入/输出流和 C 输入/输出流: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
<< "字面量" "\t" "打印值" << std::left
<< OUT( 58. ) // double
<< OUT( 4e2 ) // double
<< OUT( 123.456e-67 ) // double
<< OUT( 123.456e-67f ) // float, 向零截断
<< OUT( .1E4f ) // float
<< OUT( 0x10.1p0 ) // double
<< OUT( 0x1p5 ) // double
<< OUT( 0x1e5 ) // 整数字面量,非浮点数
<< OUT( 3.14'15'92 ) // double, 忽略单引号 (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 == // 结尾为 4
3.4028235e38f); // 结尾为 5
static_assert(3.4028234e38 != // 结尾为 4
3.4028235e38); // 结尾为 5
// 以下浮点数常量均为 3.4028234e38
static_assert(3.4028234e38f != // float(然后提升为 double)
3.4028234e38); // double
}
可能的输出:
字面量 打印值
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 Floating-point literals [lex.fcon]
- C++20 标准(ISO/IEC 14882:2020):
- 5.13.4 Floating-point literals [lex.fcon]
- C++17 标准(ISO/IEC 14882:2017):
- 5.13.4 Floating literals [lex.fcon]
- C++14 标准(ISO/IEC 14882:2014):
- 2.14.4 Floating literals [lex.fcon]
- C++11 标准(ISO/IEC 14882:2011):
- 2.14.4 Floating literals [lex.fcon]
- C++98 标准(ISO/IEC 14882:1998):
- 2.13.3 Floating literals [lex.fcon]
参阅
| 用户定义字面量 (C++11) | 拥有用户定义后缀的字面量 |
浮点数常量的 C 文档
| |