프롬프트:
cr_sin_degrees.c에 correctly rounded sine 함수를 작성해 줘. 함수 시그니쳐는 double cr_sin_degrees(double x); 인데 x는 라디안이 아니라 각도여야 해(따라서 cr_sin_degrees(90.0) == 1.0). finite한 모든 double 값에 대해서 0.5 ulp 이하의 오차를 기록해야 해. 현재 반올림 모드가 round-to-nearest고, FMA가 사용 가능하다(
__builtin_fma)고 가정해도 무방해. sine 함수 자체는 다른 의존성이 없는 순수한 C 코드여야 하지만, 개발을 위해서 필요한 도구가 있다면 알려 주면 설치해 줄게.
접근법 개요:
- 정확 인자 축약: fmod(x, 360) (정확) → fmod(·, 90) (정확)으로 사분면 k와 잔여 각도 r ∈ [0, 90)을 오차 없이 분리. 라디안 sine과 달리 인자 축약이 완전히 exact 해서 파이 곱셈 외엔 transcendental 오차가 없는 게 핵심 이점.
- dd(double-double) 산술로 r * π/180 계산 (π/180을 ~106비트 상수로 사전 계산).