[Phần 1] Máy tính cộng trừ nhân chia số thập phân như thế nào?

thuongnn
6 min readNov 22, 2019

--

Thật tình cờ trong kỳ học vừa rồi mình có học qua môn SWD391 và được giao đề tài mô phỏng về cách máy tính cộng trừ nhân chia. Mới đầu tìm hiểu thì thấy hơi khó vì tài liệu trên mạng thì tràn lan không rõ ràng cho lắm, sau gần một tuần tìm hiểu và được thầy giáo hỗ trợ cuối cùng mình cũng được thông não^^. Tìm hiểu xong mình thấy khá là thú vị nhưng thấy tài liệu trên mạng toàn tiếng anh với không được rõ ràng lắm nên mình viết bài này để tổng hợp và chia sẻ lại về phần này.

Hầu như mọi người đều biết cộng trừ số thập phần vì nó đã được học từ hồi lớp 5 rồi nhưng máy tính nó sẽ tính toán bằng cách khác nhé. Ở phần này mình sẽ viết về cách máy tính xử lý phép tính cộng và trừ số thập phân.

Mọi người có thể clone chương trình mô phỏng thuật toán về chạy để hiểu rõ hơn nhé. Link repo: https://github.com/thuongnn/Algorithm-Simulation

Cấu trúc số thập phân trong máy tính

Ở loạt bài này mình sẽ trình bày về các phép tính máy tính trên định dạng Single-Precision (32-bits). Khi tính toán, máy tính sẽ chuyển đổi các số thập phân sang dạng số binary rồi mới thực hiện tính toán, mọi người tự tìm hiểu về cách chuyển đổi nhé hoặc có thể dùng công cụ này để chuyển đổi.

Định dạng số thập phân khi chuyển đổi sang số binary
Biên giá trị nhỏ nhất và lớn nhất của Single-Precision

Cấu trúc gồm 3 phần: sign, exponentfraction (hay còn gọi là mantissa). Sign là phần dấu (+ hoặc -), exponent là phần lũy thừa, mantissa là phần thập phân (quá trình cộng trừ chủ yếu làm việc với phần này).

Trong phần mantissa ngoài dãy 23 bits như định dạng, ta có thêm 2 mục ẩn E, A1. Định dạng phần mantissa luôn có mục ẩn A1 có giá trị bằng 1. Còn mục ẩn E chính là phần bit thừa (khi cộng 2 mantissa với nhau), E đứng trước A1 và sẽ bị triệt tiêu rồi đẩy lên phần exponent nếu E = 1.
Ví dụ ở hình trên phần mantissa có giá trị là 0.15625 (chuyển đổi binary sang số thập phân), thêm mục ẩn A1 thì giá trị đúng phải là 1.15625

E và A1 là 2 mục ẩn quan trọng trong phần mantissa khi tính toán.

Về cơ bản thì khi chuyển sang binary thì số thập phân sẽ có cấu trúc như kia, sau khi chuyển sang binary máy tính sẽ tiến hành tính toán rồi lại chuyển ngược lại về số thập phân. Chuyển ngược lại về số thập phân khá là dễ, mọi người tự tìm hiểu trên google nhé :3

Quy trình cộng trừ số thập phân

Thuật toán cộng trừ số thập phân trong máy tính chia làm 4 bước, mình sẽ giải thích từng bước một kèm theo sơ đồ logic mỗi bước:
Bước 1. Kiểm tra số 0
Bước 2. Cân bằng phần exponent
Bước 3. Cộng bit phần mantissa
Bước 4. Chuẩn hóa kết quả

Bước 1. Kiểm tra số 0

Bước 1. Kiểm tra số 0

Bước đầu tiên máy tính sẽ kiểm tra 2 số có bằng 0 hay không trước khi tiến hành cộng trừ. BR là số trừ (hoặc là số cộng), AC là số được cộng (hoặc số bị trừ).
Bước này rất dễ hiểu, ta chú ý ở trường hợp nếu AC = 0 và phép tính là trừ thì sẽ phải đổi dấu kết quả (As <– ‘As). Nếu BRAC đều khác 0 thì ta sẽ đi tới bước tiếp theo.

Bước 2. Cân bằng exponent

Bước 2. Cân bằng exponent

