또는 또는 중 어느 것이 더 빠르게 계산 됩니까? , 및 c 는 b > 1 인 양의 실수입니다 .로그 a c b √ ab
비교시 어떤 종류의 알고리즘을 사용 하시겠습니까? 그들의 복잡성은 무엇입니까?
예를 들어, 또는
이 질문은 수학 스택 교환 질문 에 대한 의견에서 영감을 얻었습니다. 스털링의 계승에 대한 근사의 목적은 무엇입니까? . 특히 mjqxxxx , Thomas Andrews 및 저에 의해 남겨진 의견 .
또는 또는 중 어느 것이 더 빠르게 계산 됩니까? , 및 c 는 b > 1 인 양의 실수입니다 .로그 a c b √ ab
비교시 어떤 종류의 알고리즘을 사용 하시겠습니까? 그들의 복잡성은 무엇입니까?
예를 들어, 또는
이 질문은 수학 스택 교환 질문 에 대한 의견에서 영감을 얻었습니다. 스털링의 계승에 대한 근사의 목적은 무엇입니까? . 특히 mjqxxxx , Thomas Andrews 및 저에 의해 남겨진 의견 .
답변:
관련된 문제에 대해서는 이 질문에 대한 나의 답변을 참조하십시오 .
일반적으로 컴퓨터는 더하기, 빼기, 곱하기, 나누기 및 비트 이동 만 할 수 있습니다. 인수의 위해를 들어, 당신이한다고 가정하자 없는 계산 B 경우 특별한 경우를 A는 2의 거듭 제곱이고 b는 경우가 조금 변화에 감소, 따라서 쉽기 때문에, 자연수이다.
경우 자연수, 당신이 계산하려는 B를 , 당신은 사용할 수 있습니다 또한 체인 지수를 . 귀하의 질문에있는 다른 모든 경우는 어렵습니다 (일반적으로).
이러한 기능을 높은 정확도로 추정하는 데 사용되는 일부 빠른 알고리즘에는 흑 마법이 필요합니다. "black magic"의 의미를 알아 보려면 Martin Ankerl의이 블로그 게시물 과 Neural Computation 에서 링크 된 관련 논문 을 살펴보십시오 . CORDIC 알고리즘 도 참조하십시오 .
해커 딜라이트 ( Hacker 's Delight) 에서도 비슷한 종류의 비트-트릭 트릭이 설명되어 있습니다 (링크는 해당 웹 사이트의 관련 웹 사이트 링크입니다).
근사치를 계산하는 다른 방법은 수치 분석을 사용합니다 ( 근사 이론 에 대한 Wikipedia 기사 참조 ). 그것을하는 한 가지 나쁜 방법은 적절한 미분 방정식을 조작하고 Euler의 방법과 같은 수치 방법을 사용하여 통합하는 것입니다 (예를 들어, 나쁜 근사치이지만 당신은 그것을 할 수 있습니다). 더 좋은 방법은 연속 근사법을 사용하는 것입니다. Taylor 계열은 너무 느리게 수렴하므로 Padé 근사 또는 다른 유형의 빠른 수렴 계열 근사와 같은 것을 사용할 수 있습니다 (다른 합리적인 근사, Chebyshev 계열 등).
위의 기능을 근사화하는 데 사용하는 알고리즘은 아키텍처, 속도 요구 사항 및 정확도 요구 사항에 따라 다릅니다.
복잡성에 관한 문제는 모든 알고리즘이 언급 한 함수의 부동 소수점 근사치 만 계산하므로 런타임은 반드시 근사치의 정확도에 달려 있다는 것입니다. 이를 고려하더라도 계산의 복잡성이 성능의 첫 번째 근사치라고 생각하지 않습니다. 입력의 크기는 비트 단위로 측정됩니다 (즉, , b 및 c 를 나타내는 데 필요한 비트 수).), 숫자 입력 자체의 크기에 의존하지 않고 정밀도에 따라 달라집니다. 실용적인 목적으로, 숫자의 숫자 표현의 정밀도는 크게 변하지 않으며 (단일 정밀도, 배정 밀도, 쿼드 정밀도) 스칼라 함수의 계산 복잡도 추정치에 따라 일반적으로 정밀도를 사용하기로 결정하지 않습니다. . 가장 관련성이 높은 측정 기준은 벽시계 시간이며, 특별한 아키텍처 (임베디드 시스템)를 사용하거나 응용 프로그램에서 실제로 빠른 지수를 요구하지 않는 한 (위의 블로그 게시물 링크 및 신경 계산 링크 참조) 선택의 언어는 아마 괜찮을 것입니다.
수치 알고리즘과 성능을 이해하는 것이 효과적인 계산 과학자가되기위한 중요한 전제 조건이기 때문에 이것은 좋은 질문입니다. 동시에, 제기 된 제약 조건이 의미있는 답변을 제공하기에 충분하지 않기 때문에 어려운 질문입니다.
세 가지 계산의 성능은 최종 결과에 필요한 정확도와 피연산자를 나타내는 데 필요한 최소 정밀도에 크게 좌우됩니다. 당신은 자격 , B , 그리고 C 양의 실수 번호와 같은, 그러나 우리는 또한 얼마나 많은 이진수 알아야 할 거라고 N 정확하게 그들을 대표해야합니다. 일반 실수에 대한 성능 고려 사항을 이해하려면 먼저 컴퓨터가 정수를 나타내는 방법과 부동 소수점 숫자를 사용하여 실수를 근사하는 방법을 이해해야합니다.
컴퓨터가 정수 에서 작동하는 경우 필요한 이진수의 수는 분명히 정수 크기의 로그 2 와 부호 처리를위한 추가 비트와 같습니다.
로그 2 | 남 | + 1
예를 들어 숫자 -8은 4 개의 이진수로 나타낼 수 있습니다. 성능 및 공간 효율성을 위해 최신 처리 장치에서 정수의 숫자 계산을 담당하는 ALU (산술 논리 장치)는 정수에서 최대 고정 크기까지의 수학을 처리하도록 설계되었습니다. 요즘 가장 일반적으로 d = 32 및 d = 64. 컴퓨터와 같은 x86 프로세서에는 ALU가있을뿐만 아니라 오늘날 전자 사회에서 보편적으로 사용되는 컴퓨터 아키텍처의 기본 구성 요소입니다. 비디오 게임 콘솔에 익숙하다면 콘솔 프로세서의 산술 논리 단위 (크기) (비트 단위)의 이름을 딴 비디오 게임 시스템 인 Nintendo 64를 기억할 수 있습니다.
산술 논리 단위의 정수 덧셈, 뺄셈 및 곱셈은 매우 효율적이며 일반적으로 계산하는 데 몇 번의 사이클 만 필요하지 않습니다. 부서는 성능이 떨어지고 최신 프로세서에서는 수십 번의주기가 필요할 수 있습니다. 성능은 처리 장치의 아키텍처 (및 산술 논리 장치의 해당 구현)와 해당 주파수에 따라 다릅니다. 64 비트 프로세서는 통상의 연산 수행 유의 에 대해 동일 속도로 비트 피연산자 의 X 1과 64 사이의 어딘가에.
일반적인 계산, 특히 과학 계산에서 정수 계산은 많은 계산에서 다루기 어렵고 숫자의 또 다른 표현 인 소위 '부동 소수점'표현이 필요합니다. 부동 소수점 숫자는 최신 마이크로 프로세서가 작동하는 방식 ( 비트 덩어리 단위로 데이터를 전달하는 방식 )과 고정 소수점 b를 사용하여 잘린 과학적 표기법으로 프로세서의 숫자를 표시하여 계산 요구 (보통 b = 2 또는 B = 10 ) 및 두 개의 정수 일부 서클의 가수 (유효 숫자)를 이용하여 숫자를 나타내는 이야 와, 지수 전자 . 주어진 숫자 x 그러면 대략 다음과 같이 표현됩니다.
나는 대략 1 과 같은 간단한 합리적조차도 분명해야하기 때문에 대략적으로 말한다. 은 표준베이스의 부동 소수점 숫자로 정확하게 표현 될 수 없습니다. 유효 숫자로 커밋 된 숫자의 수는 숫자의 정확도를 결정합니다. IEEE 754 표준유효 숫자 가수의 범위를 포함 (및 범위와 정밀도에 대응)의 몇 가지 중요한 값을 부동 소수점 숫자가 예상되는지에 대한 규칙의 개수가 동작하도록 지정,D는N, 그래서 수치 계산은 내 반복 것을 약간의 관용. 부동 소수점 숫자가 어떻게 작동하는지에 대해서는 약간의 미묘한 점이 있습니다. "모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 "을
지난 50 년 동안 산술 부동 소수점 연산을 효율적으로 계산하기위한 프로세서 기능을 개선하기 위해 많은 지적 노력이 투자되었습니다. 최신 프로세서에서 이러한 계산은 부동 소수점 숫자에 대한 산술 연산을 수행하도록 설계되고 일반적으로 IEEE 754에서 지정한 32 -비트 부동 소수점 숫자 (종종 'floats'라고 함) 및 64 비트 부동 소수점 숫자 (종종 'doubles'라고 함) 산술 논리 단위와 마찬가지로 부동 소수점 단위는 종종 몇 사이클만으로 덧셈, 뺄셈 및 곱셈을 계산할 수 있지만 나누기는 약간 더 필요합니다.
대부분의 경우 IEEE 754 64 비트 부동 소수점 'doubles'는 숫자 계산에 충분하므로 , b 및 c 는 각각 64 비트 double로 표시되고 성능에 관심이 있다고 가정합니다 . x87 부동 소수점 명령어 하위 세트를 사용하여 Intel Nehalem 아키텍처에서 스칼라 연산으로 세 가지 계산, 즉 for 루프 또는 다양한 데이터 범위에서 이러한 연산을 계산하는 데 관심이 없으며 벡터 확장을 사용하지 않으려는 경우 . 명령 대기 시간 정보는 인텔 / AMD 아키텍처에 대한 Agner Fog의 우수한 명령 참조 테이블 에서 수집됩니다 .
1 일반 지수는 종종 다음과 같은 ID로 구현됩니다.
어디 중입니다 (2) 또는 이메일 (이 경우, 내가 사용하는 β = 2 ). 결과에서 정확성을 기꺼이 포기한다고 가정하면 (x87 단위는 80 비트 정밀도로 계산을 수행하지만 a 및 b 의 특정 범위의 값으로는 불충분합니다 ) FYL2X 하드웨어 명령 으로이 계산을 수행 할 수 있습니다 계산에 t = A는 ⋅ 로그 2 (B) 을 계산하고 (일부 스케일링 도움)를 F2XM1 하드웨어 인스트럭션 2 t를 . 스케일링을 처리하기 위해 ~ 20 사이클을 가정 :
FYL2X + F2XM1 + ~ 20 = 80 + 51 + ~ 20 = ~ 151 사이클
2 기본 아이덴티티 변경으로 두 개의 로그와 나눗셈으로 변환 할 수 있으며 정확한 결과를 위해 크기를 조정할 필요가 없습니다.
2 * FYL2X + FDIV = 2 * 80 + (7-27) = 167-187 사이클
[3] 이것은 나눗셈과 지수화에 해당하므로 [1] + FDIV +175 사이클입니다.
질문을 변역 할 수 있는지 살펴 보겠습니다.
답 : 그것은 실제로 c가 a에 의존하는지 여부와 a가 b와 비교하는 방법 (보다 크거나 작거나 같음)에 달려 있습니다.
난 당신과의 관계에 대해 지정하는 경우 일부를 통해 실행 , B , 및 :
가정 1 : 가 상수 라고 가정 하고, a ( c ) = ln ( c ) / ln ( a ) 를 로그 하면 무한대에 전혀 접근하지 않습니다 (0에 접근). 이 경우, 로그 ( C를 ) 점근선 하부 행이다 B 로 A가 무한대에 근접하지만은 "타이트"점근 적 바운드 아니다. Cormen et al (Introduction to Algorithms, 3 판)에서 널리 사용되는 명명법 및 표기법을 사용하여 a b = ω ( log .
가정 2 : 라고 가정하십시오 . 그리고, 로그 ( B ) = B를 . 그리고, B는 동시에 일정 B는 A가 무한대에 접근 한없이 증가한다. 따라서, l o g a ( c ) 는 점근 적으로 하한이지만 하한은 아닙니다. 따라서 a b = ω ( log a ( c ) ) 입니다.
가정 3 : 가 대략 a b 라고 가정 합니다. 그것은 여기에 무엇을 '약'의미 수단에 분명하지만, 우리는이 의미 있다고 가정하면 B가 A는 꽉 이다 바운드 점근 ( C = Θ ( b는 ) , 다음이 가정 2와 동일한 결과를 생성합니다.
다시 , b 및 c 의 관계에 따라 다릅니다 . 여기에 열거 할 수있는 것보다 더 많은 가능성이 있지만 다음을 고려할 수 있습니다.
가정 1 : 가 상수 라고 가정 합니다. 그런 다음 c 1 / b 는 주어진 b에 대한 상수입니다 . 이 경우 c 1 / b = o ( log a ( c ) )
가정 2 : 라고 가정하십시오 . 그런 다음 a ( c ) = a 및 c 1 / b = a를 로그 합니다 . 따라서 log a ( c ) = Θ ( c 1 / b )
가정 3 : 가 대략 a b 라고 가정 합니다. 우리는이 방법을 가정하면 다시 b를 점근 꽉 행입니다 C 우리가 가정 2와 같은 결과를 얻을.
가정 1 : 가 상수 라고 가정 합니다. 그런 다음 c를 1 / (B) 동안 상수이다 B는 A가 무한대에 접근 한없이 증가한다. 따라서 c 1 / b = o ( a b )