浮点字面量

来自cppreference.com
< cpp‎ | language
 
 
 
表达式
概述
值类别(左值 lvalue、右值 rvalue、亡值 xvalue)
求值顺序(序列点)
常量表达式
潜在求值表达式
初等表达式
lambda 表达式(C++11)
字面量
整数字面量
浮点字面量
布尔字面量
字符字面量,包含转义序列
字符串字面量
空指针字面量(C++11)
用户定义字面量(C++11)
运算符
赋值运算符a=ba+=ba-=ba*=ba/=ba%=ba&=ba|=ba^=ba<<=ba>>=b
自增与自减++a--aa++a--
算术运算符+a-aa+ba-ba*ba/ba%b~aa&ba|ba^ba<<ba>>b
逻辑运算符a||ba&&b!a
比较运算符a==ba!=ba<ba>ba<=ba>=ba<=>b(C++20)
成员访问运算符a[b]*a&aa->ba.ba->*ba.*b
其他运算符a(...)a,ba?b:c
new 表达式
delete 表达式
throw 表达式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
折叠表达式(C++17)
运算符的代用表示
优先级和结合性
运算符重载
默认比较(C++20)
类型转换
隐式转换
一般算术转换
const_cast
static_cast
reinterpret_cast
dynamic_cast
显式转换 (T)a, T(a)
用户定义转换
 

浮点字面量定义了其值于源文件中指定的编译时常量。

语法

数字序列 十进制指数 后缀(可选) (1)
数字序列 . 十进制指数(可选) 后缀(可选) (2)
数字序列(可选) . 数字序列 十进制指数(可选) 后缀(可选) (3)
0x | 0X 十六进制数字序列 十六进制指数 后缀(可选) (4) (C++17 起)
0x | 0X 十六进制数字序列 . 十六进制指数 后缀(可选) (5) (C++17 起)
0x | 0X 十六进制数字序列(可选) . 十六进制数字序列 十六进制指数 后缀(可选) (6) (C++17 起)
1) 数字序列 表示无小数点的整数,此时指数不是可选的:1e101e-5L
2) 数字序列 表示带小数点的整数,此时指数是可选的:1.1.e-2
3) 数字序列 表示小数。指数是可选的:3.14.1f0.1e-1L
4) 十六进制 数字序列 表示无基底分隔符的整数。十六进制浮点字面量的指数总是必选的:0x1ffp100X0p-1
5) 十六进制 数字序列 表示带基底分隔符的整数。十六进制浮点字面量的指数总是必选的:0x1.p00xf.p-1
6) 十六进制 数字序列 表示带基底分隔符的小数。十六进制浮点字面量的指数总是必选的:0x0.123p-10xa.bp10l

十进制指数 拥有下列形式

e | E 指数正负号(可选) 数字序列

十六进制指数 拥有下列形式

p | P 指数正负号(可选) 数字序列 (C++17 起)

指数正负号 若存在则为 +-

后缀 若存在,则为 fFlL 之一。后缀决定浮点字面量的类型:

  • (无后缀)定义 double
  • f F 定义 float
  • l L 定义 long double

数位间可插入作为分隔符的单引号('),在编译时忽略它们。

(C++14 起)

解释

使用十进制科学计数法,表示浮点字面量的值是有效数字乘以 10 的 十进制指数 次幂。例如 123e4 的数学含义是 123×104

若浮点字面量以字符序列 0x0X 开始,则该浮点字面量是十六进制浮点字面量。否则,它是十进制浮点字面量

对于十六进制浮点字面量,其有效数字被解释为十六进制有理数,而指数的 数字序列 被解释成有效数字乘以 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::printfstd::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) 拥有用户定义后缀的字面量