书籍:《C++ Primer》
环境:visual studio 2022
内容:Integer and Floating-Point Literals
说明:以上内容大部分来自腾讯元宝。
如何理解以下内容:
Floating-point literals include either a decimal point or an exponent specified using scientific notation. Using scientific notation, the exponent is indicated by either
E
or
e
:
3.14159 3.14159E0 0. 0e0 .001
By default, floating-point literals have type
double. We can override the default using a suffix from
Table 2.2
(overleaf).
浮点字面值包括使用科学记数法指定的小数点或指数。使用科学记数法,指数用E或E表示:
3.14159 3.14159e00 e0措施
默认情况下,浮点量的类型为double。我们可以使用表2.2中的后缀覆盖默认值。
一、浮点字面量的基本结构
浮点字面量必须满足以下条件之一:
- 包含小数点
例如:3.14
、.5
(等价于0.5
)、123.
(等价于123.0
)。 - 使用科学计数法(指数形式)
例如:1e3
(等价于1000.0
)、3.14E-2
(等价于0.0314
)。
示例:
double a = 3.14159; // 合法
double b = 3.14159E0; // 合法(科学计数法)
double c = 0e0; // 合法(表示0.0)
double d = .001; // 合法(等价于0.001)
二、默认类型与后缀规则
1. 默认类型为double
若浮点字面量无后缀,则默认类型为double
:
auto x = 3.14; // 类型为double
auto y = 1e308; // 类型为double(假设未溢出)
2. 后缀覆盖默认类型
通过后缀可显式指定类型:
后缀 | 类型 | 示例 |
---|---|---|
f /F | float | 3.14f |
l /L | long double | 3.14L |
示例:
float f = 3.14f; // 显式指定为float
long double ld = 1e300L; // 显式指定为long double
三、科学计数法的细节
-
指数格式
- 指数部分由
E
或e
引导,后跟可选符号(+
/-
)和整数指数:double a = 1.23e4; // 1.23 × 10^4 = 12300.0 double b = 5E-3; // 5 × 10^-3 = 0.005
- 指数部分由
-
省略小数点或整数部分
- 若使用科学计数法,可省略小数点或整数部分,但必须保留至少一部分:
double c = 1e3; // 合法(等价于1000.0) double d = .5e2; // 合法(等价于50.0)
- 若使用科学计数法,可省略小数点或整数部分,但必须保留至少一部分:
四、类型推导与精度
-
类型范围与精度
类型 典型精度 典型范围(64位系统) float
~7位有效数字 ±1.18×10⁻³⁸ ~ ±3.4×10³⁸ double
~15位有效数字 ±2.23×10⁻³⁰⁸ ~ ±1.8×10³⁰⁸ long double
~18-19位有效数字 ±3.36×10⁻⁴⁹³² ~ ±1.18×10⁴⁹³² -
精度损失风险
- 大数值可能因类型精度不足丢失小数部分:
float f = 123456789.123456789f; // 存储为近似值123456792.0
- 大数值可能因类型精度不足丢失小数部分:
五、特殊值与注意事项
-
特殊字面量
- 零值:
0.0
、-0.0
(负零)。 - 无穷大:
1.0/0.0
(未定义行为,需使用std::numeric_limits<double>::infinity()
)。 - NaN:
std::nan("")
(非数值)。
- 零值:
-
十六进制浮点字面量(C++17)
- 使用
0x
前缀和p/P
指数(以2为底):double hex = 0x1.8p1; // 3.0(二进制1.1 × 2^1)
- 使用
六、实际应用建议
-
显式指定类型
- 对需要精确控制精度的场景(如图形计算),使用
float
或long double
:float pi = 3.1415926535f; // 单精度 long double e = 2.71828182845904523536L; // 高精度
- 对需要精确控制精度的场景(如图形计算),使用
-
避免隐式转换
- 混合不同精度类型时,使用
static_cast
显式转换:double x = 3.14; float y = static_cast<float>(x); // 显式转换
- 混合不同精度类型时,使用
-
科学计算中的指数处理
- 使用
std::pow
或直接科学计数法:double result = 2.5e3 * std::pow(10, 3); // 2.5×10^6
- 使用
七、总结
C++浮点字面量的核心规则包括:
- 语法要求:必须包含小数点或科学计数法指数。
- 默认类型:无后缀时默认为
double
。 - 后缀控制:
f
/F
为float
,l
/L
为long double
。 - 科学计数法:支持
E
/e
表示10的幂次。
合理使用这些规则可避免精度损失和类型错误,提升代码可靠性。