실축 근처 정확도 손실 원인과 해결책
본 논문은 복소 오류 함수 w(z) 를 계산하는 알고리즘 680이 실축에 매우 가깝게 위치한 입력값에서 발생하는 정확도 저하의 원인을 규명하고, 간단한 보정 방식을 제시한다. 제안된 보정은 기존 코드의 구조를 크게 변경하지 않으면서도 실축 근처에서의 상대 오차를 원래 수준으로 회복시킨다.
초록
본 논문은 복소 오류 함수 w(z) 를 계산하는 알고리즘 680이 실축에 매우 가깝게 위치한 입력값에서 발생하는 정확도 저하의 원인을 규명하고, 간단한 보정 방식을 제시한다. 제안된 보정은 기존 코드의 구조를 크게 변경하지 않으면서도 실축 근처에서의 상대 오차를 원래 수준으로 회복시킨다.
상세 요약
알고리즘 680은 복소 오류 함수 w(z)=e^{-z^{2}} erfc(-i z) 를 평가하기 위해 영역별 유리근사와 급수 전개를 혼합한 하이브리드 방식을 사용한다. 특히 실축에 가까운 영역(Imag z ≪ 1)에서는 복소 지수 e^{-z^{2}} 와 보완오차함수 erfc 의 차이가 크게 상쇄되면서 부동소수점 연산에서 유효숫자 손실이 발생한다. 논문은 이 현상이 “뱅크-오버플로우”라기보다 “소실(cancellation)”에 기인함을 수치 실험을 통해 입증한다. 기존 구현에서는 실축 근처에서도 동일한 유리근사를 적용했는데, 이때 분모와 분자가 거의 동일한 크기를 가지면서 1 ULP 수준의 차이만 남게 된다. 결과적으로 상대 오차가 10^{-12} 이하로 떨어지는 경우가 많았지만, y < 10^{-7} 정도에서는 10^{-8} 이상의 오차가 급격히 증가한다. 저자는 이러한 현상을 해결하기 위해 두 가지 접근법을 제안한다. 첫째, |Im z|가 일정 임계값 이하일 때는 복소 오류 함수의 테일러 급수를 직접 전개하여 계산한다. 이 급수는 w(z)=1 - 2i z/√π + … 형태로, y가 작을수록 수렴 속도가 빠르다. 둘째, 대칭성 w(z)=2 e^{-z^{2}} - w(-z) 를 활용해 부동소수점 오버플로우를 방지하고, 작은 y에 대해는 w(-z) 를 앞서 정의한 급수로 평가한다. 구현상의 핵심은 임계값 τ≈10^{-5} 을 설정하고, |Im z| < τ인 경우에만 급수 전개로 전환하는 로직을 삽입하는 것이다. 이 보정은 기존 코드에 최소한의 조건문만 추가하면 되므로 연산 비용이 크게 증가하지 않는다. 실험 결과, 보정 후에는 전체 입력 범위에서 평균 상대 오차가 10^{-14} 수준으로 유지되며, 특히 실축 근처에서는 오차가 10^{-12} 이하로 회복됨을 확인한다. 따라서 알고리즘 680은 여전히 높은 정확도와 빠른 실행 속도를 제공하는 표준 레퍼런스 루틴으로 재사용될 수 있다.
📜 논문 원문 (영문)
🚀 1TB 저장소에서 고화질 레이아웃을 불러오는 중입니다...