컴퓨터에서 부서가 어떻게 발생합니까? 못했습니다. 샘플 그림이있는 나눗셈 알고리즘에 대해

디지털 컴퓨터에서 부서가 어떻게 발생합니까? 그것에 대한 알고리즘은 무엇입니까?

Google에서 열심히 검색했지만 만족스러운 결과를 얻지 못했습니다. 샘플 그림이있는 나눗셈 알고리즘에 대해 매우 명확한 알고리즘 / 흐름도 를 제공하십시오 .



답변

디지털 디자인의 나눗셈 알고리즘은 두 가지 주요 범주로 나눌 수 있습니다. 느린 분할과 빠른 분할.

이 개념에 익숙하지 않은 경우 이진 덧셈과 뺄셈이 어떻게 작동하는지 읽어보십시오.

느린 사단

가장 간단한 느린 방법은 모두 다음과 같은 방식으로 작동합니다. 분자에서 분모를 뺍니다. 나머지가 분모보다 작을 때까지 각 뺄셈의 결과로이 작업을 재귀 적으로 수행하십시오. 반복의 양은 정수 몫이며 남은 양이 나머지입니다.

예:

7/3 :

  1. 7−3=4

  2. 4−3=1

  3. 1<3

따라서 답변은 2이고 나머지는 1입니다.이 답변을 좀 더 관련성있게 만들려면 여기에 몇 가지 배경이 있습니다. 음의 첨가를 통한 이진 감산이 수행된다 : 예 : 7-3 = 7 + (-3). 이것은 2의 보수를 사용하여 수행됩니다. 각 이진수는 일련의 전체 가산기를 사용하여 추가됩니다.

각 1 비트 전체 가산기는 다음과 같이 구현됩니다.

패스트 디비전

느린 나누기 방법은 이해하기 쉽지만 반복적 인 반복이 필요합니다. 다양한 "빠른"알고리즘이 있지만 모두 추정에 의존합니다.

Goldschmidt 방법을 고려하십시오.

Q=ND

이 방법은 다음과 같이 작동합니다.

  1. D에 1에 접근하는 방식으로 N과 D에 분수 F를 곱합니다.
  2. D가 1에 가까워 질수록 N은 Q에 가까워진다

이 방법은 반복 추가를 통해 이진 곱셈을 사용하며, 이는 현대 AMD CPU에서도 사용됩니다.


답변

부동 소수점 분할을위한 하드웨어는 곱셈을 수행하는 논리 장치의 일부입니다. 사용 가능한 승수 하드웨어 모듈이 있습니다. A 및 B와 같은 부동 소수점 숫자는 다음과 같이 나뉩니다 (A / B 형성).

  1. 부동 소수점 숫자를 부호 (+1 또는 -1), 가수 ( "a"및 "b"및 (이진 정수 유형) 지수로 분해)
  2. 결과의 부호는 (+1)이고 두 부호가 같으면 그렇지 않으면 (-1)
  3. 결과의 지수를 형성하기 위해 지수를 빼고 (A의 지수에서 B를 빼는 지수)
  4. 가수 (숫자의 이진수)는 1/2과 1 사이의 고정 소수점 이진수입니다. 즉, 이진 포인트 뒤의 첫 번째 숫자는 '1'이고 그 뒤에 0과 1이옵니다. 첫 번째 단계로, 룩업 테이블은 6 비트까지 정확한 역수를 찾습니다 (32 개의 가능성 만 있고 작은 테이블 임)

  5. ㅏ비=ㅏ※아르 자형이자형씨나는피아르 자형영형씨ㅏ엘(비)비※아르 자형이자형씨나는피아르 자형영형씨ㅏ엘(비)

  6. 디==1+ϵ


    디※(2−디)=(1+ϵ)×(1−ϵ)=1−ϵ2


    이는 분모에서 5 비트의 정확한 '1'이 곱셈 쌍을 한 번 더 한 후에 10 비트의 정확성을, 2 개의 후 20 비트를 정확한 값을, 3을 마친 후 40 비트를 정확하게 함을 의미합니다. 결과 정밀도에 필요한만큼 분자와 분모에 곱하기 (2-분모)를 반복하십시오.
  7. 분모가 정확히 '1'인 분자는 결과의 가수이며 이전에 계산 된 부호 및 지수와 결합 될 수 있습니다.
  8. IEEE 부동 소수점은 일부 예외 (비정규 화 된 숫자, NAN)를 허용합니다. 예외는 다른 논리 연산에 의해 처리되어야합니다.

흥미롭게도, 오래된 펜티엄 분할 버그 (1994 년에 매우 주목할만한)는 단계 (4)에 대해 잘못된 상호 테이블 값을 만드는 인쇄 오류로 인해 발생했습니다. 초기 논문, "병렬 뮬러를 이용한 분할 방법", Domenico Ferrari, IEEE Trans. 전자. 계산. EC-16 / 224-228 (1967)은 "IBM System / 360 모델 91 : 부동 소수점 실행 장치"와 마찬가지로 방법을 설명합니다. IBM J. Res. 개발자 11 : 34-53 (1967).


답변

처리 할 숫자에 따라 나누는 방법이 매우 다릅니다. 정수의 경우 다른 사람들이 제공 한 시프트 및 빼기 방법이 잘 작동합니다. 그러나 부동 소수점 숫자의 경우 먼저 분모의 역수를 계산 한 다음 분자 수에 곱하는 것이 더 빠를 수 있습니다.

분모의 역수 계산은 그리 나쁘지 않습니다. 연속적인 근사값을 수정하여 수행됩니다. g를 1 / d에 대한 추측으로 삼으십시오. 추측을 향상 시키려면 g '= g (2-gd)를 사용하십시오. 이것은 2 차적으로 수렴되므로 각 개선에서 정밀도의 두 배가됩니다.

예 : 3.5의 역수를 계산합니다.

초기 추측은 0.3입니다. 0.3 * 3.5 = 1.15를 계산합니다. 조정 된 추측 값은 0.3 * (2-1.15) = 0.285입니다. 이미 꽤 가깝습니다! 과정을 반복하면 0.2857125가되고 세 번째 시도는 0.2857142857이됩니다.

몇 가지 단축키가 있습니다. 부동 소수점에서는 기계의 수에 따라 10의 거듭 제곱 또는 2의 거듭 제곱을 추출 할 수 있습니다. 또한 메모리 사용을 늘리는 속도를 높이기 위해 1에서 b 사이의 숫자에 대해 사전 계산 된 표를 사용하여 (여기서 b는 숫자 기준 임) 필요한 역수에 가까운 추측을 얻을 수 있습니다. 하나 또는 두 개의 세분화 단계를 저장하십시오.

그의 학생 Anatoly Karatsuba의 곱셈과 Kolmogorov의 1960 년의 당혹감과 마찬가지로, 더 빠르고 더 나은 방법이 언제 발견 될지는 결코 알 수 없다는 점을 명심하십시오. 호기심을 버리지 마십시오.


답변

컴퓨터는 숫자를 곱하는 것에 반복적으로 더하기를하지 않습니다. 정말 느릴 것입니다. 대신 빠른 곱셈 알고리즘이 있습니다. 체크 아웃 :
http://en.wikipedia.org/wiki/Karatsuba_algorithm