Tại sao biểu diễn dấu phẩy động sử dụng bit dấu thay vì phần bù 2 để biểu thị số âm


20

Xem xét một biểu diễn điểm cố định có thể được coi là trường hợp suy biến của số trôi nổi. Hoàn toàn có thể sử dụng phần bù 2 cho số âm. Nhưng tại sao một bit dấu cần thiết cho số dấu phẩy động, các bit mantissa không nên sử dụng phần bổ sung của 2?

Ngoài ra, tại sao các bit số mũ sử dụng sai lệch thay vì biểu diễn cường độ đã ký (tương tự như các bit mantissa) hoặc biểu diễn bổ sung của 2?

Cập nhật: Xin lỗi nếu tôi không làm rõ. Tôi đã tìm kiếm lý do làm thế nào đại diện điểm nổi được hình thành. Nếu không có sự đánh đổi thực hiện mạnh mẽ giữa các phương án, thì ai đó có thể giải thích các khía cạnh lịch sử của biểu diễn dấu phẩy động không?

Câu trả lời:


7

Phần bù của hai có ý nghĩa khi hai thực thể trong câu hỏi có cùng "đơn vị" và cùng "chiều rộng". Theo chiều rộng, ý tôi là, nếu bạn thêm số bit N và số bit M, trong đó N và M khác nhau, tốt nhất bạn không nên sử dụng hai phần bù. Đối với các số dấu phẩy động, chúng ta có vấn đề về các đơn vị: nếu số mũ khác nhau, thì chúng ta đang thay đổi tinh thần một trong những con bọ ngựa, và bây giờ chúng ta đang gặp vấn đề tương tự như trước đây (với chiều rộng).

Đối với các bit số mũ, bằng cách sử dụng độ lệch thay vì dấu + độ lớn, chúng ta sẽ có thêm một giá trị (nếu không, chúng ta sẽ có +0 và -0). Ở đây, hai phần bù có ý nghĩa khi nhân hoặc chia số (kể từ đó chúng ta cộng hoặc trừ các số mũ), nhưng không có ý nghĩa nhiều khi cộng hoặc trừ.

Chỉnh sửa: Một nhà bình luận nhận xét rằng bạn có thể thêm hai số nguyên bổ sung có độ dài khác nhau bằng cách sử dụng phần mở rộng dấu hiệu. Cũng có một số vấn đề với việc phát hiện tràn, nhưng điều đó cũng có thể khắc phục được. Tóm lại, có lẽ bạn có thể sử dụng hai phần bù, nếu bạn đủ cẩn thận. (Bạn cũng cần xử lý phép nhân và chia.)


4
Nếu bạn thêm một số bit N và một số bit M, trong đó N và M khác nhau, thì tốt hơn hết bạn không nên sử dụng hai phần bổ trợ - Bạn có thể nói rõ hơn một chút không? Tôi tin rằng hoàn toàn có thể ký mở rộng một số bằng cách sử dụng biểu diễn bổ sung của 2 bằng MSB của nó, ví dụ 4'b1111 sẽ mở rộng đến 5'b1111 và 4'b0111 -> 5'b00111. Không nên đơn giản để thêm điều này vào bộ dịch chuyển thùng hiện có trong logic số học dấu phẩy động?
koo

Cảm ơn về câu trả lời của bạn! Tôi đã chỉnh sửa câu hỏi để nó hỏi rõ hơn về những gì tạo ra điểm nổi hiện tại.
koo

4

Từ Wikipedia:

Hệ thống bổ sung của hai có ưu điểm là các phép toán số học cơ bản của phép cộng, phép trừ và phép nhân giống hệt với các phép toán cho số nhị phân không dấu ...

Bổ sung của hai là một đại diện của các số âm mà rất thuận tiện. Đó là toàn bộ lý do để sử dụng nó.

Một cặp số mũ là một đại diện của một số dấu phẩy động. Hầu hết thời gian khi sử dụng số dấu phẩy động, bạn không thực hiện số học chỉ trên số liệu hoặc chỉ dựa trên số mũ.


4

Nhưng tại sao một bit dấu cần thiết cho số dấu phẩy động

Giả định sai. Nó không cần thiết. Tôi khá chắc chắn rằng tôi đã gặp các định dạng dấu phẩy động sử dụng phép bổ trợ 2 cho lớp phủ, nhưng tôi phải tìm ra tên.

Tôi không phải là một chuyên gia về phân tích số, nhưng tôi nhận ra rằng việc ký số 0 rất quan trọng đối với họ. Nó có thể dễ dàng thao tác hơn bổ sung của những người. Đó có lẽ là một tiêu chí trong sự lựa chọn cho IEEE-754.

Ngoài ra, tại sao các bit số mũ sử dụng sai lệch thay vì biểu diễn cường độ đã ký

Một lần nữa, đó là điều không cần thiết và một số đã làm điều khác đi.

Đó là cách biểu diễn để thực hiện phần cứng dễ dàng hơn cho tập hợp các thao tác được thực hiện theo số mũ (và ở đây có một đại diện cho -0 không muốn).

Một trong những hậu quả của lựa chọn đó là bạn có thể sử dụng so sánh số nguyên đã ký để so sánh số FP nếu bạn không quan tâm đến NaN, đây có lẽ là một tiêu chí cho một số người (thực tế hơn NaN cần xử lý đặc biệt khiến tôi nghi ngờ đó không phải là cho IEEE-754).


