背景
项目中有时需要用到浮点转定点,以便于在低功耗设备上运行,不同平台上对定点化后的浮点运算四舍五入有不同实现,如果处理不慎,容易在精度要求高的场合误差累积导致算法效果恶化。这里分析下四舍五入的对称和非对称实现。
原理分析
一句话总结:两者在正数时表现一致,核心在于负数时,-0.5是向-1取,还是向0取。
prnd
:非对称四舍五入,HIFI指令中为RA(asymmetric round),-0.5取为0,硬件较易实现- 非原点对称
rnd
:对称四舍五入,HIFI指令中为R(symmetric round),-0.5取为-1,原理易懂,常见算法实现round- 负数场景整体也屈从于正数原则,取绝对值后四舍五入,再加负号
- 关于原点对称
- 两者精度差异不大,建议优先用rnd原点对称的实现(因为取反是原点对称的),C语言的数学库中round实现是原点对称的。
详细信息解释如下:
对称 & 非对称四舍五入
- 整数 SIMD 乘法指令扔掉了其结果的高位,就像标准的 C/C++乘法。小数 SIMD 乘法指令使用对称或不对称的四舍五入方法,将低位舍去。
- 在非对称四舍五入的情况下,两半被向上舍入,即 0.5 倍的最小有效结果位被舍入为 1.0,-0.5 倍的最小有效结果位被舍入为 1.0。即 0.5 倍的最小有效结果位被向上舍入为 1.0,-0.5 倍的最小有效结果位被向上舍入为 0。
- 在对称四舍五入的情况下,两个半数从零开始四舍五入,即 -0.5 倍的最小有效结果位四舍五入到 -1.0。
- 在指令描述中,对称舍入被称为 round,而非对称舍入被称为 round+∞。
——《DSP 学习笔记 |(五)HiFi 4 User’s Guide 笔记》