1、基本定义
float
通常占用 4 字节(32 位),约为 6-7 位有效数字,采用 IEEE 754 标准单精度浮点格式,1 位符号位,8 位指数位,23 位尾数位。
double
通常占用 8 字节(64 位),约为 15-16 位有效数字,采用 IEEE 754 标准双精度浮点格式,1 位符号位,11 位指数位,52 位尾数位。
类型 | 大小 | 精度 | 有效数字 | 指数范围 |
| 4 字节 | 6-7 位有效数字 | 7 位左右 | -38 到 38 |
| 8 字节 | 15-16 位有效数字 | 16 位左右 | -308 到 308 |
2、精度差异
float
适用于存储不需要极高精度的数据,比如图形处理、游戏中的坐标计算等。double
适用于对计算精度要求较高的场景,如科学计算、工程计算、金融计算等。
#include <stdio.h>
int main() {
float f = 1.123456789;
double d = 1.123456789;
printf("float: %.9f\n", f); // 输出:1.123456800
printf("double: %.9f\n", d); // 输出:1.123456789
return 0;
}
3、性能差异
float
占用内存较小,运算速度快(尤其在某些硬件上,如 GPU、嵌入式系统)。double
占用内存较大,但对于多数现代 CPU,double
计算并不会比 float
慢太多(尤其是具有硬件浮点运算支持的情况下)。如果性能至关重要且对精度要求不高,使用 float
。如果需要较高的计算精度,使用 double
。
1)浮点累加误差(精度对比)
#include <stdio.h>
int main() {
float f_sum = 0.0f;
double d_sum = 0.0;
for (int i = 0; i < 1000000; i++) {
f_sum += 0.000001f;
d_sum += 0.000001;
}
printf("float sum: %.10f\n", f_sum);
printf("double sum: %.10lf\n", d_sum);
return 0;
}
2)科学计算/金融(double)
在需要高精度的科学模拟或金融运算中,double
更合适。
// 计算复利(double 精度)
#include <stdio.h>
#include <math.h>
int main() {
double principal = 10000.0;
double rate = 0.05;
int years = 30;
double amount = principal * pow(1 + rate, years);
printf("Future Value (double): %.10lf\n", amount);
return 0;
}
3)嵌入式开发(float)
在资源受限的嵌入式系统(如 STM32 等 ARM Cortex-M 处理器)中,为了减少内存和计算负担,使用 float
更合适。
#include <stdio.h>
int main() {
// 模拟采集到的 4 个温度值(单位:摄氏度)
float temperatures[] = {23.1f, 23.3f, 22.8f, 23.0f};
float sum = 0.0f;
// 累加所有温度值
for (int i = 0; i < 4; i++) {
sum += temperatures[i];
}
// 计算平均温度
float avg = sum / 4;
// 输出结果(保留 2 位小数)
printf("Average temperature: %.2f°C\n", avg);
return 0;
}