Các so sánh số nguyên đã ký sẽ xếp hạng các số FP âm ngược. Để họ xếp hạng chính xác, một số loại định dạng bổ sung sẽ là cần thiết, với phần bổ sung có thể là tốt nhất (tiêu cực sẽ là ... 110.111 ..., với vô hạn ở bên trái bên phải).
8/2/2015

3
MIL-STD-1750A có lẽ là kiến ​​trúc bộ xử lý được sử dụng rộng rãi nhất chỉ định biểu diễn dấu phẩy động bổ sung của hai. Trong phần 4.1: "Tập lệnh sẽ hỗ trợ độ chính xác đơn điểm cố định 16 bit, độ chính xác kép điểm cố định 32 bit, điểm nổi 32 bit và dữ liệu chính xác mở rộng điểm nổi 48 bit trong biểu diễn bổ sung của 2 " . .
njuffa

2

IEEE 754 sử dụng dấu hiệu / cường độ, không phải bổ sung hai hoặc bổ sung của một người.

Bổ sung của hai có nhược điểm là phạm vi tích cực và tiêu cực không giống nhau. Nếu tất cả các mẫu bit là hợp lệ, thì bạn có số x nơi bạn không thể dễ dàng tính -x. Thật tồi tệ. Thay thế là có các mẫu bit không hợp lệ, cũng xấu. Trong IEEE 754 không có mẫu bit không hợp lệ cho điểm nổi 64 hoặc 32 bit, vì vậy bạn không cần phải lo lắng về điều đó.

Phần bù của một người sẽ làm cho phép nhân / chia trở nên phức tạp hơn (với cường độ đã ký, bạn chỉ cần xor các dấu hiệu và coi lớp phủ là một số không dấu). Để cộng và trừ, tôi thực sự không muốn nghĩ về phép cộng và phép trừ trong phần bù của một người, điều đó làm cho đầu tôi đau.


Đoạn đầu tiên của câu trả lời này cho thấy rằng không có nhược điểm nào đối với dấu hiệu / cường độ. Dấu hiệu / cường độ có +/- 0 và số học phức tạp hơn phần bù của hai.
Praxeolitic

Có +/- zero là cả vấn đề và tính năng. Ví dụ: chia một số nhỏ x cho 10 ^ 100 sẽ cho +0 hoặc -0, giữ nguyên dấu của x.
gnasher729

1

Có các số không được ký giúp tăng tính biểu cảm có thể hữu ích trong các tính toán số. Trang wikipedia ' Đã ký số 0 ' cho biết:

Người ta khẳng định rằng việc bao gồm số 0 có chữ ký trong IEEE 754 giúp dễ dàng đạt được độ chính xác bằng số trong một số vấn đề quan trọng , đặc biệt là khi tính toán với các chức năng cơ bản phức tạp .

Một trong những nhà thiết kế chính của điểm nổi IEEE 754, WH Kahan là người đề xuất ký số 0 vì những lý do này. Ý kiến ​​của anh ta có thể sẽ mang nhiều trọng lượng.


1

Tôi nghĩ điều quan trọng là phải hiểu rằng các phép tính dấu phẩy động tạo ra các giá trị gần đúng , không phải giá trị chính xác . Nghĩa là, nếu phép tính dấu phẩy động mang lại giá trị được mã hóa X, thì giá trị này đại diện cho giá trị lý thuyết gần như chắc chắn KHÔNG phải X, nhưng nằm trong phạm vi [X .. X + e) ​​{trong đó 'e' là ' máy epsilon ', tức là không có số dấu phẩy động giữa X và X + e}. Cụ thể hơn, số 0 dấu phẩy động đại diện cho một số lý tưởng có thể không chính xác bằng 0, nhưng quá nhỏ để biểu thị với giá trị được mã hóa dấu phẩy động khác không.

Do đó, sử dụng biểu diễn ký hiệu và cường độ là một cách cho phép mã hóa 'nhớ' chính xác phía nào của giá trị lý tưởng được bật, dương hoặc âm. Điều này rất quan trọng trong một số tính toán phức tạp (theo nghĩa 'a + bi') - các hàm phức tạp-> phức tạp thường là 'đa giá trị', vì vậy, để tính toán chính xác, điều quan trọng là phải chú ý đến các vị trí của 'cắt nhánh'. Các số 0 đã ký sau đó theo một nghĩa nào đó đánh dấu các vị trí của các lần cắt nhánh này - phép tính được thực hiện ở mặt tích cực sẽ khác với ở phía âm.


1
Tính toán dấu phẩy động tạo ra các giá trị chính xác . Chúng chỉ hơi khác với các giá trị mà các số thực toán học tạo ra. Một số dấu phẩy động đại diện cho một số, không phải là một phạm vi.
gnasher729

0

Hầu hết các định dạng dấu phẩy động đều lợi dụng thực tế là, trong một hệ thống nhị phân, mọi giá trị khác không với số mũ không tối thiểu sẽ có "1" là bit đáng kể nhất của lớp phủ. Do đó, trong một hệ thống có trường 23 bit cho lớp phủ, lớp phủ của các số dương không nằm trong khoảng từ 0 đến 8,388.607 mà thay vào đó là từ 8,388,608 đến 16,777,215. Các giá trị của các số có thể có hoặc không có phạm vi dương từ -16,777,215 đến -8,388,608 và từ +8,388,608 đến +16,777,215. Mặc dù phần bù hai là định dạng số tốt nhất khi cần có các phép tính "trơn tru" bằng 0, nhưng phạm vi giá trị mantissa không liên tục có nghĩa là các phép tính sẽ không thể hoạt động trơn tru trên 0 cho dù chúng sử dụng phép bù hai hay cách khác .

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.