2013-09-05 2 views
2

변수의 제곱근을 찾기 위해 쌍곡선 회전 모드에서 CORDIC 알고리즘을 살펴 보았습니다. 내 초기 변수가 제곱근을 찾으려면 (x0, y0, z0) 무엇인지 확신 할 수 없습니다. 나는 sqrt (a)를 찾기 위해 초기 값을 각각 x0, y0, z0에 대해 +1, a-1,0로 설정해야한다고 언급 한 논문을 읽었습니다. 다른 사람들은 + 0.25, -0.25,0이어야한다고 말합니다. 나는 이것으로 매우 혼란 스럽다.제곱근에 대한 CORDIC

아무도 도와 줄 수 있습니까? 3J + 1 반복에 대한 보상과 함께

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; 
} 

EDIT * 은 CORDIC는 N = 4,13,40 같은 경우에 두 루프를 실행할 필요 ... I는 보상하려면 코드를 업데이트 ,하지만 여전히 작동하지 않습니다. 나는 변수 d는 Y의 기호에 기초해야 벡터링 모드에서 쌍곡선 회전을 사용하고

EDIT * 큰 제곱근 값을 계산할 때 당신은 당신이 수를 정상화 할 수 있도록 CORDIC이 실패 할 수 있음을 밝혀 0.5에서 2 범위의 제곱근을 찾으려고 시도한 다음 다시 백 업 응답을 확장합니다.

+1

관련없는 의견 : 나는 CORDIC이 30 년 이상 언급 한 것을 들어 보지 못했습니다. 그것은 1968 년경의 HP 9100 탁상용 계산기의 기초 였고, 회로 화 된 후에 HP의 원래 계산기 계산기 라인이되었습니다. (알고리즘에 대해서는 거의 알지 못하지만, 다이오드 어레이 ROM에 의해 정의 된 것 외에는 계산기 바닥을 채우는 거의 18 인치의 사각형 회로 기판을 사용했다.) –

+0

오늘날의 FPGA는 여전히 그것을 사용한다 – DashControl

+1

I 나는 약간 놀랐다. IIRC는 특히 빠르지는 않았지만 사실상 모든 초월 기능이 동일한 기본, 매우 간단한 프레임 워크, 다른 매개 변수로 구현 될 수 있다는 이점이있었습니다. –

답변

2

제곱근을 수행하는 숫자를 [0.5,2] 범위로 정규화 한 다음 그에 따라 다시 스케일을 조정해야합니다.

+0

마침내 소리가 나는 것처럼 보입니다! 그리고 정규화에는 막연하게 익숙한 고리가 있습니다. IIRC의 경우 대부분의 함수에 대한 인수는 알고리즘이 수렴 된 범위에 머 무르도록 사전 표준화되어야했습니다. –

+0

정확합니다. 알고리즘이 더 큰 입력에 대해 점점 더 수렴하는 것을 보았을 때 정상화하는 것이 합리적이었습니다. – DashControl

2

초기 값은 각각 x0, y0 및 z0에 대해 +1, a-1,0로 설정되어야합니다. 다른 사람들은 + 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)을 직접 반환한다는 것입니다. 왜 한 사건이나 다른 사건이 바람직한지에 대한 수치적인 이유를 알지 못합니다.

편집 : 귀하의 버그는 y을 기준으로 d을 기준으로 설정하며 z을 기반으로합니다.

+0

나는 vectoring 모드를 사용하여 y의 변화에 ​​의존 할 것이라고 생각 했는가? – DashControl

+0

흠, 내 기억은 약간 벗어나야합니다. 오프셋 값으로 '0.25'와 '1'의 차이는 확실히 4의 결과로 결과가 변경되었지만 다른 방식으로 진행됩니다 버전의 코드). –

+0

은 d/d 루프의 값을 설정하는 if/else 루프를 변경 한 것입니다. 나를 위해 작동하지 않는 것 – DashControl