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; }