首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >平方根的CORDIC

平方根的CORDIC
EN

Stack Overflow用户
提问于 2013-09-05 21:17:03
回答 3查看 3.8K关注 0票数 3

我一直在研究双曲旋转模式下的CORDIC算法,以求变量的平方根。我不确定我的初始变量应该是什么(x0、y0、z0)才能找到平方根。我读过一些文章,引用到要找到sqrt(a),初始值应该分别设置为a+1、a-1、0( x0、y0和z0 )。其他人说应该是a+0.25,一个-0.25,0。我对此感到非常困惑

有人能帮忙吗?

代码语言:javascript
复制
double x = (64.0+1);
double y = (64.0-1);
double z = 0; 


double k = 3;
double n = 1;
while(n <= 20 ){

    double xn = pow(2.0,-1.0*n) * x;
    double yn = pow(2.0,-1.0*n) * y;

    if(y < 0){ 
        x = x + xn;
        y = y + yn;
        z = z - atanh(pow(2.0,-1.0*n));
    }
    else
    {
        x = x - xn;
        y = y - yn;
        z = z + atanh(pow(2.0,-1*n));

    }

    if(k > 0){
        k = k-1;
    }
    else{
        k = 3;
        if(y < 0){ 
            x = x + xn;
            y = y + yn;
            z = z - atanh(pow(2.0,-1.0*n));
        }
        else
        {
            x = x - xn;
            y = y - yn;
            z = z + atanh(pow(2.0,-1.0*n));

        }
    }
    n++;
    cout << "x: " << x << " y: " << y << " z: " << z << endl;
}

在对3j+1重复进行补偿的同时,CORDIC要求在n= 4,13,40,.我已经更新了我的代码以弥补这一点,但它仍然不起作用。我在矢量模式下使用双曲线旋转,变量d应该基于y的符号。

编辑*结果显示,当计算较大的平方根值时,CORDIC可能会失败,因此您必须将试图查找的平方根数标准化为0.5到2范围,然后再回缩答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-16 17:30:44

您应该将正在执行平方根的数字规范化为[0.5,2]范围,然后相应地进行缩放。

票数 2
EN

Stack Overflow用户

发布于 2013-09-06 01:28:27

初始值应分别设置为a+1、a-1、0用于x0、y0和z0。其他人说应该是a+0.25,一个-0.25,0。我对此感到非常困惑

最后的结果是sqrt((a+1)^2 - (a-1)^2)sqrt((a+0.25)^2 - (a-0.25)^2)。无论哪种方式,a^2项取消和常量项取消。唯一的区别是第一个版本返回sqrt(4a)2sqrt(a),第二个版本直接返回sqrt(a)。我不知道为什么会有这样或那样的情况。

编辑:您的错误是基于d设置的y,应该是基于z的。

票数 3
EN

Stack Overflow用户

发布于 2020-04-02 21:33:20

代码中有几个bug!

  1. 变量不进行交换。

代码语言:javascript
复制
     x = x + xn;
     y = y + yn;

应:

代码语言:javascript
复制
     x = x + yn;
     y = y + xn;
  1. 迭代4和13没有正确地重复。需要在这些分支中重新计算以下内容:

代码语言:javascript
复制
     xn = pow(2.0,-1.0*n) * y;
     yn = pow(2.0,-1.0*n) * x;
  1. 应对输出(x/2*1.207497)进行刻度校正。

请参见此处调试的丑陋代码,但工作代码:https://godbolt.org/z/ma4dCV

注意,不需要整个z通道(https://mathworks.com/help/fixedpoint/examples/compute-square-root-using-cordic.html)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18646105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档