浮点字面量

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

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

目录

[编辑] 语法

significand exponent(可选) suffix(可选)

其中 significand 拥有下列形式之一

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

exponent 拥有下列形式

e | E exponent-sign(可选) digit-sequence (1)
p | P exponent-sign(可选) digit-sequence (2) (C++17 起)
1) 十进制浮点字面量的指数语法
2) 十六进制浮点字面量的指数语法

exponent-sign 若存在则为 +-

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

  • (无后缀)定义 double
  • f F 定义 float
  • l L 定义 long double
数位间可插入作为分隔符的单引号( ' ),在编译时忽略它们。 (C++14 起)

[编辑] 解释

使用十进制科学技术记法,表示浮点字面量的值是有效数字乘数 10 的 exponent 次幂。 123e4 的数学含义是 123×104

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

对于十六进制浮点常量significand 被转译成十六进制分数,而指数的 digit-sequence 被转译成有效数字要放大的 2 的幂次。

double d = 0x1.2p3; // 十六进制分数 1.2 (十进制 1.125 )的 2^3 倍,即 9.0
(C++17 起)

[编辑] 示例

#include <iostream>
int main()
{
  std::cout << 123.456e-67 << '\n'
            << .1E4f       << '\n'
            << 58.         << '\n'
            << 4e2         << '\n';
}

输出:

1.23456e-65
1000
58
400

[编辑] 注意

C++17 前十六进制浮点字面量不是 C++ 的一部分,尽管从 C++11 起能通过 I/O 函数分析并打印它们:启用 std::hexfloat 时的 C++ I/O 流和 C I/O 流: std::printfstd::scanf 等。格式描述见 std::strtof

[编辑] 参阅

浮点常量C 文档