도구스개발

CORDIC 알고리즘 계산기

곱셈 없이 시프트와 덧셈만으로 sin·cos를 구하는 CORDIC의 반복 과정을 단계별로 보여 줍니다. 각 단계의 회전각 arctan(2⁻ⁱ)과 이득 K = 0.6072529, 곱해 주지 않았을 때 생기는 1.6468배 오류까지 함께 냅니다.

°

한 번에 대략 1비트씩 정확해집니다. 16번이면 소수점 아래 다섯 자리쯤.

12번 돌린 결과

cos 0.86591128 · sin 0.50019761

표준 라이브러리 값과 0 차이 · 곱셈은 한 번도 쓰지 않았습니다

cos θ (정확한 값)0.8660254038
sin θ (정확한 값)0.5
이득 K (12단계까지)0.6072529591
K를 곱하지 않으면cos 1.425948 · sin 0.823706
그때 벌어지는 배수 1/K1.6467602581배
마지막에 남은 각-0.0002 rad

단계별로 따라가기

iαᵢ = arctan(2⁻ⁱ)방향xy남은 각 z
045°+11-0.2617994
126.5651°1.50.50.2018482
214.0362°+1.3750.875-0.0431304
37.125°1.4843750.7031250.0812246
43.5763°+1.44042970.79589840.0188057
51.7899°+1.41555790.8409119-0.0124341
60.8952°1.42869710.81879380.0031896
70.4476°+1.42230030.8299555-0.0046227
80.2238°1.42554230.8243996-0.0007165
90.1119°1.42715250.82161530.0012366
100.056°+1.42635010.82300910.0002601
110.028°+1.42594820.8237055-0.0002282

x와 y는 이득을 곱하기 전의 값입니다. 마지막 x·y에 K = 0.60725296을 곱하면 cos·sin이 됩니다. 표의 마지막 x·y가 1보다 크게 나오는 것이 그 때문입니다.

반복 횟수와 오차

ncos오차맞은 자릿수
10.7071067810.2070.7
20.9486832980.1840.7
30.8436614880.0371.4
40.9037378390.0721.1
50.8752745880.0161.8
60.8597415730.0112
70.8676158150.0032.6
80.8637048070.0042.4
90.8656669450.0013.2
100.8666430660.0013
110.86615541803.6
120.86591128403.7
130.86603337704.9
140.86597233704
150.86600285904.4
160.86601811804.9
170.8660257485.957 ×10^-76.2
180.86602193305.2
190.8660238405.6
200.86602479406
계산 근거d = (z ≥ 0) ? +1 : −1 · x ← x − d·y·2⁻ⁱ · y ← y + d·x·2⁻ⁱ · z ← z − d·arctan(2⁻ⁱ)cos θ = K · x_n = 0.60725296 × 1.42594823 = 0.86591128K = Π cos(arctan 2⁻ⁱ) → 0.6072529350088812x를 갱신할 때 쓰는 y와 y를 갱신할 때 쓰는 x는 같은 시점의 값이어야 합니다. 한쪽을 먼저 덮어쓰고 그 값을 쓰면 회전이 아니라 엉뚱한 변환이 됩니다.
회전각으로 arctan(2⁻ⁱ)만 쓰는 것이 전부입니다. 회전행렬을 x cos α − y sin α = cos α · (x − y tan α)로 정리하면 tan α = 2⁻ⁱ일 때 곱셈이 오른쪽 시프트 i번이 됩니다. 남는 cos α는 어느 방향으로 돌든 같은 값이라 매 단계 곱하지 않고 맨 끝에 한 번만 처리하면 됩니다. 45°, 26.565°, 14.036°, 7.125°… 를 더하고 빼서 원하는 각을 만드는 것입니다.
이득 K를 잊으면 값이 1.6468배로 나옵니다. 매 단계 생략한 cos α를 모두 곱한 것이 K = 0.6072529350088813이고, 그 역수가 1.6467602581210654입니다. 첫 구현에서 가장 흔히 걸리는 자리이며 결과가 단위원이 아니라 반지름 1.6468인 원 위에 놓입니다. 하드웨어에서는 결과에 곱하는 대신 x₀ = K로 시작해 곱셈이 한 번도 나오지 않게 만듭니다.
K는 반복 횟수마다 다릅니다. 1번이면 0.7071, 2번이면 0.6325, 3번이면 0.6136이고 10번쯤부터 극한값과 소수점 다섯째 자리까지 같아집니다. 반복이 적은데 무한 곱의 값을 쓰면 그만큼 어긋나므로, n단계까지의 곱을 써야 합니다.
수렴 범위가 ±99.88297°입니다. 모든 회전각을 더한 값(1.7432866 라디안)보다 큰 각은 만들 수 없기 때문입니다. 그보다 큰 각은 먼저 사분면을 옮겨야 하며, 각을 −180~180°로 줄인 뒤 90°를 넘으면 180°를 빼거나 더하고 부호를 뒤집으면 남는 각이 반드시 90° 이하라 범위 안에 듭니다.
실제 하드웨어는 고정소수점을 씁니다. 그래야 2⁻ⁱ 곱하기가 진짜 시프트가 됩니다. 여기서는 배정밀도 실수로 계산해 반복을 늘리는 만큼 계속 좋아지지만, 고정소수점에서는 자릿수가 유한해 어느 지점부터는 나아지지 않습니다. 필요한 자릿수만큼만 돌리면 되는 이유이기도 합니다.

