发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
打印
[其他ST产品]

[算法]平方根倒数速算法FISR详解,STM32G071实战测试

[复制链接]
19645|62
手机看帖
扫描二维码
随时随地手机跟帖
楼主
coody| | 2021-9-7 14:22 | 显示全部楼层 回帖奖励 |倒序浏览
以前看过英文版的,再一次深入了解了那个让人抓狂的常数。

使用特权

评论回复
评论
Litthins 2021-9-7 15:17 回复TA
英文论文把数字拆开讨论的,看完这个再回去看论文,会有更多收获。 
沙发
coody| | 2021-9-8 22:30 | 显示全部楼层
楼主,我以前计算快速平方,就用平方根倒数的函数,返回 x*y就是平方根,测试了文中的快速平方根,发现其误差稍大,是不是那个常数的问题?那个常数0x1fbd1df5具体是怎么算的?
float FInvSqrtRoot(float x)
{
    long i = 0;
    float y, halfx;
  
    halfx = 0.5 * x;
    i = *(long*) &x;                 // 按照整型方法操作浮点数
    i = 0x5f3759df - (i >> 1);       // 魔法?
    y = *(float*) &i;                // 获得平方根倒数近似值
    y = y * (1.5 - halfx * y * y);   // 一次牛顿迭代
//    return y;                   //返回平方根倒数
    return (x*y);                   //返回平方根, 这个计算比上文中的快速平方根更精确。
}

使用特权

评论回复
评论
Litthins 2021-9-9 12:38 回复TA
事实上只要增加牛顿迭代次数,精度提升会非常明显。你的代码多迭代一次,误差可以降到0.0004%,非常不错了。 
Litthins 2021-9-9 12:21 回复TA
@coody :客气了,相互学习。 
Litthins 2021-9-9 12:19 回复TA
我用[1,65535]测试了你的算法,以sqrt为基准,采用fabs(FSqrtRoot(k) - sqrt(k)) / sqrt(k)*100求偏离百分比;你的算法最大误差是0.17%,我的最大误差是0.09%,看起来还是我的要好一些,哈哈。 
coody 2021-9-9 12:15 回复TA
@Litthins :谢谢!我修改下常数试试。 
Litthins 2021-9-9 12:02 回复TA
当然x*y也是可以的, 我的是:0.5 * (y + x / y) 你的是:y * (1.5 - halfx * y * y)和x*y 虽然看起来你的方法运算步骤较多,但因为我使用了除法,效率不一定比你的高; 魔法数字是优化出来的,根据不同的评估方法,会稍有变化,所以你可能见过不止一个版本; 0x1fbd1df5是我推导出来的,参考文中公式,令等式T=根号x再做推导即可; y = 0.5 * (y + x / y)是根据T=根号x推导的牛顿迭代式。  
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则