Làm thế nào để phân chia xảy ra trong máy tính của chúng tôi?


17

Làm thế nào để phân chia xảy ra bên trong máy tính kỹ thuật số? Thuật toán cho nó là gì?

Tôi đã tìm kiếm rất nhiều trong google nhưng không có kết quả khả quan. Vui lòng cung cấp một thuật toán / sơ đồ rất rõ ràng cho thuật toán phân chia với một minh họa mẫu.


1
Bộ phận @ chương trình-o-steve trong ALU là một hoạt động phức tạp. Bạn sẽ không nhận được một sơ đồ "đơn giản".
Majenko

5
@ Leon Heller ơi! Nó không nói như vậy Đây là một câu hỏi phần cứng thuần túy
chương trình-o-steve

2
@ Leon Heller Tôi đoán không phải ...., bao gồm điện tử, điện toán vật lý ...
chương trình-o-steve

2
Bộ phận trong vi điều khiển là không thẳng. Có những cách nhanh và cách làm chậm. Những cách chậm thì dễ hiểu hơn nhưng những cách nhanh được sử dụng trong các CPU hiện đại, bạn muốn biết cụ thể về điều gì? Bạn chỉ muốn hiểu biết cơ bản về các nguyên tắc hoặc phân tích chi tiết về CPU hiện đại?
Konsalik

4
@LeonHeller Tôi thường đồng ý với các câu hỏi bạn muốn đóng, nhưng thiết kế CPU rất giống một câu hỏi về kỹ thuật điện. Câu hỏi này có thể sử dụng một số trợ giúp để làm cho nó rõ ràng hơn nhiều về những gì đang muốn (như những gì konsalik đang hỏi về) nhưng điều đó không làm cho nó lạc đề.
Kellenjb

Câu trả lời:


17

Các thuật toán phân chia trong thiết kế kỹ thuật số có thể được chia thành hai loại chính. Phân chia chậm và phân chia nhanh.

Tôi đề nghị bạn đọc về cách cộng và trừ nhị phân hoạt động nếu bạn chưa quen với các khái niệm này.

Bộ phận chậm

Các phương thức chậm đơn giản nhất đều hoạt động theo cách sau: Trừ mẫu số từ tử số. Làm điều này đệ quy với kết quả của mỗi phép trừ cho đến khi phần còn lại nhỏ hơn mẫu số. Số lần lặp là thương số nguyên và số tiền còn lại là phần còn lại.

Thí dụ:

7/3:

  1. 73=4
  2. 43=1
  3. 1<3

Do đó, câu trả lời là 2 với phần còn lại là 1. Để làm cho câu trả lời này phù hợp hơn một chút, đây là một số nền tảng. Phép trừ nhị phân thông qua phép cộng âm được thực hiện, ví dụ: 7 - 3 = 7 + (-3). Điều này được thực hiện bằng cách sử dụng bổ sung hai của nó. Mỗi số nhị phân được thêm vào bằng cách sử dụng một loạt các bộ cộng đầy đủ:

nhập mô tả hình ảnh ở đây

Trường hợp mỗi bộ cộng đầy đủ 1 bit được triển khai như sau:

nhập mô tả hình ảnh ở đây

Bộ phận nhanh

Trong khi phương pháp phân chia chậm là dễ hiểu, nó đòi hỏi lặp đi lặp lại. Có tồn tại các thuật toán "nhanh" khác nhau, nhưng tất cả chúng đều dựa trên ước tính.

Hãy xem xét phương pháp Goldschmidt:

Q=ND

Phương pháp này hoạt động như sau:

  1. Nhân N và D với một phần F theo cách mà D tiếp cận 1.
  2. Khi D tiếp cận 1, N tiếp cận Q

Phương pháp này sử dụng phép nhân nhị phân thông qua phép cộng lặp, cũng được sử dụng trong các CPU AMD hiện đại.


1
Một số sơ đồ cho các biến thể của phương pháp 'chậm' (được triển khai trong lắp ráp trên micros mà không cần phân chia phần cứng, nhưng vẫn hữu ích) được đưa ra trong phụ lục AVR200 của Atmel .
Kevin Vermeer

bạn có thể vui lòng cho một minh họa về phương pháp phân chia Goldschmidt. Ngoài ra biểu đồ dòng chảy được đưa ra ở đây là một ví dụ về phân chia chậm?
chương trình-o-steve

phương pháp đó là gì trong đó chúng ta phải liên tục chuyển cổ tức sang trái?
chương trình-o-steve

@ chương trình-o-steve Đây là một minh họa nhanh: tìm 22/7 (xấp xỉ pi). Đầu tiên, nhân số trên và dưới với 0,1 để có được: 2.2 / 0.7 Nhân lại lần nữa, sử dụng 1.3, cho: 2.86 / 0.91 Sử dụng 1.09 cho: 3.1174 / 0.9919 1.008 cho: 3.1423393 / 0.9998352 Tiếp tục, bạn sẽ sớm đạt được FINAL ANSWER 3.1428571 / 1.000000 ...
Alan Campbell

