Google에 어려운 질문이 있습니다 ( 모든 컴퓨터 과학자가 부동 소수점 산술 용지에 대해 알아야 할 표준 외에도 ).
과 대신에 log1p
또는 같은 기능을 사용해야하는 경우는 언제 입니까? 언제 사용해서는 안됩니까? 이러한 기능의 다른 구현은 사용법 측면에서 어떻게 다릅니 까?expm1
log
exp
Google에 어려운 질문이 있습니다 ( 모든 컴퓨터 과학자가 부동 소수점 산술 용지에 대해 알아야 할 표준 외에도 ).
과 대신에 log1p
또는 같은 기능을 사용해야하는 경우는 언제 입니까? 언제 사용해서는 안됩니까? 이러한 기능의 다른 구현은 사용법 측면에서 어떻게 다릅니 까?expm1
log
exp
답변:
우리는 모두
이것은 파이썬에서 쉽게 설명 할 수 있습니다.
>>> 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
과는 expm1
더 이상 1ULP 이상 (마지막 장소, 즉 하나의 단위)에 올바른합니다. 그러나이 정확도를 달성하면 "느린"코드가 생성되기 때문에 때로는 더 빠르고 덜 정확한 구현이 가능합니다. 예를 들어 CUDA에는 expf
and 가 있으며 빠른 expm1f
곳을 f
나타냅니다. CUDA C 프로그래밍 가이드, 앱 에 따르면 . Dexpf
오류는 2ULP입니다.
ULPS가 적은 순서대로 오류를 신경 쓰지 않으면 일반적으로 지수 함수의 다른 구현은 동일하지만 버그가 어딘가에 숨겨져있을 수 있습니다 ... ( Pentium FDIV 버그 기억 ?)
꽤 것을 명확하게 알 수 있도록 expm1
계산하는 데 사용되어야한다 작은을 위해 . 일반 사용하면expm1
전체 범위에서 정확할 것으로 예상되므로 유해하지 않습니다.
>>> exp(200)-1 == exp(200) == expm1(200)
True
(위의 예 은 1ULP보다 훨씬 낮으므로 세 표현식 모두 정확히 동일한 부동 소수점 숫자를 반환합니다.
유사한 논의가 역함수에 대한 보유 log
하고 log1p
보낸 에 대한 .
expm1(x)
대신 사용할 수 있습니다 exp(x)-1
. 물론 exp(x) == exp(x) - 1
일반적인 것은 아닙니다.
차이점을 확장하려면 log
과 log1p
는 대수 경우 그래프를 기억하는 데 도움이 될 수 있습니다
log
log1p
양수 값만 생성하고 큰 음수의 '위험'을 제거합니다. 이는 일반적으로 데이터 집합에 0에 가까운 숫자가 포함되어있을 때 더 균일 한 분포를 보장합니다.
log
log1p
log1p