2013-03-11 5 views
0

유한 정밀도 (데이터 형식이 double)에서 exp 함수의 오류를 계산하고 싶습니다. 테일러 시리즈 또는 다른 특수 알고리즘입니까?c에서 exp 함수를 구현하는 방법은 무엇입니까?

+1

당신의 제목은 당신이'exp' 기능을 구현하길 원한다고 말합니다. 당신의 몸은 당신이'exp' 함수의 에러를 계산하기를 원한다고 말합니다. (a) 어느 것이 옳은가? (b) 오류를 계산하려면 어떤 구현에서 오류를 계산 하시겠습니까? 예를 들어, C 구현에서 'exp'로 계산 된 결과가 수학적으로 이상적인 e ** x 함수와 얼마나 다른지 알고 싶습니까? –

+0

@EricPostpischil 우리는 먼저 exp 함수를 구현하는 방법을 알아야한다고 생각하고 오류를 계산할 수 있습니다. 당신 말이 맞아요. 나는 exp에 의해 계산 된 오차가 이상과 다른 것을 알고 싶다. –

+0

fdlibm의 구현은 합리적인 근사법을 사용하며 1 ulp 미만의 오류가 있습니다. http://www.netlib.org/fdlibm/e_exp.c – Joni

답변

8

일반적으로, 가장 좋은 방법은 전자 X 당신의 컴퓨팅 플랫폼에서 제공하는 exp 함수를 호출하는 것입니다 구현합니다.

이 문제가 발생하면 exp 기능을 구현하는 것이 복잡해지고 몇 가지 필수적인 기술이 필요합니다. 구현에는 일반적으로 다음이 포함됩니다.

  • NaN과 같은 다양한 특수한 경우에 대한 입력을 테스트합니다. 로그 특별히 준비된 표현 2 E로 입력 곱
  • , X 2 Y, 전자에서 문제를 변형 여기서 Y = X • 로그 2 이자형.
  • y의 정수 부분을 부동 소수점 인코딩의 지수 필드로 이동합니다.
  • y의 지수 부분을 minimax polynomial으로 계산합니다.
  • 위의 두 결과를 결합하십시오.

는 또한 :

  • 는 최소 최대 다항식은 유사한 Remez algorithm 또는 무언가를 사용하여, 종종 특별한 소프트웨어로 설계되었습니다.
  • 최종 결과를 정확하게 계산할 수 있도록 작업을 확장 된 정밀도로 수행해야합니다.

테일러 계열은 중심점에서 부정확하기 때문에 기능을 평가하는 데 적합하지 않습니다. 이것은 그들이 필요한 정밀도로 수렴하기에 너무 많은 용어를 사용한다는 것을 의미합니다. 너무 많은 용어를 갖는 것은 시간이 걸릴뿐만 아니라 정확하게 산술 연산을 수행하는 것을 어렵게 만듭니다.

+0

위키에서이 방법을 찾았지만 확인할 수 없습니다. Tks. –

2

에릭이 자신의 답변에서 말한 것에 많은 부분 동의하는 반면, 추가할만한 가치가 있습니다. 필자는 다른 것들 중에서 지수가 높은 (사용자가 지정한) 정밀도를 평가할 수있는 도구를 썼다.

정밀도가 달라질 수있는 경우 반드시 일련 근사와 같은 도구를 사용해야합니다. 단 하나의 다항식 근사법으로 충분하지 않기 때문입니다. 그럼에도 불구하고, 많은 트릭을 사용할 수 있습니다. 사실, 나는 그러한 일련의 작업을 가속화하기 위해 사용했던 다양한 트릭에 놀랐다.

그러한 노력에 대한 훌륭한 출발 가이드는 하트 (Howard)의 "컴퓨터 근사 (Computer Approximations)"라는 책으로 슬프게도 쉽게 찾을 수없는 책입니다. 많은 다항식 근사법을 제공하지만, 범위 감소 트릭에 대한 중간 정도의 세부 사항도 이야기합니다.

지수 계열 자체가 특히 흥미 롭습니다. 나는 HPF에 포함 된 HPFMod2.pdf 파일의 4.1 절에서 지수로 사용한 방법을 설명합니다.

예를 들어, exp (123.456789)를 계산하려면 시리즈를 직접 사용하려고 시도하지만 e 자체의 값을 저장하는 것이 좋습니다. 그리고 우리는 우리가 반복 제곱에 의해 2의 거듭 제곱의 지수 함수를 얻을 수

exp(123.456789) = exp(1)*exp(2)*exp(8)*exp(16)*exp(32)*exp(64)*exp(.456789) 

을 계산하는 범위 감소를 사용할 수 있습니다, 다음 소수 부분은 적당히 빠른 속도로 수렴됩니다. (예는 31 개 용어는 최종 시리즈에서 정밀도 100 개 숫자 필요합니다.)

그러나, 우리는 단지 지금

123.456789 = 28*ln(10) + 58.9844063961667 

, 우리가 쓸 수 있음을 알 우연히 가정 해 봅시다 원하는 기하 급수적으로 :

exp(123.456789) = 10^28 * exp(1)*exp(2)*exp(8)*exp(16)*exp(32)*exp(-0.0155936038332811) 

ln (10)의 값을 알고있는 한, 최종 시리즈에는 원하는 100 자리의 정밀도를 얻기 위해 약 17 개의 용어 만 필요합니다.

관련 문제