浮点类型
float/double 表示带小数的数,但是「近似值」。不能像数学实数那样随意比较相等。
1. 概念
- float:占空间小、精度较低,约 6~7 位有效数字
- double:更常用、精度更高,约 15 位有效数字
- 存储是二进制近似,0.1 这类十进制小数无法精确表示
2. 完整例子:为什么 == 不可靠
| 1 | #include <stdio.h> |
| 2 | |
| 3 | int main(void) { |
| 4 | float a = 0.1f + 0.2f; |
| 5 | double b = 0.1 + 0.2; |
| 6 | printf("a=%.20f\n", a); |
| 7 | printf("b=%.20f\n", b); |
| 8 | /* a == 0.3f 往往为假 */ |
| 9 | if (a == 0.3f) { |
| 10 | printf("equal\n"); |
| 11 | } else { |
| 12 | printf("not exactly equal\n"); |
| 13 | } |
| 14 | return 0; |
| 15 | } |
3. 正确比较思路
| 1 | float diff = a - 0.3f; |
| 2 | if (diff < 0.0001f && diff > -0.0001f) { |
| 3 | /* 认为近似相等 */ |
| 4 | } |
4. 与嵌入式的关系
ADC 读数换算成电压常用浮点;有的芯片无 FPU,会用定点数或整数毫伏。先掌握 float 概念,再看工程优化。