TECH 으로 돌아가기
TECH HACKER NEWS 오늘 8분 읽기 24 READS

인텔 8087은 탄젠트를 어떻게 계산했나: CORDIC와 다항식의 결합

인텔 8087은 탄젠트를 어떻게 계산했나: CORDIC와 다항식의 결합
SOURCE IMAGE · HACKER NEWS

1980년 인텔이 내놓은 8087 부동소수점 보조 프로세서는 IBM PC를 비롯한 여러 시스템에서 부동소수점 연산 속도를 크게 끌어올렸다. 그 효과는 삼각함수에서 특히 극적이었는데, 8086이 탄젠트 한 번을 13,000마이크로초에 계산하던 것을 8087은 90마이크로초로 줄였다. 100배가 넘는 격차다. 최근 이 칩의 다이(die)를 현미경으로 촬영하고 마이크로코드를 분석해 탄젠트 명령어(FPTAN)가 실제로 어떤 알고리즘으로 동작하는지 복원한 분석이 공개됐다. 결론부터 말하면, 8087은 흔히 알려진 CORDIC 하나만 쓴 것이 아니라 CORDIC와 다항식 근사를 결합해 정확도와 속도를 동시에 확보했다.

CORDIC라는 오래된 해법

CORDIC(COordinate Rotation DIgital Computer)은 곱셈이나 나눗셈 없이 시프트와 덧셈, 그리고 테이블 조회만으로 초월함수를 계산하는 알고리즘이다. 1956년 엔지니어 잭 볼더가 마하 2로 비행하는 폭격기 B-58 허슬러의 아날로그 항법 컴퓨터를 디지털로 대체하는 과정에서 고안했다. 아날로그 장치는 리졸버라는 전기기계 부품으로 사인·코사인을 쉽게 만들 수 있었지만, 당시의 느린 트랜지스터로 삼각함수를 디지털로 만드는 일은 까다로웠다. 볼더의 착상은 간단하면서도 강력했다. 원하는 각도를 arctan(2^-n) 형태의 '특수 각도'들의 합으로 분해하면, 각 회전을 2의 거듭제곱 곱셈, 즉 비트 시프트만으로 처리할 수 있다는 것이다. 특수 각도 표는 미리 계산해 저장해 두므로 연산이 빠르고, 반복 한 번마다 정확도가 1비트씩 늘어난다. 이 방식은 이후 공학용 계산기에도 널리 쓰였다.

원리는 단위원 위의 좌표로 이해하면 명확하다. 각도 θ는 단위원 위 점 (X, Y)를 정하고, 이때 X=cosθ, Y=sinθ, Y/X=tanθ가 성립한다. 즉 좌표만 구하면 탄젠트는 두 좌표의 나눗셈으로 얻어진다. 점이 단위원 위에 있지 않아도 tanθ는 여전히 Y/X로 구할 수 있는데, 이것이 8087이 실제로 활용하는 성질이다. 회전 행렬을 코사인으로 나누고 특수 각도를 대입하면 시프트와 덧셈, 뺄셈만으로 벡터를 회전시키는 식이 나오고, 초기 벡터 (1, 0)에서 시작해 각 특수 각도를 차례로 적용하면 원하는 각도의 벡터에 도달한다.

왜 CORDIC만으로 충분하지 않았나

CORDIC의 정확도는 사용하는 항의 수에 비례한다. 16개 항이면 약 16비트, 곧 2^-16 수준의 정확도를 얻는다. 문제는 8087이 목표로 한 정확도가 64비트라는 점이다. CORDIC만으로 64비트를 채우려면 64개의 항과 64개짜리 특수 각도 표가 필요해 속도가 크게 떨어진다. 8087은 여기서 타협 대신 조합을 택했다. CORDIC를 16비트까지만 돌리고, 남은 아주 작은 잔여 각도(약 2^-16 크기)는 다른 알고리즘으로 처리한 것이다.

잔여 각도에는 두 다항식의 비율인 파데 근사(Padé approximant)를 썼다. 8087이 쓴 식은 3x/(3-x²)로 단순하지만, 오차가 x⁴에 비례해 작은 x에서 매우 정확하다. x가 2^-16보다 작으므로 오차는 2^-64 미만이 되어 64비트 정확도 요건을 만족한다. 탄젠트가 π/2에서 무한대로 발산하는 특성상, 발산하지 않는 테일러 급수 다항식보다 분자와 분모의 비율로 표현하는 유리함수가 함수 모양에 더 잘 들어맞는다는 점도 이 선택의 근거다. 더구나 FPTAN은 분자와 분모를 따로 반환하므로, 근사식 안의 나눗셈을 실제로 수행할 필요가 없어 비용이 사실상 공짜가 된다.

유사 나눗셈과 유사 곱셈

실제 8087의 탄젠트 알고리즘은 세 단계로 나뉜다. 첫 단계는 어떤 특수 각도들을 더할지 결정하는 과정으로, 각 특수 각도를 남은 입력 각도와 비교해 더 작으면 빼면서 1을, 아니면 0을 기록한다. 이 절차가 나눗셈이 나머지를 깎아 몫의 비트를 만들어내는 과정과 닮아 '유사 나눗셈'이라 부른다. 예컨대 입력 0.95 라디안은 [1,0,0,1,0,1,0,1,0,0,1,0,0,1,1,1]이라는 결정 비트열을 만든다. 이 단계에서는 회전을 실제로 적용하지 않고, 나중에 어떤 회전을 적용할지만 정해 16비트 시프트 레지스터에 저장한다.

두 번째 단계에서 잔여 각도에 유리함수 근사를 적용해 초기 벡터를 만든다. 여기서도 나눗셈은 하지 않고 분자를 Y, 분모를 X로 삼는다. 3을 곱하는 것은 시프트와 덧셈으로 쉽게 되므로, 이 단계에서 값비싼 연산은 각도를 제곱하는 64비트 곱셈 하나뿐이다. 마지막 세 번째 단계인 '유사 곱셈'에서는 저장해 둔 결정 비트가 1인 경우에만 해당 회전을 적용한다. 이때 반올림 오차를 줄이기 위해 가장 작은 회전부터, 즉 첫 단계와 반대 순서로 비트를 꺼내 적용한다. 각 회전은 시프트와 덧셈·뺄셈뿐이라 저렴하다.

실무적 함의와 한계

FPTAN이 탄젠트 값을 바로 주지 않고 나눌 수 있는 두 좌표(X와 Y)를 '부분 탄젠트'로 반환하는 설계는 오늘날 기준으로는 낯설다. 당시 나눗셈이 느렸기 때문에 나눗셈을 생략해 특정 상황에서 최적화 여지를 남긴 결정이었다. 이는 하드웨어 자원이 극도로 제약된 환경에서 알고리즘과 명령어 인터페이스를 함께 설계하는 방식이 어떠했는지 보여준다. 정확도 요건과 연산 비용을 비트 단위로 따져 CORDIC의 반복 횟수를 16으로 끊고 나머지를 유리함수로 메운 판단은, 단일 알고리즘을 고수하기보다 서로 다른 근사 기법의 강점을 조합하는 접근의 전형이다.

다만 이 분석은 40여 년 전 특정 칩의 마이크로코드를 역공학한 결과라는 점을 감안해야 한다. 여기 담긴 트레이드오프는 곱셈과 나눗셈이 비싸고 메모리가 귀하던 시대의 제약을 반영한 것이며, 하드웨어 곱셈기가 흔하고 룩업 테이블 용량이 넉넉한 현대 프로세서의 초월함수 구현과 직접 비교하기는 어렵다. 그럼에도 정확도 예산을 명확히 정의하고 각 구간에 가장 값싼 기법을 배치하는 사고방식은 수치 연산이나 임베디드 환경에서 여전히 유효한 설계 원칙으로 남는다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://www.righto.com/2026/09/8087-tangent-cordic.html
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...