두 값을 비교해서 더 큰 값을 결정해야 하는 C++ 어플리케이션 프로그램이 있습니다. 유일한 합병증은 한 숫자가 로그 공간에 표시되고 다른 숫자는 표시되지 않는 것입니다. 예를 들어 :num_1과 num_2를 비교하기 위해서는 log() 또는 exp()를 사용해야 하는데, 하나가 다른 것보다 계산하기 쉬운지 알고 싶습니다(즉 일반적으로 더 짧은 시간에 실행). 자신이 표준 cmath 라이브러리를 사용하고 있다고 가정할 수 있습니다.다음은 의미가 같은데, 어느 쪽이 빠를까요?또는 파이썬의 몇 가지 빠른 테스트(수학에 c 사용): 그가 약간 느리다는 것을 나타냅니다.편집: C함수가 컴파일러에 의해 최적화되기 때문에 루프가 시간을 차지하는 것 같습니다.흥미롭게도, C에서는 같은 속도인것 같습니다 (Mark가 주석으로 언급한 이유일 수 있습니다).
정말 알아야 하나요? 이게 실행시간의 대부분을 차지할까요? 어떻게 알아요?더 나쁜 것은 플랫폼에 따라 다를 수 있습니다. 그리고 뭐야? 물론 관심이 있다면 테스트 해보세요. 그런데 미세 최적화에 대해 고민하는데 많은 시간을 쏟는 것은 일반적으로 좋지 않은 생각이에요.
libm 플랫폼 및 예비 프로세서에 따라 다를 수 있습니다. exp/log를 여러 번 호출 코드를 작성하여 눈에 띄는 차이가 있는지 확인하기 위해서는 타임을 사용하여 여러 번 호출하는 것이 좋습니다.둘 다 기본적으로 내 컴퓨터(Windows)에서 같은 시간이 걸리기 때문에 모든 값이 정의되어 있으므로 익스프를 사용합니다(ERANGE를 확인한다고 가정). 하지만 log를 사용하는 것이 자연스럽다면 정당한 이유 없이 최적화를 시도하는 대신 이를 사용해야 합니다.
편집 : exp()오버플로우를 방지하도록 코드를 수정하였습니다. 이로 인해 두 기능 사이의 여백이 상당히 감소하였습니다. 고마워 프레데릭암호: (사용 컴파일: ) 결과는 다소 결정적인 것 같습니다.놀랍게도, 로그가 더 빠른 것 같아요.순수한 추측: 아마도 기본적인 수학적 테일러 시리즈는 로그나 뭔가를 더 빨리 수집합니까? 실제로 자연로그가 지수함수보다 계산하기 쉬워 보입니다.하지만 c라이브러리가 이렇게 작동하는지 확신할 수 없습니다. 하지만 완전 가능성이 없어보여요.
AFAIK 알고리즘, 복잡성은 동일하며 차이는 (무시할 수 있는) 정수여야 합니다.이 때문에 exp(a) > b 를 사용합니다. 단순히 잘못된 입력에서 끊기지 않기 때문이죠.
이것이 핫스팟이라고 확신하는 경우 — 컴파일러 내장은 당신의 친구입니다. 플랫폼에 따라 다르지만(이러한 장소에서 성능을 추구하면 플랫폼에 구애되지 않는 경우가 있다), 그 때문에. 문제는 실제 대상 아키텍처에 대한 asm명령과 대기시간+주기입니다. 이게 없으면 순수한 추측이에요.
값 < < 1 로 작업하고 있으므로 , x < 1 에 대해 x-1 > log(x), 이는 x-1 < log(y) 가 log(x) < log(y) 를 의미함을 의미하며, 이는 이미 log (y) 의 경우 37% ~ 1 을 사용하지 않고 exp
로그가 더 빠르다는 건 말이 되겠죠 Exp는 해답에 도달하기 위해 여러 곱셈을 해야 하는데 로그는 가수와 지수를 소수 2에서 소수 e로 변환하기만 하면 됩니다.로그를 사용할 경우 경계 확인 (다른 많은 사람들이 말했듯이)을 확인하세요.