exp (x)보다 2 ** x가 ​​계산 속도가 더 빠릅니까?


12

내가이 질문을하는 방식과 내가 묻는 사실에 명백한 naïveté를 용서하십시오.

수학자들은 일반적으로 를 이론에서 가장 단순하고 가장 기초적인 기초 (미적분학으로 인해)로 사용합니다. 그러나 컴퓨터는 모든 것을 바이너리로 처리하는 것처럼 보이므로 컴퓨터에서 보다 계산하는 것이 더 빠릅니다 .exp2**xMath::exp(x)


7
어떤 종류의 숫자에 대해 이야기하고 있습니까? 임의의 크기의 정수? 고정 크기 부동 소수점? 임의 정밀도 부동 소수점?
Gilles 'SO- 악마 그만해'

@Gilles 좋은 지적입니다. 나는 그 차이가 중요하다는 것을 몰랐다.
isomorphismes

3
나는 Casio 포켓 계산기에서 e가 아닌 숫자의 로그와 파워가 ln / exp보다 훨씬 느리다는 것을
보았습니다.

2
무딘 위험을 감수하기 위해 둘 다 타이밍을 설정하고 어느 것이 더 빠른지 보셨습니까? 아니면 복잡성 으로 속도를 말하는가? O(f(n))
jmite

1
언어는 가장 빠른 방법을 선택해야하며 잘 작동합니다. 최대한의 속도가 필요한 경우에만 측정 한 결과 이러한 종류의 물건에 대해 걱정할 경우 성능과 관련이있는 것으로 나타났습니다
vonbrand

답변:


18

이것이 Stackoverflow가 아닌 ​​CS이기 때문에 숫자 분석 및 특히 IEEE-754 부동 소수점에 대한 질문을하고 있다고 가정합니다. 이 경우 질문에 대한 답변은 "더 간결한"의 의미와 부분적으로 시스템의 세부 사항에 따라 다릅니다.

내가 아는 최신 CPU에는 작업 (따라서 우리는 일반적인 이름을 C라고 함) 또는 2 x ( ) 중 하나를 정확히 기대하는 명령이 내장되어 있지 않습니다 . 둘 다 라이브러리 함수를 사용하여 구현됩니다.exexp2xexp2

초월 연산에 대한 모든 숫자 방법의 경우와 마찬가지로 고려해야 할 몇 가지 특별한 경우가 있습니다.

exp(NaN) = NaN
exp(+Inf) = +Inf
exp(-Inf) = 0

그러나 문제를 약간 덜 복잡하게 만드는 또 다른 것이 있습니다. 유용한 도메인은 매우 작습니다. binary32 들어, exp(x)만약 언더 플로우 정도, 및 경우 오버플 X > 88.7 정도. 일반적으로 초월 작업의 경우 비정상 이 아닌 경우와 구분할 수 없기 때문에 비정상이 아닌 경우도 무시할 수 있습니다 . 도메인이 약간 다르다는 것을 제외하고 는 위의 모든 사항에도 적용됩니다 .x<104x>88.7exp(x)1.0xexp2

ex=2x/ln21ln2exp2K

exp2(x)=2n×T[j]×P(y)

nxT2j/Kj[0,K)P2x[0,1K)2nTP

f2xm12x1x[1,1]

x87은 초월 명령을 지원하지만 초월 기능의 소프트웨어 라이브러리 구현은 많은 경우 더 빠를 수 있습니다.

편집 : IEEE 754-2008에 사용 된 새로운 용어 중 일부를 설명해야한다는 의견에서 지적되었습니다. 1985 년과 1987 년 이후 일부 언어가 바뀌었고, 대부분의 사람들은 오래된 전문 용어에 훨씬 더 익숙합니다.

"binary32"및 "binary64"라는 용어는 32 비트 및 64 비트 이진 부동 소수점 숫자의 새로운 이름이며, 이전 표준은 각각 "단일"및 "이중"입니다.

"비정규 수"라는 용어는 이전 용어 "비정규 수"또는 "비정규 화 된 수"를 대체합니다 .


"비정규"라고 말할 때 – "가우시안"을 의미하지는 않습니다. "[일부 기준의 벤치 마크]보다 걱정"입니까?
동 형사상

2
@isomorphismes 여기서 '비정규'는 플로트가 어떻게 구현되는지에 관한 것입니다. Wikipedia에서 비정상적인 숫자 를 참조하십시오 .
Paul Manta

