1. 课程导入与权衡问题定义
1996年6月4日,欧洲航天局阿丽亚娜5型火箭首飞,升空约37秒后箭体解体。事故调查委员会的结论指向一段看似不起眼的代码:惯性导航系统将64位浮点数转换为16位有符号整数时,水平速度的浮点值超出了16位整数能表示的范围(约±32767),转换结果溢出为无效值,制导系统据此发出错误指令。这段代码在阿丽亚娜4上运行多年从未出问题,因为4型火箭的飞行剖面速度更低。问题不在于"精度不够",而在于设计者沿用了旧平台的数值表示范围,却没有重新评估新工况下的数据边界。
这个案例揭示了本课程要反复讨论的核心矛盾:计算精度与运算速度并非可以各自独立优化的两个指标,它们共享同一份硬件资源、同一套数值表示、同一条设计约束链。提高精度通常意味着更宽的位宽、更多的迭代次数、更复杂的算法结构,直接转化为延迟增加、吞吐下降、功耗上升;而一味追求速度,则可能让数值误差累积到改变系统行为。权衡设计的本质,是在明确的误差容限与实时性约束下,找到资源投入的合理分配点,并让这个选择在整个系统中保持一致。
冲突的技术根源
从数值表示看,IEEE 754单精度浮点(binary32)提供约7位有效十进制数字,双精度(binary64)约16位。位宽翻倍带来的不只是存储开销,浮点加法器的对齐、规格化、舍入逻辑复杂度显著上升,在FPGA或ASIC中往往意味着数倍的逻辑资源与更长的关键路径。定点运算则把小数点位置固定,用整数单元完成计算,速度快、功耗低,但动态范围窄,需要设计者预先做定标与溢出保护——阿丽亚娜5的悲剧正是定标边界失守。
从算法层面看,精度与速度的交换更为隐蔽。以矩阵乘法为例,将累加顺序从顺序累加改为分块累加,可以改善缓存局部性、提升吞吐,但不同的求和顺序会带来不同的舍入误差累积路径。迭代类算法(如牛顿迭代求倒数、CORDIC求三角函数)中,迭代次数每增加一轮,精度大致提升一位二进制位,延迟也线性增加。这意味着"精度"在工程上往往是一个可调参数,而不是非黑即白的属性。
权衡设计思维框架
上图把权衡问题拆成三层:应用需求层给出误差容限与实时性约束,数值与算法层决定用什么数据格式、什么算法结构去逼近这些约束,硬件实现层则把选择映射为真实的资源与延迟。三层之间不是单向瀑布,而是双向约束——硬件能力会反过来压缩需求空间,例如目标器件没有浮点单元时,就必须在算法层改用定点或块浮点方案。
建立这套框架后,面对一个具体设计问题,可以按以下顺序推进:先量化误差容限,明确"多大误差会导致功能失效";再识别误差来源,把总误差预算拆分到输入量化、中间运算、累加、输出转换各环节;然后针对每个环节选择数据格式与算法,估算其误差与延迟;最后在硬件上验证最坏情况是否越界。这个顺序的关键在于先定容限、再分预算、后选实现,而不是先挑一个"看起来够快"的方案再补精度。
一个可操作的示例:定点定标
假设某电机控制环需要计算电流环输出,输入电流采样范围±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。学员需要完成数据格式选型、误差预算表编制、定点或浮点实现、资源与延迟评估,并用注入边界输入的方式验证溢出与精度退化。项目不追求唯一正确答案,而要求每个设计选择都能追溯到误差预算与实时性约束,形成可解释、可复现的权衡决策记录。