浮点字面量
来自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
、F
、l
或 L
之一。后缀决定浮点字面量的类型:
- (无后缀)定义 double
-
f F
定义 float -
l L
定义 long double
数位间可插入作为分隔符的单引号( |
(C++14 起) |
解释
使用十进制科学计数法,表示浮点字面量的值是有效数字乘以 10 的 十进制指数 次幂。例如 123e4 的数学含义是 123×104。
若浮点字面量以字符序列 对于十六进制浮点字面量,其有效数字被解释为十六进制有理数,而指数的 数字序列 被解释成有效数字乘以 2 的 十进制指数 次幂。 例如 0x1.4p3 的十进制数学含义是 1.25×23。 double d = 0x1.4p3; // 十六进制分数 1.4(十进制 1.25)的 2^3 倍,即 10.0 |
(C++17 起) |
注解
虽然十六进制浮点字面量直到 C++17 才成为(标准)C++ 的一部分,但是从 C++11 开始它们已经可以通过输入/输出函数被解析和打印:开启 std::hexfloat 的 C++ 输入/输出流和 C 输入/输出流:std::printf,std::scanf 等。格式描述请参考 std::strtof。
示例
运行此代码
#include <iostream> int main() { std::cout << 58. << '\n' << 4e2 << '\n' << 123.456e-67 << '\n' << .1E4f << '\n' << 0x10.1p0 << '\n' << 0x1894.0417p11 << '\n' // 十六进制浮点字面量的指数数字序列以十进制表示 << 0x1e5 << '\n'; // 0x1e5 是整数字面量而非浮点字面量 }
输出:
58 400 1.23456e-65 1000 16.0625 1.2886e+07 485
参阅
用户定义字面量(C++11) | 拥有用户定义后缀的字面量 |