덧붙여서, 나는 "일반적인 방법"을 조금 단순화했습니다. 여기에 제시된 방법에 대한 하나의 작은 (그리고 이해하기 쉬운) 확장을 사용하여 ulp 정확도로 exp2 () 및 exp ()를 구현할 수 있지만 이해하기 쉬운 작은 확장에 대한 설명은 아마도 대답!
가명

6

2**x2x<<1 << x


4
사실 아니다. x 아마 부동 소수점 타입
phuclv

1
x

x정수가 아닌 경우 (예 20.75:) 가수 2와 지수를 x가장 정확한 추정값으로 반올림 한 값 으로 설정합니다 (정확한 표현은 불가능 함). 어느 것도`pow '보다 훨씬 빠릅니다.
데이먼

1

2**x정수에 대한 함수 라면 Stephen의 대답에 동의합니다. 교대가 저렴합니다. 하지만 일반적으로 것을 볼 2^x**포인트 지수 부동 나타냅니다. 이 경우, 나는 사이에 유사한 성능 기대 **^모두 이후 exppow(대한 기본 동작 **)을 모두 초월 근사 작업이됩니다.


흥미롭게도, 나는 **부동 소수점 버전의 동의어로 간주되었다는 것을 몰랐다 (그리고 바보, 나는 둘이 다르다는 것을 잊었다).
isomorphismes

1

2 ^ x = e ^ (x * ln 2) 및 e ^ x = 2 ^ (x * log2 (e))이므로 큰 차이를 기대하지 않습니다.

x가 0에 가까우면 일반적으로 다항식 e ^ x = 1 + x + x ^ 2 / 2 + x ^ 3 / 6 ...을 사용합니다. 반올림 오차를 작게 유지하면서 가능한 한 빨리 자르도록 최적화되었습니다. . 분명히 2 ^ x는 계산하기에 아주 작고 조금 느립니다. "0에 가까운 x"는 일반적으로 sqrt (1/2) <= e ^ x <= sqrt (2)의 x 값입니다. x의 범위를 제한하면 다항식도가 너무 높게 선택 될 필요가 없습니다.

더 큰 x의 경우 일반적으로 x = x '+ x' '를 허용하여 2 ^ x를 계산합니다. 여기서 x'는 정수이고 -0.5 <= x ''<= 0.5입니다. 2 ^ x '는 올바른 비트 패턴으로 부동 소수점 숫자를 구성하여 계산되며 작은 x에 대해 e ^ x 방법을 사용하여 2 ^ x' '입니다. 여기서 2 ^ x는 조금 더 빠릅니다. 또한, x가 느리다면 (예 : x = 100.3), x에 log2 (e)를 곱하면 허용 할 수없는 반올림 오류가 발생하므로 (소수의 소수 비트가 적기 때문에) 더 많은주의가 필요합니다.

그리고 좋은 라이브러리 함수는 반올림 오류가 무엇이든 상관없이 x <= y, e ^ x <= e ^ y 및 2 ^ x <= 2 ^ y 일 때마다주의를 기울여야합니다. 그런 종류의 것을 달성하는 것은 까다로울 수 있습니다.


0

컴퓨터의 수학은 다른 소프트웨어에 의해 다른 방식으로 수행되므로 일관된 답변을 얻을 수 있기를 바랍니다. 대부분의 소프트웨어를 살펴보면 컴퓨터가 올바르게 작동한다고 생각합니다. 컴퓨터는 0 ^ 0과 같은 경우에도 먼 거리에서 답을 계산합니다. 문제는 특별한 경우에는 디지털 컴퓨터에서 무료로 발생하지 않는 "인식"과 관련이 있다는 것입니다. 이것은 답변을 얻는 것이 "가장 빠른"일을 가속화하는 경우에만 최적화가 발생한다는 것을 의미합니다. 그러나 그러한 경우에는 매우 잘 발생합니다. 또한 정답을 얻으려면 여러 가지 다른 인식을 수행해야 할 수도 있습니다. 이것을 속도 최적화 수준이라고하며 이것은 GNU "C"라고하는 대부분의 소프트웨어를 기준으로 최대 전문가 수준까지 발생했습니다. 소프트웨어에서 소프트웨어로, 기계에서 기계로 런타임의 미세한 차이가 품질 수용 수치로 사용되기 때문입니다. 다른 해석기에서는 일반적으로 이전 계산의 부작용으로 "제로 플래그"가 발생하는 경우에만 인식 속도가 빨라집니다. 0 * x => C0과 같은

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