라디안 대신 턴을 쓰는 게 더 낫다

Turns are Better than Radians

라디안 대신 턴을 쓰는 게 더 낫다

많은 개발자들이 코드에서 pi나 tau 상수를 사용해 라디안으로 변환한 뒤 삼각함수를 호출한다. 하지만 실제로 대부분의 sin/cos 구현은 입력값을 다시 4/pi로 곱해 라디안을 제거한다. 즉, 불필요한 변환과 곱셈이 발생하는 것이다. 각도를 0에서 1 사이의 '턴(turn)'으로 표현하면 이런 낭비를 없앨 수 있고, 90도(0.25), 180도(0.5) 같은 값도 정확히 표현할 수 있다. CUDA의 sincospi 같은 일부 라이브러리는 이미 반 턴 기반 함수를 제공한다. 저자는 라디안 대신 턴을 사용하도록 코드베이스를 전환한 경험을 공유하며, 이렇게 하면 코드가 더 명확해지고 불필요한 상수가 사라진다고 주장한다.

만약 두 프로그래머가 라디안을 쓰지 않기로 합의하고, h가 이미 사용 중이던 원래의 [0, 1] 도메인을 그대로 사용했다면, 둘 다 작업이 더 간단해졌을 것이다: 호출하는 쪽은 곱셈을 절약하고, 라이브러리는 더 이해하기 쉬운 정확한 상수를 얻는다.
  1. kazinator

    수학은 턴(turn) 단위로는 확실히 문제가 있습니다. 오일러 공식 e^ix = cos x + i sin x가 더 이상 성립하지 않기 때문입니다. e 대신 다른 밑수를 사용할 수 있는데, B = e^(2π) ≈ 535.4916을 사용하면 됩니다. 하지만 이는 d/dx e^x = e^x와 같은 e의 멋진 성질을 갖지 못합니다.

    자연로그의 밑이 자기 자신의 도함수인 지수함수를 만들어내면서 오일러 공식의 기저로도 나타난다는 우아한 사실은 라디안이 특별함을 보여줍니다. 마치 이진법이 컴퓨터에 특별한 것처럼요.

    자연로그가 자기 자신의 도함수라는 사실은 사실 라디안 기반의 sin(x)의 도함수가 cos(x)라는 것 등과 직접적으로 연결됩니다. 다른 단위를 사용하면 2π보다 더 심한 변환 계수들의 난장판이 생깁니다.

    복잡한 연쇄 미분, 이계/삼계 도함수, 연쇄 법칙과 곱의 법칙을 상상해 보세요. 삼각 함수로 가득 차 있고, 라디안을 사용하지 않음으로 인해 불필요하게 쌓이는 변환 상수들이 생길 것입니다.

  2. WCSTombs

    어느 정도는 이 의견에 조심스럽게 동의합니다. 하지만 제 생각에 진짜 답은 용도에 따라 다르다는 것이고, 저수준 삼각함수 라이브러리를 작성할 때 하나를 선택해야 한다면 턴(turn)이 라디안보다 우월하다는 것이 저에게는 명확하지 않습니다.

    삼각법을 사용하는 많은 시스템이 효율성이나 일반적인 경우를 부트스트랩하기 위해 작은 각도 근사를 사용할 것이라고 예상합니다. 여기서 테일러 급수를 사용하는 것이 자연스러울 것입니다. 예를 들어:

    cos(x) = 1 - x^2/2 + ...

    sin(x) = x - x^3/6 + ...

    모든 삼각법을 "턴" 단위로 표현하기로 결정했다면 대신 다음을 사용해야 합니다:

    cos(2πt) = 1 - (2πt)^2/2 + ...

    sin(2πt) = (2πt) - (2πt)^3/6 + ...

    이 경우 라디안으로 작업해야 할 때 모든 것을 턴으로 강제 변환하는 것은 정확성과 효율성 면에서 떨어질 것입니다.

    이와 밀접하게 관련하여, 삼각 함수를 포함하는 함수의 도함수가 필요한 경우(예: 수치 최적화) 라디안을 사용하는 것이 좋습니다. 그렇지 않으면 적용하는 추가 계수가 도함수 표현에 나타나서 어차피 거기서 처리해야 하기 때문입니다.

    기본적으로 이러한 이유로, 라디안 기반 삼각 함수의 도함수가 표현하기 매우 쉽기 때문에 수학적으로(컴퓨터 밖에서) 라디안으로 삼각법을 표현하는 것이 "올바른" 관례라는 것이 분명합니다. 그렇다면 하나의 관례를 선택해야 한다면... 모든 곳에서 같은 것을 사용하는 것이 덜 혼란스럽지 않을까요? 그렇긴 하지만, [...]

  3. mayoff

    저는 개인 코드에서 각도를 턴(turn)으로 저장하는 것을 좋아합니다. 언급했듯이 사분원(quarter-turn)을 반올림 없이 계산할 수 있기 때문입니다. 반면에 12분의 1턴 같은 것이 필요하다면 각도를 도(degree)로 저장하는 것이 이미 일반적이므로 그렇게 하는 것이 나을 수도 있습니다.

    Michael Spivak은 《Calculus》(3판, p. 301)에서 단위 선택을 함수의 속성으로 간주하고 처음에 sin°와 sinʳ을 정의한 후(결국 sin이 sinʳ을 의미하는 것으로 정착) "sin x°"와 "sin x radians"가 오해를 불러일으킨다고 말합니다. "숫자 x는 단순히 숫자일 뿐, '도' 또는 '라디안'이라는 깃발을 달고 다니지 않는다"고요. 저는 이 주장을 잘 이해하지 못하겠습니다. 과학과 공학에서는 항상 양에 단위를 붙여 다니기 때문입니다.

  4. srean

    한 바퀴 돌아서 생각해 봅시다.

    이 모든 것은 sin과 cos 함수 호출에서 자주 나타나는 2π를 τ로 대체하는 것에서 시작되었습니다.

    이 글은 라디안을 없애서 τ를 없애는 최적화를 제안합니다. 그렇게 하면 빈번하고 인접한 라디안-도 변환을 없앨 수 있습니다.

    저는 sin과 cos 자체를 없애자고 말합니다!

    물론 저는 과장하고 있습니다. 하지만 각도를 도, 라디안, 턴의 스칼라로 표현하지 않고 (sin, cos) 튜플로 표현하면 삼각 함수 호출 횟수를 극적으로 줄일 수 있는 경우가 많습니다. 유리 다항식과 제곱근만으로 충분합니다. 회전은 사인과 코사인을 항목으로 하는 행렬을 사용하는 선형 변환이라는 것을 기억하세요.

    API로는 편리하지 않을 수 있지만, 코드가 삼각 함수를 자주 호출한다면 각도를 내부적으로 사인과 코사인의 튜플로 변환하여 그렇게 유지하는 것을 고려해 보세요.

    (참고: 때로는 반각(half angle)으로 튜플을 유지하는 것을 선호합니다. tan(θ/2)는 갖고 있으면 좋습니다. 그리고 이 글에 제가 남긴 댓글 수가 부끄럽습니다.)

  5. traes

    매우 대담한 제목이네요! 턴(turn)은 변화율을 계산할 때까지는 매우 편리합니다. 물론 d/dx sin(2πx) = 2π cos(2πx)이기 때문입니다. 불행히도 이것은 충분히 흔한 문제라서 저는 라디안을 계속 사용할 것입니다.

  6. mattmcal

    물리학 학부 때 이 아이디어를 몇몇 동기들에게 주장했고 그들도 동의했습니다. 하지만 나중에 삼각 함수의 도함수/적분에 미치는 영향 때문에 의견을 바꿨습니다.

    일반적인 주기 함수의 경우 [0, 1)이 좋은 정의역입니다. 그러나 원과 구는 기하학적 객체이며, 라디안/스테라디안은 일반적인 목적에 잘 맞는 기하학적으로 의미 있는 단위입니다.

    Doom이 각도를 `(2 * pi) / 65536`의 u16 배수로 표현하는 흥미로운 대안을 사용한다는 것을 기억합니다. 고정 소수점은 균일한 정밀도 때문에 게임과 시뮬레이션에서 때때로 좋은 선택입니다.

  7. chabska

    문제는 삼각 함수가 기하학 외의 훨씬 더 많은 분야에서 사용된다는 것입니다. 입력이 항상 유클리드 공간의 점 주위 각도가 아니라 주기 신호의 위상각일 수 있습니다. 턴(turn)을 받는 대체 삼각 함수 집합을 만들 수는 있지만, 기본 삼각 함수를 건드리면 많은 사람들이 화를 낼 것입니다.

  8. jerf

    이 전체 대화를 읽어 보니 사람들이 이 문제의 실용적 영향을 거의 빠뜨리고 있다고 느낍니다. 즉, 여러분이 원하는 만큼 "턴(turn)" 단위로 자신만의 수학을 작성할 수 있다는 것입니다. 지금 당장 아무것도 막지 않습니다. 턴을 받는 sinT 함수를 정의하는 것은 사소합니다. 다른 모든 함수도 마찬가지입니다.

    저는 그래픽 프로그래밍을 많이 해본 적은 없지만, 했던 것은 파이 대신 타우(tau)로 했습니다. 여러분 모두 수학이 완전히 다시 쓰여진 평행 우주에 들어가야 하는지에 대해 논쟁하는 것 같지만, 그럴 필요는 없습니다. 쉬웠습니다. 우주와 충돌하지 않았습니다. 그냥 "2 * pi" 대신 "tau"를 사용했습니다. 그게 다입니다. "const TAU = 2 * PI;"라고 쓰면 변환 작업이 끝났습니다. 마찬가지로, 제안된 것은 "sin(2 * pi * (1/4))" 대신 sinT 같은 것을 정의하고 "sinT(1/4)"라고 쓰는 것입니다.

    진심으로, 그게 다입니다. 세상의 모든 수학 라이브러리를 다시 쓸 필요가 없습니다. 수학 라이브러리가 그것을 지원할 필요조차 없습니다. 이것들은 복잡한 래퍼가 아닙니다. 도함수를 취하는 것에 대해 걱정하기 위해 미적분학 전체를 다시 할 필요도 없습니다. 게다가 도(degree)는 이미 같은 문제를 모두 가지고 있고 우리는 그것도 많이 사용합니다. 도를 받는 삼각 함수 변형이 그렇게 드물지 않으며, 이것은 또 다른 변형일 뿐입니다. 수학 라이브러리에 가서 턴 기반이 아닌 모든 것을 제거할 필요가 없습니다. 그것을 강제할 필요도 없습니다. [...]

이 날의 다른 글

2026-08-20