浮点数与循环精度显微镜

从二进制表示到 while (fabs(item) >= eps) · C 语言程序设计扩展
D04-EXT01 · 循环结构精度扩展
“0.1 + 0.2 为什么可能不等于 0.3?这和循环条件有什么关系?”

实验1 · 整数是怎样表示的?

范围: 0 ~ 65535
13 = 1101₂
快捷示例:
二进制位构成 (对应权值 2ᵏ):
教学结论:在一定整数范围内,整数能被有限个 2ᵏ 权值精确表示。

实验2 · 0.1 + 0.2 真的等于 0.3 吗?

高精度 17 位机器数展示
观察值: 0.1 0.10000000000000001
0.1 + 0.2 == 0.3 false
(0.1 + 0.2) - 0.3 = 5.551115123125783e-17
为什么会这样?二进制小数的有限与无限 十进制与二进制基数差异
示例A: 0.5₁₀ = 0.1₂
1 × 2⁻¹,可以有限精确表示
示例B: 0.1₁₀ ≈ 0.000110011001…₂
无限循环,只能存储近似截断值
数学 0.1 → 转二进制 → 无限展开 → 有限位截断 → 最接近机器数
误差极其微小,但不严格为0(计算机并未算错,是表示机制决定的) 概念示意:不要求掌握 IEEE 754 细节

实验3 · while (fabs(item) >= eps) 怎样控制循环?

教学说明:内部累加 π/4,最终展示 π = 4 × sum
π/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - ...
while (fabs(item) >= eps) { pi += item; ... }
条件模式:
fabs(item) >= eps
fabs(item) > eps
步骤 1
判断条件
步骤 2
累加当前项
步骤 3
改变符号
步骤 4
分母 + 2
步骤 5
计算下一项
循环终止
已执行轮次
第 0 轮
分母 (den)
1
当前项 (item)
1.000000000000
绝对值 fabs(item)
1.000000000000
循环条件判定表达式 等待启动
|1.000000| >= 0.01 准备就绪
当前 π 近似值 (4 × sum) |π - Math.PI| = -
0.00000000000000
边界观察:当 fabs(item) 接近或到达 eps 时,>= 相比 > 会多执行一次累加。 机器比较的是真实浮点存储近似值
轮次 分母 (den) 当前项 (item) fabs(item) 条件判断 π 累加值 (4×sum)