1. 课程导入与权衡问题定义

1996年6月4日,欧洲航天局阿丽亚娜5型火箭首飞,升空约37秒后箭体解体。事故调查委员会的结论指向一段看似不起眼的代码:惯性导航系统将64位浮点数转换为16位有符号整数时,水平速度的浮点值超出了16位整数能表示的范围(约±32767),转换结果溢出为无效值,制导系统据此发出错误指令。这段代码在阿丽亚娜4上运行多年从未出问题,因为4型火箭的飞行剖面速度更低。问题不在于"精度不够",而在于设计者沿用了旧平台的数值表示范围,却没有重新评估新工况下的数据边界。

这个案例揭示了本课程要反复讨论的核心矛盾:计算精度与运算速度并非可以各自独立优化的两个指标,它们共享同一份硬件资源、同一套数值表示、同一条设计约束链。提高精度通常意味着更宽的位宽、更多的迭代次数、更复杂的算法结构,直接转化为延迟增加、吞吐下降、功耗上升;而一味追求速度,则可能让数值误差累积到改变系统行为。权衡设计的本质,是在明确的误差容限与实时性约束下,找到资源投入的合理分配点,并让这个选择在整个系统中保持一致。

冲突的技术根源

从数值表示看,IEEE 754单精度浮点(binary32)提供约7位有效十进制数字,双精度(binary64)约16位。位宽翻倍带来的不只是存储开销,浮点加法器的对齐、规格化、舍入逻辑复杂度显著上升,在FPGA或ASIC中往往意味着数倍的逻辑资源与更长的关键路径。定点运算则把小数点位置固定,用整数单元完成计算,速度快、功耗低,但动态范围窄,需要设计者预先做定标与溢出保护——阿丽亚娜5的悲剧正是定标边界失守。

从算法层面看,精度与速度的交换更为隐蔽。以矩阵乘法为例,将累加顺序从顺序累加改为分块累加,可以改善缓存局部性、提升吞吐,但不同的求和顺序会带来不同的舍入误差累积路径。迭代类算法(如牛顿迭代求倒数、CORDIC求三角函数)中,迭代次数每增加一轮,精度大致提升一位二进制位,延迟也线性增加。这意味着"精度"在工程上往往是一个可调参数,而不是非黑即白的属性。

精度—速度权衡的三层约束链 上层决策向下传导,下层反馈反向约束,任一层失配都可能引发系统级失效 ① 应用需求层 误差容限 ε 如:姿态角误差 ≤ 0.01° 实时性约束 T 如:控制周期 ≤ 1 ms 动态范围与工况边界 如:速度峰值、输入幅值上限 约束下发 ② 数值表示与算法层 数据格式选择 FP32 / FP16 / INT16 定点 Q 格式 算法结构 迭代次数 / 分块策略 近似函数阶数 误差传播控制 累加顺序 / 补偿求和 溢出与饱和保护 精度预算分配 各环节误差配额 最坏情况分析 映射实现 ③ 硬件实现层 运算单元位宽与流水线 DSP 数量 / 关键路径延迟 存储带宽与访存模式 缓存命中 / 数据复用率 功耗与散热预算 频率上限 / 能效比 实现能力反向约束需求 权衡点 = 在 ε 与 T 同时满足的前提下,使资源代价(面积 / 功耗 / 开发成本)最小化的数值—算法—硬件组合

权衡设计思维框架

上图把权衡问题拆成三层:应用需求层给出误差容限与实时性约束,数值与算法层决定用什么数据格式、什么算法结构去逼近这些约束,硬件实现层则把选择映射为真实的资源与延迟。三层之间不是单向瀑布,而是双向约束——硬件能力会反过来压缩需求空间,例如目标器件没有浮点单元时,就必须在算法层改用定点或块浮点方案。

建立这套框架后,面对一个具体设计问题,可以按以下顺序推进:先量化误差容限,明确"多大误差会导致功能失效";再识别误差来源,把总误差预算拆分到输入量化、中间运算、累加、输出转换各环节;然后针对每个环节选择数据格式与算法,估算其误差与延迟;最后在硬件上验证最坏情况是否越界。这个顺序的关键在于先定容限、再分预算、后选实现,而不是先挑一个"看起来够快"的方案再补精度。

误差预算的拆分要留有余量。工程上常把理论误差上限乘以1.5~2的安全系数,因为实际输入分布、舍入模式、编译器优化都可能让误差偏离理论估计。阿丽亚娜5的问题正是没有为新工况重新核算动态范围。

一个可操作的示例:定点定标

假设某电机控制环需要计算电流环输出,输入电流采样范围±20 A,要求分辨率不低于0.01 A,采用16位有符号定点数(范围−32768~32767)。定标方式为:选择标度因子 S,使 20×S ≤ 32767 且 0.01×S ≥ 1。由第一式得 S ≤ 1638.35,由第二式得 S ≥ 100。取 S = 1000,则量化步长为 0.001 A,满足分辨率要求;最大可表示电流为 32.767 A,对±20 A 输入留有约1.6倍余量。若实际工况电流峰值可能达到35 A,则 S = 1000 会溢出,需降到 S = 900(最大36.4 A,步长约0.0011 A)或改用32位定点。这个简单计算就是"动态范围—分辨率—位宽"三者权衡的最小完整实例。

课程学习路径与实战项目

本课程后续将沿"表示—算法—实现—验证"四条主线展开:数值表示部分讨论浮点、定点、块浮点的误差特性与选型依据;算法部分分析迭代法、近似函数、累加策略中的精度—速度交换;实现部分覆盖FPGA/嵌入式平台上的位宽裁剪、流水线设计与资源估算;验证部分给出误差测量、最坏情况分析与边界测试方法。

贯穿课程的实战项目是一个姿态解算模块的精度—速度协同设计:给定陀螺仪与加速度计数据,要求解算姿态角,误差不超过0.5°,更新率不低于200 Hz。学员需要完成数据格式选型、误差预算表编制、定点或浮点实现、资源与延迟评估,并用注入边界输入的方式验证溢出与精度退化。项目不追求唯一正确答案,而要求每个设计选择都能追溯到误差预算与实时性约束,形成可解释、可复现的权衡决策记录。

本课程中的参数、误差数值与资源估算均为教学示例或合理假设,用于说明方法,不代表任何具体器件的实测指标。实际工程中应以目标平台的数据手册、仿真结果与实测数据为准。