精度问题
下表给出了常见类型的精度(有效数字)和值域信息:
| 类型 | 精度 | 值域 |
|---|---|---|
float |
\(7\) 位 | 约 \(\pm 10^{38}\) |
int |
\(9\) 位 | \([-2^{31},2^{31})\) |
double |
\(15\) 位 | 约 \(\pm 10^{308}\) |
long long |
\(18\) 位 | \([-2^{63},2^{63})\) |
long double |
\(18\) 位 | 约 \(10^{4932}\) |
*数据来源:NOI-Linux 2.0,std::numeric_limits<typename> 内的宏。
得出结论:
- 如果存在负数,一定不要开
unsigned; - 最好不使用
float; - 在值域不超过
long long的时候,推荐使用long long; - 如果答案的位数超过了 \(15\) 位,那么使用
double会出现精度问题:累加时,double类型的变量如果超过了 \(15\) 位,并且+=了一些小于此时精度的数字,就会被直接忽略; - 精度上,
long double可以代替long long处理值域较大的情况。
第四条问题的实例代码: