C 语言浮点数原理
更新时间:2026-08-26。本文是
languages/c/主题高手层的骨架文档(占位),完整展开将在后续批次补齐。
本文要回答的问题
0.1 + 0.2为什么不是0.3?- 浮点比较为什么不能直接
==? NaN、Inf是什么?怎么检测?
一、IEEE 754 格式
| 类型 | 位宽 | 符号 | 指数 | 尾数 |
|---|---|---|---|---|
float | 32 | 1 | 8 | 23 |
double | 64 | 1 | 11 | 52 |
浮点数是"符号 × 尾数 × 2^指数"的二进制表示:很多十进制小数(如 0.1)二进制无限循环,只能近似存储——这就是精度损失的根源。
二、两个经典陷阱
c
if (0.1 + 0.2 == 0.3) /* 几乎必然是 false */- 精确比较:用
fabs(a - b) < epsilon,epsilon 按量级取(如1e-9)。 - 累积误差:大量加法会累积舍入误差;求和用 Kahan 算法或提升精度。
- 大数吃小数:
1e16 + 1.0可能还是1e16(尾数装不下)。
三、特殊值与优化
NaN:0.0/0.0等产生,任何比较都是 false(连NaN == NaN都是 false),用isnan()判断。Inf:1.0/0.0产生,用isinf()判断。- 优化影响:编译器默认遵循 IEEE 754 语义(不随意重排浮点运算);
-ffast-math会牺牲精度换速度,生产代码慎用,见 编译优化行为。
四、与入门层的衔接
一句话总结
浮点数是"二进制近似",所以 0.1+0.2≠0.3、比较要用 epsilon、NaN 谁都不等于:认命用近似、显式判特殊值,别跟浮点讲精确。
本文为骨架文档:核心结构已就位,示例代码与实测数据将在后续批次补齐。