컴퓨터에서 부서가 어떻게 발생합니까?


17

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

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


1
ALU의 @ program-o-steve Division은 복잡한 작업입니다. "간단한"플로우 차트가 없습니다.
Majenko

5
@ 레온 헬러 오! 그것은 그렇게 말하지 않습니다 이것은 순수한 하드웨어 질문입니다
program-o-steve

2
레온 헬러 @ 내가 그렇지 않은 것 같아요 ..., 전자, 물리적 컴퓨팅 ... 포함하는
프로그램 - 오 - 스티브

2
마이크로 컨트롤러 부문은 간단하지 않습니다. 빠른 방법과 느린 방법이 있습니다. 느린 방법은 이해하기 쉽지만 빠른 방법은 최신 CPU에서 사용됩니다. 구체적으로 알고 싶은 것은 무엇입니까? 원칙에 대한 기본적인 이해 나 최신 CPU에 대한 자세한 분석을 원하십니까?
Konsalik

4
@LeonHeller 저는 보통 닫고 싶은 질문에 동의하지만 CPU 디자인은 전기 공학 질문입니다. 이 질문은 konsalik이 요구하는 것과 같이 원하는 것을 훨씬 명확하게하기 위해 약간의 도움을 줄 수 있지만 그것이 주제를 벗어난 것은 아닙니다.
Kellenjb

답변:


17

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

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

느린 사단

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

예:

7/3 :

  1. 73=4
  2. 43=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에서도 사용됩니다.


1
'느린'방법의 변형에 대한 일부 흐름도 (하드웨어 분할없이 마이크로 조립에 구현되었지만 여전히 유용함 )는 Atmel의 AVR200 애플리케이션 노트에 나와 있습니다.
케빈 베르메르

Goldschmidt의 나눗셈 방법을 설명해 주 시겠습니까 ? 또한 여기주어진 흐름도 는 느린 분할?
program-o-steve

배당금을 왼쪽으로 반복해서 이동시키는 방법은 무엇입니까?
program-o-steve 5

@ program-o-steve 다음은 간단한 설명입니다. 22/7 (pi 근사값)을 찾으십시오. 먼저, 상단과 하단에 0.1을 곱하면 2.2 / 0.7 1.3을 사용하여 다시 곱하고 다음을 제공합니다. 1.000000 ...
Alan Campbell

"분수로 곱하기"는 어떻게됩니까? 부동 소수점에서는 분수를 표현할 수 없습니다. 정의에 따른 분수는 분자를 분모로 나눈 값이므로 여전히 나눠야하는 순환 인수로 남아 있습니다. 그리고 어떻게 그 분수를 처음에 추정합니까?
CogitoErgoCogitoSum

4

부동 소수점 분할을위한 하드웨어는 곱셈을 수행하는 논리 장치의 일부입니다. 사용 가능한 승수 하드웨어 모듈이 있습니다. 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).


1

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

분모의 역수 계산은 그리 나쁘지 않습니다. 연속적인 근사값을 수정하여 수행됩니다. 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 년의 당혹감과 마찬가지로, 더 빠르고 더 나은 방법이 언제 발견 될지는 결코 알 수 없다는 점을 명심하십시오. 호기심을 버리지 마십시오.


-1

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


EE.SE에 오신 것을 환영합니다. 링크 전용 답변은 권장하지 않습니다. 링크에 정보를 요약하십시오.
Null

그들이하다. 수많은 CPU는 여전히 단일 사이클 승수를 가지고 있지 않으며 소프트웨어 다중화를 사용합니다.
user3528438
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.