1. A, B là ký hiệu của phần mantissa và a, b là ký hiệu phần exponent.
2. Tính phần
exponent trong Single-Precision (32-bits):
K = 127 (2^(n-1) — 1) với n là số bit exponent (8 bits)

Giống như với việc phải đặt thẳng hàng dấu phẩy khi cộng trừ 2 số thập phân với nhau trong toán lớp 5, thì ở bước này ta phải cân bằng phần exponent bằng cách cộng thêm vào phần exponent kết hợp dịch bit phần mantissa.

Ta sẽ so sánh phần exponent của 2 số, số có exponent nhỏ hơn sẽ phải cân bằng exponent với số còn lại. Mỗi lần tăng exponent của số nhỏ hơn 1 đơn vị ta đồng thời dịch phần mantissa của số nhỏ hơn sang phải 1 bit (bao gồm cả bit ẩn A1). Quá trình này lặp lại đến khi nào 2 phần exponent của 2 số bằng nhau.

Bước 3. Cộng bit phần mantissa

Bước 3. Cộng bit phần mantissa

As là dấu của số được cộng (hoặc bị trừ), Bs là dấu của số cộng (hoặc trừ).
EA là kết quả cộng của 2 phần mantissa.

Mình sẽ giải thích tại sao với phép toán cộng và trừ lại có 2 trường hợp như kia. Đầu tiên mọi người xem qua bảng mà mình tổng hợp bên dưới:

Ở cột Add Magnitude bản chất 2 số A, B giá trị sẽ được cộng với nhau, chỉ là dấu của phép tính có thể bị thay đổi mà thôi. Tương tự thì cột Subtract Magnitude bản chất 2 số A,B giá trị sẽ bị trừ đi và dấu của phép tính có thể bị thay đổi. Tương tự vậy, 2 trường hợp (trong logic bước 3) chính là 2 trường hợp mình đã nói ở bảng trên (Add Magnitude Subtract Magnitude).

Sau khi sử dụng phép xor với dấu của 2 số (As, Bs) ta bắt đầu tiến hành cộng bit phần mantissa. EA <– A + B’ + 1 nó thể hiện cho trường hợp Subtract Magnitude ở bảng trên, kết quả EA trong trường hợp này sử dụng bù 2 (two’s complement). Bù 2 sẽ đảo ngược bit B (0 thành 11 thành 0) sau đó cộng thêm 1.

Bước 4. Chuẩn hóa kết quả

Bước 4. Chuẩn hóa kết quả

Đối với chuẩn hóa cho trường hợp EA <– A + B sẽ đơn giản hơn, nếu bit thừa E = 1 ta sẽ thực hiện dịch bit phải phần mantissa như cách cân bằng exponent ở bước 2 rồi trả về kết quả.

Trường hợp còn lại nếu bit thừa E = 0 (số bị trừ nhỏ hơn số trừ) mọi người phải bù 2 (two’s complement) phần mantissa đồng thời nghịch đảo dấu của kết quả. Ngược lại nếu E = 1 ta bắt đầu kiểm tra phần mantissa A, nếu A = 0 ta sẽ trả về kết quả (đây là trường hợp 2 số trừ nhau bằng 0).

Sau trường hợp E = 0 hoặc A # 0 ta sẽ kiểm tra A1 (bit ẩn mà mình đã nói trong phần cấu trúc). Trường hợp này ta sẽ dịch trái phần mantissa đồng thời giảm 1 đơn vị phần exponent của kết quả, quá trình này lặp lại cho đến khi A1 = 1 thì trả về kết quả của phép tính.

Đây là toàn bộ quy trình tính toán cộng trừ số thập phân trong máy tính, khá là phức tạp :3 Mình viết chưa được rõ ràng mọi người có thể clone chương trình mô phỏng thuật toán này trên github của mình để hiểu rõ hơn nhé. Phần tiếp theo mình sẽ viết về phép nhân, hi vọng mọi người góp ý và ủng hộ ❤

Chương trình mô phỏng thuật toán mà mình đã làm trong môn học SWD391

--

--

thuongnn
thuongnn

Written by thuongnn

An engineer who is young, talented, creative, passionate in working, and always puts effort into self-improving knowledge and skills in the IT field.

No responses yet