내가이 질문을하는 방식과 내가 묻는 사실에 명백한 naïveté를 용서하십시오.
수학자들은 일반적으로 를 이론에서 가장 단순하고 가장 기초적인 기초 (미적분학으로 인해)로 사용합니다. 그러나 컴퓨터는 모든 것을 바이너리로 처리하는 것처럼 보이므로 컴퓨터에서 보다 계산하는 것이 더 빠릅니다 .2**x
Math::exp(x)
내가이 질문을하는 방식과 내가 묻는 사실에 명백한 naïveté를 용서하십시오.
수학자들은 일반적으로 를 이론에서 가장 단순하고 가장 기초적인 기초 (미적분학으로 인해)로 사용합니다. 그러나 컴퓨터는 모든 것을 바이너리로 처리하는 것처럼 보이므로 컴퓨터에서 보다 계산하는 것이 더 빠릅니다 .2**x
Math::exp(x)
답변:
이것이 Stackoverflow가 아닌 CS이기 때문에 숫자 분석 및 특히 IEEE-754 부동 소수점에 대한 질문을하고 있다고 가정합니다. 이 경우 질문에 대한 답변은 "더 간결한"의 의미와 부분적으로 시스템의 세부 사항에 따라 다릅니다.
내가 아는 최신 CPU에는 작업 (따라서 우리는 일반적인 이름을 C라고 함) 또는 2 x ( ) 중 하나를 정확히 기대하는 명령이 내장되어 있지 않습니다 . 둘 다 라이브러리 함수를 사용하여 구현됩니다.exp
exp2
초월 연산에 대한 모든 숫자 방법의 경우와 마찬가지로 고려해야 할 몇 가지 특별한 경우가 있습니다.
exp(NaN) = NaN
exp(+Inf) = +Inf
exp(-Inf) = 0
그러나 문제를 약간 덜 복잡하게 만드는 또 다른 것이 있습니다. 유용한 도메인은 매우 작습니다. binary32 들어, exp(x)
만약 언더 플로우 정도, 및 경우 오버플 X > 88.7 정도. 일반적으로 초월 작업의 경우 비정상 이 아닌 경우와 구분할 수 없기 때문에 비정상이 아닌 경우도 무시할 수 있습니다 . 도메인이 약간 다르다는 것을 제외하고 는 위의 모든 사항에도 적용됩니다 .exp(x)
1.0
x
exp2
exp2
x87은 초월 명령을 지원하지만 초월 기능의 소프트웨어 라이브러리 구현은 많은 경우 더 빠를 수 있습니다.
편집 : IEEE 754-2008에 사용 된 새로운 용어 중 일부를 설명해야한다는 의견에서 지적되었습니다. 1985 년과 1987 년 이후 일부 언어가 바뀌었고, 대부분의 사람들은 오래된 전문 용어에 훨씬 더 익숙합니다.
"binary32"및 "binary64"라는 용어는 32 비트 및 64 비트 이진 부동 소수점 숫자의 새로운 이름이며, 이전 표준은 각각 "단일"및 "이중"입니다.
"비정규 수"라는 용어는 이전 용어 "비정규 수"또는 "비정규 화 된 수"를 대체합니다 .
2**x
정수에 대한 함수 라면 Stephen의 대답에 동의합니다. 교대가 저렴합니다. 하지만 일반적으로 것을 볼 2^x
과 **
포인트 지수 부동 나타냅니다. 이 경우, 나는 사이에 유사한 성능 기대 **
와 ^
모두 이후 exp
및 pow
(대한 기본 동작 **
)을 모두 초월 근사 작업이됩니다.
**
부동 소수점 버전의 동의어로 간주되었다는 것을 몰랐다 (그리고 바보, 나는 둘이 다르다는 것을 잊었다).
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과 같은 경우에도 먼 거리에서 답을 계산합니다. 문제는 특별한 경우에는 디지털 컴퓨터에서 무료로 발생하지 않는 "인식"과 관련이 있다는 것입니다. 이것은 답변을 얻는 것이 "가장 빠른"일을 가속화하는 경우에만 최적화가 발생한다는 것을 의미합니다. 그러나 그러한 경우에는 매우 잘 발생합니다. 또한 정답을 얻으려면 여러 가지 다른 인식을 수행해야 할 수도 있습니다. 이것을 속도 최적화 수준이라고하며 이것은 GNU "C"라고하는 대부분의 소프트웨어를 기준으로 최대 전문가 수준까지 발생했습니다. 소프트웨어에서 소프트웨어로, 기계에서 기계로 런타임의 미세한 차이가 품질 수용 수치로 사용되기 때문입니다. 다른 해석기에서는 일반적으로 이전 계산의 부작용으로 "제로 플래그"가 발생하는 경우에만 인식 속도가 빨라집니다. 0 * x => C0과 같은