浮点字面量
来自 cppreference.cn
浮点字面量定义一个编译时常量,其值在源文件中指定。
内容 |
[编辑] 语法
数字序列 十进制指数 后缀(可选) | (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。
特性测试宏 | 值 | 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 文档 关于 浮点常量
|