Làm thế nào để bạn "nhân với một phân số"? Phân số không thể biểu diễn trong dấu phẩy động. Một phân số theo định nghĩa là tử số chia cho mẫu số, do đó bạn bị bỏ lại trong một đối số tròn về việc vẫn phải chia. Và làm thế nào để ước tính phần đó ở nơi đầu tiên?
CogitoErgoCogitoSum

4

Phần cứng để phân chia điểm nổi là một phần của đơn vị logic cũng thực hiện phép nhân; có một mô-đun phần cứng số nhân có sẵn. Các số dấu phẩy động, giả sử A và B, được chia (tạo thành A / B) cho

  1. phân tách các số dấu phẩy động thành các số mũ dấu (+1 hoặc -1), mantissa ("a" và "b" và (kiểu số nguyên nhị phân)
  2. dấu hiệu của kết quả là (+1) nếu cả hai dấu hiệu đều giống nhau, khác (-1)
  3. số mũ được trừ (số mũ của B được trừ từ số mũ của A) để tạo thành số mũ của kết quả
  4. mantissas (chữ số nhị phân của các số) là số nhị phân điểm cố định trong khoảng từ 1/2 đến 1; điều đó có nghĩa là chữ số đầu tiên sau điểm nhị phân là '1', tiếp theo là số 0 và số ... là bước đầu tiên, bảng tra cứu tìm thấy chính xác đối ứng với sáu bit (chỉ có 32 khả năng, đó là một bảng nhỏ)

  5. ab=areciprocal(b)breciprocal(b)

  6. d==1+ϵ
    d(2d)=(1+ϵ)×(1ϵ)=1ϵ2
  7. Tử số, bây giờ mẫu số chính xác là '1', là giá trị của kết quả và có thể được kết hợp với dấu và số mũ được tính toán trước đó.
  8. Điểm nổi của IEEE cho phép một số trường hợp ngoại lệ (số không chuẩn hóa, NAN; chúng phải được xử lý bằng các hoạt động logic khác.

Điều thú vị là lỗi phân chia Pentium cũ (rất đáng chú ý vào năm 1994) là do lỗi in gây ra các giá trị bảng đối ứng bị lỗi cho bước (4). Một bài báo ban đầu, "Phương pháp phân chia sử dụng bộ đa song song", Domenico Ferrari, IEEE Trans. Điện tử. Tính toán. EC-16 / 224-228 (1967), mô tả phương pháp này, cũng như "Hệ thống IBM / Mô hình 360: Đơn vị thực thi dấu phẩy động" IBM J. Res. Nhà phát triển 11 : 34-53 (1967).


1

Có các phương pháp phân chia rất khác nhau, tùy thuộc vào các số được xử lý. Đối với các số nguyên, phương pháp thay đổi và trừ do người khác đưa ra sẽ hoạt động tốt. Tuy nhiên, đối với các số dấu phẩy động, có thể nhanh hơn trước tiên tính toán đối ứng của mẫu số và sau đó nhân số đó với tử số của bạn.

Tính toán đối ứng của mẫu số không quá tệ; nó được thực hiện bằng cách tinh chỉnh các xấp xỉ liên tiếp. Đặt g là dự đoán của bạn cho 1 / d. Để đoán được cải thiện, hãy sử dụng g '= g (2-gd). Điều này hội tụ theo phương trình bậc hai, do đó bạn nhân đôi số chữ số chính xác cho mỗi cải tiến.

Ví dụ: tính toán đối ứng của 3,5.

Dự đoán ban đầu của bạn là 0,3. Bạn tính 0,3 * 3,5 = 1,15. Dự đoán điều chỉnh của bạn là 0,3 * (2 - 1,15) = 0,285. Đã khá gần rồi! Lặp lại quy trình và bạn nhận được 0.2857125 và lần thử thứ ba nhận được 0.2857142857.

Có một số phím tắt. Trong dấu phẩy động, bạn có thể trích xuất lũy thừa mười hoặc lũy thừa hai, tùy thuộc vào số cơ sở của máy. Và, đối với tốc độ sử dụng bộ nhớ lớn hơn, bạn có thể sử dụng bảng được tính toán trước cho các số trong phạm vi từ 1 đến b (trong đó b là cơ sở số của bạn) để đoán ngay lập tức gần với đối ứng được yêu cầu và lưu một hoặc hai bước tinh chế.

Hãy nhớ rằng, như với phép nhân và sự bối rối năm 1960 của Kolmogorov bởi học sinh Anatoly Karatsuba, bạn không bao giờ biết khi nào sẽ tìm ra phương pháp nhanh hơn hoặc tốt hơn. Không bao giờ đầu hàng sự tò mò của bạn.


-1

Máy tính không thực hiện phép cộng lặp lại cho số nhân - nó sẽ rất chậm. Thay vào đó, có một số thuật toán nhân nhanh. Kiểm tra: http://en.wikipedia.org/wiki/Karatsuba_alacticm


Chào mừng đến với EE.SE. Câu trả lời chỉ liên kết được khuyến khích. Hãy tóm tắt thông tin trong liên kết.
Null

Họ làm. Hàng tấn CPU vẫn không có hệ số nhân chu kỳ đơn và sử dụng phần mềm biến đổi.
dùng3528438
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.