1. ARM架构定点数运算基础
定点数运算是一种在整数处理器上高效模拟浮点运算的技术,它通过预定义的小数点位置(称为q格式)来存储和操作分数。这种技术在嵌入式系统和实时处理应用中尤为重要,因为ARM等RISC架构通常不包含硬件浮点运算单元(FPU)。
定点数的核心表示方法是将数值编码为两个部分:
- 尾数(n):一个常规的整数,存储实际的有效数字
- 指数(q):一个固定的比例因子,决定小数点的位置
数学表达式为:值 = n × 2^(-q)
例如,在q=14的格式中:
- 0x00004000表示1.0(因为16384 × 2^(-14) = 1)
- 0x00002000表示0.5
- 0xFFFFC000表示-1.0(采用二进制补码表示)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. q格式的选择与精度控制
2.1 动态范围与精度的权衡
q值的选择直接影响数值表示的动态范围和精度:
- 较大的q值:提高小数部分精度,但减少整数部分范围
- 较小的q值:扩大整数表示范围,但降低小数精度
在32位系统中,常见的选择包括:
- q=14:适合信号处理,提供±4的整数范围和约0.00006的小数精度
- q=8:适合图形处理,提供±8,388,608的整数范围和0.00390625的小数精度
2.2 防止运算溢出
乘法操作需要特别注意,因为两个q格式数相乘会产生2q格式的结果。例如:
- q=14时,乘积需要28位小数部分
- 32位系统中,必须确保2q < 32,因此q最大为15
经验法则:
- 加法/减法:操作数必须相同q格式,结果保持相同格式
- 乘法:结果小数位数是操作数小数位之和
- 除法:被除数通常需要预先移位以保持精度
3. 定点数运算的C语言实现
3.1 基本运算宏定义
c复制// 加法:相同q格式直接相加
#define FADD(a,b) ((a)+(b))
// 减法:相同q格式直接相减
#define FSUB(a,b) ((a)-(b))
// 乘法:结果右移q位回到原格式
#define FMUL(a,b,q) (((a)*(b))>>(q))
// 除法:被除数左移q位后除
#define FDIV(a,b,q) (((a)<<(q))/(b))
