2009-09-20 7 views
4

특정 블록에서 3 * 500 * 500 주위의 실수를 지수화해야하는 응용 프로그램을 작성하고 있습니다. exp (y * log (x)) 알고리즘을 사용할 때 프로그램이 눈에 띄게 지연됩니다. 데이터 유형을 가지고 놀면서 다른 알고리즘을 사용하면 속도가 훨씬 빠르지 만 그 알고리즘은 정확하지는 않지만 시뮬레이션 결과는 좋지만 속도면에서 완벽하지는 않습니다.빠른 지수 : real^real (C++ MinGW, Code :: Blocks)

실제 힘에 대한 정확한 지수 계산 알고리즘이 exp (y * log (x))보다 빠릅니까?

미리 감사드립니다.

답변

5

좋은 정확도가 필요하고 기본 (x 값)의 분포에 대해 알지 못하는 경우 pow (x, y)가 가장 유용한 휴대용 대답입니다. 이것은 exp (y * log (x))보다 빠르며 수치 적으로도 더 잘 작동합니다. x와 y가 어떤 범위에 속할 수 있는지, 그리고 어떤 분포를 가지고 있는지에 대해 알고 있다면 조언을 제공하려는 사람들에게 커다란 도움이 될 것입니다.

좋은 정확도를 유지하면서 더 빨리 수행하는 일반적인 방법은 x 값의 배열과 y 값의 배열에 대해 이러한 계산을 동시에 수행하도록 설계된 라이브러리 루틴을 사용하는 것입니다. 이러한 라이브러리 구현은 Intel MKL과 같은 비용이나 플랫폼 별 (예 : OS X의 Accelerate.framework에서 vvpowf)이되는 경향이 있습니다. MinGW에 대해 많이 알지 못하므로 다른 사람이 사용 가능한 것을 알려줄 필요가 있습니다. GSL에는이 라인을 따라 뭔가가있을 수 있습니다.

4

알고리즘에 따라 (특히 추가 기능이 거의없는 경우), 때로는 로그 공간에서 작업 (적어도 부분적으로)을 벗어날 수 있습니다. 아마도 이미 이것을 고려해 보았 겠지만, 중간 표현이 log_x 및 log_y이면 log (x^y) = exp (log_y) * log_x 일 것이 더 빠릅니다. 선택에 대해서조차 수 있다면, 분명히 y * log_x로 log (x^y)를 계산하는 것이 훨씬 저렴합니다. 몇 번의 지수 계산조차도 피할 수 있다면 많은 성과를 얻을 수 있습니다. 어떤 루프를 다시 작성할 수있는 방법이 있다면 가장 내부 루프 밖에서 누적 연산을 얻어야합니다. 이는 상당히 확실한 성능 향상입니다.

+0

+1 로그 공간 제안. –