2017-02-25 16 views
2

저는 사인/코사인의 많은 구현에서 이른바 확장 모듈 식 산수를 보았습니다. 그러나 그것은 무엇을위한 것입니까? 예를 들어, cephes implemetation에서 범위 [0, pi/4]로 축소 한 후 정밀도를 향상시키기 위해 모듈 식 정밀 연산을 수행하고 있습니다. 코드 이하사인 코사인 모듈 식 확장 된 정밀도 산호

: DP1, DP2와 DP3 일부 하드 계수이다

z = ((x - y * DP1) - y * DP2) - y * DP3; 

. 수학적으로 이러한 계수를 찾는 방법은 무엇입니까? 나는 큰 숫자에 대해 "모듈 식 확장 산술"의 목적을 이해하지만 여기서 정확한 목적은 무엇입니까?

+0

"코디 - 웨이트 인수 감소"를 찾으십시오.온라인에서 많은 자료를 찾을 수 있으며, 그 중 일부는 무료로 제공됩니다. 출처 : 윌리엄 코디 (William J. Cody)와 윌리엄 웨이트 (William Waite), 초등부 함수 *, Prentice-Hall, 1980에 대한 소프트웨어 매뉴얼 – njuffa

답변

7

삼각 함수의 인수 축소와 관련하여, Cody-Waite 인수 감소, 즉 William J. Cody와 William Waite, 초등 함수 용 소프트웨어 설명서, Prentice-Hall, 1980. 목표는 중간 계산에서 subtractive cancellation 임에도 불구하고 논증에 대해 어느 정도까지는 정확한 감소 된 주장을 달성하는 것이다. 이 목적을 위해 관련 상수는 복수의 감소하는 크기 (여기서는 DP1, DP2, DP3)의 합계를 사용하여 고유 정확도 이상으로 으로 표시되므로 최하위를 제외한 모든 중간 제품이 반올림 오류없이 계산할 수 있습니다.

예를 들어 IEEE-754 binary32 (단 정밀도)에서 sin (113)의 계산을 고려하십시오. 일반적인 인수 감소는 개념적으로 i=rintf(x/(π/2)); reduced_x = x-i*(π/2)을 계산합니다. π/2에 가장 가까운 숫자 인 binary320x1.921fb6p+0입니다. i=72을 계산하면 0x1.c463acp+6으로 반올림되며 이는 x=0x1.c40000p+6 인수에 가깝습니다. 뺄셈 과정에서 일부 선행 비트가 취소되고 reduced_x = -0x1.8eb000p-4으로 끝납니다. 재 정규화에 의해 도입 된 후미 0에 주목하십시오. 이 제로 비트는 유용한 정보를 담고 있지 않습니다. 감소 된 인수 인 sin(x) = -0x1.8e0eeap-4에 대한 정확한 근사값을 적용하는 반면, 실제 결과는 -0x1.8e0e9d39...p-4입니다. 우리는 큰 상대 오차와 큰 ulp 오차로 끝을 맺습니다.

두 단계의 Cody-Waite 인수 감소를 사용하여이를 해결할 수 있습니다. 예를 들어 pio2_hi = 0x1.921f00p+0pio2_lo = 0x1.6a8886p-17을 사용할 수 있습니다. 8 자릿수의 후행 0 비트는 pio2_hi의 단 정밀도 표현으로, 8 비트 정수 i으로 곱할 수 있고 i * pio2_hi정확하게 표현할 수 있으며 단 정밀도 숫자로 정확히입니다. ((x - i * pio2_hi) - i * pio2_lo)을 계산할 때 reduced_x = -0x1.8eafb4p-4이되며 따라서 sin(x) = -0x1.8e0e9ep-4이됩니다.

상수를 합계로 분할하는 가장 좋은 방법은 주어진 인수 범위에 대해 빼기 취소가 발생할 수있는 최대 비트 수 (처리 할 필요가있는 i의 크기)에 따라 달라집니다 (π/2는 정수에 도달 할 수 있음), 성능 고려 사항. 일반적인 실제 사용 사례는 2 ~ 4 단계의 Cody-Waite 감소 방식을 포함합니다. FMA (fused multiple-add)를 사용할 수 있기 때문에 후행하는 0 비트가 적은 구성 상수를 사용할 수 있습니다. 이 논문을 참조하십시오 : Sylvie Boldo, Marc Daumas, Ren-Cang Li, "공식적으로 인수 융합을 통한 인수 축소 검증." 컴퓨터에서의 IEEE 거래, 58 : 1139-1145, 2009. fmaf()을 사용한 작업 예제의 경우 one of my previous answers의 코드를 참조 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 그게 바로 제가 찾고 있던 것이 었습니다! –