log1p와 expm1은 언제 사용해야합니까?


30

Google에 어려운 질문이 있습니다 ( 모든 컴퓨터 과학자가 부동 소수점 산술 용지에 대해 알아야 할 표준 외에도 ).

과 대신에 log1p또는 같은 기능을 사용해야하는 경우는 언제 입니까? 언제 사용해서는 안됩니까? 이러한 기능의 다른 구현은 사용법 측면에서 어떻게 다릅니 까?expm1logexp


2
Scicomp.SE에 오신 것을 환영합니다! 그것은 매우 합리적인 질문입니다,하지만 당신은 조금 설명하면 대답 쉬울 것이다 당신이 (우리가 생각하지 않아도이 구현있어 특히 방법)을 참조하고 있습니다. log1p
Christian Clason

4
실수 인수의 경우 x 가 작을 때, 예를 들어 부동 소수점 정확도에서 1 + x = 1 일 때 log1p 및 expm1 ( x )을 사용해야합니다 . 예를 들어 docs.scipy.org/doc/numpy/reference/generated/numpy.expm1.htmldocs.scipy.org/doc/numpy/reference/generated/numpy.log1p.html을 참조하십시오 . (x)(x)x1+x=1
GoHokies

@ ChristianClason 덕분에 나는 주로 C ++ std 또는 R을 언급하고 있지만, 구현의 차이점에 대해 배우는 것도 매우 흥미로울 것이라고 생각하기 시작합니다.
Tim


1
@ user2186862 "때 뿐만 아니라, 작은"올바른 "경우 (1) + X = 1 의 부동 소수점 정밀도"(발생위한 X 10 - 16 보통 배정도 산술). 문서 페이지는 당신은 그들이 이미 유용하다는 쇼 연결된 X (10) - (10) 예를 들어,. x1+x=1x1016x1010
Federico Poloni

답변:


25

우리는 모두

exp(x)=n=0xnn!=1+x+12x2+
에 대한 것을 의미|x|1,exp(x)1+x입니다. 이것은 우리가있는 경우 부동 소수점에서 평가하는 것을 의미exp(x)1위해,|x|1치명적인 취소가 발생할 수 있습니다.

이것은 파이썬에서 쉽게 설명 할 수 있습니다.

>>> from math import (exp, expm1)

>>> x = 1e-8
>>> exp(x) - 1
9.99999993922529e-09
>>> expm1(x)
1.0000000050000001e-08

>>> x = 1e-22
>>> exp(x) - 1
0.0
>>> expm1(x)
1e-22

정확한 값은

exp(108)1=0.000000010000000050000000166666667083333334166666668exp(1022)1=0.000000000000000000000100000000000000000000005000000

일반적으로에 "정확한"의 구현 exp과는 expm1더 이상 1ULP 이상 (마지막 장소, 즉 하나의 단위)에 올바른합니다. 그러나이 정확도를 달성하면 "느린"코드가 생성되기 때문에 때로는 더 빠르고 덜 정확한 구현이 가능합니다. 예를 들어 CUDA에는 expfand 가 있으며 빠른 expm1f곳을 f나타냅니다. CUDA C 프로그래밍 가이드, 앱 에 따르면 . Dexpf 오류는 2ULP입니다.

ULPS가 적은 순서대로 오류를 신경 쓰지 않으면 일반적으로 지수 함수의 다른 구현은 동일하지만 버그가 어딘가에 숨겨져있을 수 있습니다 ... ( Pentium FDIV 버그 기억 ?)

꽤 것을 명확하게 알 수 있도록 expm1계산하는 데 사용되어야한다 exp(x)1 작은을 위해x . 일반x 사용하면expm1전체 범위에서 정확할 것으로 예상되므로 유해하지 않습니다.

>>> exp(200)-1 == exp(200) == expm1(200)
True

(위의 예 1exp(200) 1ULP보다 훨씬 낮으므로 세 표현식 모두 정확히 동일한 부동 소수점 숫자를 반환합니다.

유사한 논의가 역함수에 대한 보유 log하고 log1p보낸 log(1+x)x 에 대한 |x|1 .


1
이 답변은 이미 OP 질문에 대한 의견에 포함되어 있습니다. 그러나 명확성을 위해 더 긴 (기본이지만) 설명을 제공하는 것이 유용하다고 생각했습니다. 일부 독자에게는 유용 할 것입니다.
Stefano M

그래도 간단하게 "따라서 항상 exp 대신 expm1을 사용할 수있다"는 결론을 내릴 수 있습니다.
Tim

1
@tim 당신의 결론이 잘못되었습니다 : 당신은 항상 expm1(x)대신 사용할 수 있습니다 exp(x)-1. 물론 exp(x) == exp(x) - 1일반적인 것은 아닙니다.
Stefano M

x1

1
expm1(x)0x1exp(x) - 1x1x<ϵϵ

1

차이점을 확장하려면 loglog1p는 대수 경우 그래프를 기억하는 데 도움이 될 수 있습니다

로그

logx0ln(x)x0ln(x)ln(1e)=1ln(1e10)=10

x0ln(x+1)0ln(1+1e)0.31ln(1+1e10)0.000045log1p 양수 값만 생성하고 큰 음수의 '위험'을 제거합니다. 이는 일반적으로 데이터 집합에 0에 가까운 숫자가 포함되어있을 때 더 균일 한 분포를 보장합니다.

1log01log1p

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.