사용 방법

  1. 1각도를 넣고 반복 횟수를 정합니다. 16번이면 소수점 아래 다섯 자리쯤까지 맞습니다.
  2. 2단계별 표에서 남은 각 z가 어떻게 0에 다가가는지, x와 y가 어떻게 cos·sin이 되는지 봅니다.
  3. 3「이득 K를 곱하지 않으면」 줄에서 값이 1.6468배로 나오는 것을 확인합니다.
  4. 4아래 수렴 표에서 반복 횟수를 늘렸을 때 오차가 한 번에 한 비트씩 줄어드는 것을 봅니다.

자주 묻는 질문

회전각으로 arctan(2⁻ⁱ)만 쓰기 때문입니다. 회전행렬을 x cos α − y sin α = cos α · (x − y tan α)로 정리하면 tan α = 2⁻ⁱ일 때 곱셈이 오른쪽 시프트 i번이 됩니다. 남는 cos α는 어느 방향으로 돌든 같은 값이라 매 단계 곱하지 않고 맨 끝에 한 번만 처리합니다.

매 단계 생략한 cos α들을 모두 곱한 값으로 K = Π cos(arctan 2⁻ⁱ) = 0.6072529350088813입니다. 이것을 곱해 주지 않으면 결과가 1/K = 1.6467602581210654배로 나옵니다. 첫 구현에서 가장 흔히 걸리는 자리이며, 결과가 단위원이 아니라 반지름 1.6468인 원 위에 놓입니다.

결과에 곱해도 되고 처음부터 x₀ = K로 시작해도 됩니다. 하드웨어에서는 뒤엣것을 씁니다 — 곱셈을 없애자고 만든 알고리즘인데 마지막에 곱셈이 하나 남으면 곤란하므로, K를 상수로 미리 넣어 두면 곱셈이 한 번도 나오지 않습니다.

한 번에 대략 1비트씩 정확해지므로 원하는 정밀도의 비트 수만큼 돌리면 됩니다. n번 돌리면 남는 각이 arctan(2^−(n−1)) 이하이기 때문입니다. 16비트 고정소수점이면 16번, 배정밀도 실수의 한계까지 가려면 30번쯤 필요합니다.

모든 회전각을 더한 ±1.7432866 라디안, 곧 ±99.88297도입니다. 그보다 큰 각은 만들 수 없으므로 먼저 사분면을 옮겨야 합니다. 각을 −180~180도로 줄인 뒤 90도를 넘으면 180도를 빼거나 더하고 부호를 뒤집으면 남는 각이 반드시 90도 이하라 범위 안에 듭니다.

무관하지 않습니다. n단계까지의 곱만 써야 하며, 반복이 적은데 무한 곱의 값을 쓰면 그만큼 어긋납니다. 1번이면 0.7071, 2번이면 0.6325, 3번이면 0.6136이고 10번쯤부터 극한값과 소수점 다섯째 자리까지 같아집니다.

곱셈이 필요한지가 다릅니다. 테일러 급수는 거듭제곱과 나눗셈이 들어가 곱셈기가 있어야 빠르고, CORDIC은 시프트와 덧셈만으로 돌아가 곱셈기가 없는 하드웨어에서 이깁니다. 대신 CORDIC은 한 번에 1비트씩만 좋아져 반복 횟수가 비트 수만큼 필요합니다.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지고 넣은 값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 여기서는 배정밀도 실수로 계산합니다. 실제 하드웨어는 고정소수점이라 2⁻ⁱ 곱하기가 진짜 시프트가 됩니다.
  • 고정소수점에서는 자릿수가 유한해 반복을 늘려도 어느 지점부터는 좋아지지 않습니다.
  • 회전 모드(각 → sin·cos)만 다룹니다. 벡터링 모드(좌표 → 각·크기)는 범위 밖입니다.
  • 이득 K는 반복 횟수까지의 곱을 씁니다. 무한 곱의 값을 쓰면 반복이 적을 때 어긋납니다.
  • 수렴 범위는 ±99.88297도입니다. 그 밖은 사분면을 먼저 옮깁니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.