Dải số nào có thể được biểu diễn trong hệ thống IEEE-754 16, 32 và 64-bit?


76

Tôi biết một chút về cách biểu diễn số dấu phẩy động, nhưng tôi e rằng vẫn chưa đủ.

Câu hỏi chung là:

Đối với một độ chính xác nhất định (đối với mục đích của tôi, số chữ số thập phân chính xác trong cơ số 10), phạm vi số nào có thể được biểu thị cho các hệ thống IEEE-754 16, 32 và 64-bit?

Cụ thể, tôi chỉ quan tâm đến phạm vi các số 16 bit và 32 bit chính xác đến +/- 0,5 (vị trí hàng đơn vị) hoặc +/- 0,0005 (vị trí phần nghìn).


5
@bendin: Vâng, nó tồn tại. en.wikipedia.org/wiki/Half_pre
precision_floating


1
@bendin thậm chí 8-bit hoặc ít float tồn tại và thường được dạy trong chương trình khoa học máy tính. Nó cũng được sử dụng trong mã hóa isntruction ARM . 10, 11, 14-bit float cũng tồn tại
phuclv 21/02/16

Câu trả lời:


104

Đối với một số dấu phẩy động IEEE-754 X đã cho , nếu

2^E <= abs(X) < 2^(E+1)

thì khoảng cách từ X đến số dấu phẩy động lớn nhất có thể biểu diễn tiếp theo ( epsilon ) là:

epsilon = 2^(E-52)    % For a 64-bit float (double precision)
epsilon = 2^(E-23)    % For a 32-bit float (single precision)
epsilon = 2^(E-10)    % For a 16-bit float (half precision)

Các phương trình trên cho phép chúng tôi tính toán như sau:

  • Để có độ chính xác một nửa ...

    Nếu bạn muốn độ chính xác là +/- 0,5 (hoặc 2 ^ -1), kích thước tối đa mà con số có thể là 2 ^ 10. Bất kỳ lớn hơn này và khoảng cách giữa các số dấu phẩy động lớn hơn 0,5.

    Nếu bạn muốn độ chính xác là +/- 0,0005 (khoảng 2 ^ -11), kích thước tối đa mà số có thể là 1. Bất kỳ lớn hơn mức này và khoảng cách giữa các số dấu phẩy động lớn hơn 0,0005.

  • Để có độ chính xác duy nhất ...

    Nếu bạn muốn độ chính xác là +/- 0,5 (hoặc 2 ^ -1), kích thước tối đa mà con số có thể là 2 ^ 23. Bất kỳ lớn hơn giá trị này và khoảng cách giữa các số dấu phẩy động lớn hơn 0,5.

    Nếu bạn muốn độ chính xác là +/- 0,0005 (khoảng 2 ^ -11), kích thước tối đa mà con số có thể là 2 ^ 13. Bất kỳ lớn hơn giá trị này và khoảng cách giữa các số dấu phẩy động lớn hơn 0,0005.

  • Để có độ chính xác gấp đôi ...

    Nếu bạn muốn độ chính xác là +/- 0,5 (hoặc 2 ^ -1), kích thước tối đa mà con số có thể là 2 ^ 52. Bất kỳ lớn hơn giá trị này và khoảng cách giữa các số dấu phẩy động lớn hơn 0,5.

    Nếu bạn muốn độ chính xác là +/- 0,0005 (khoảng 2 ^ -11), kích thước tối đa mà con số có thể là 2 ^ 42. Bất kỳ lớn hơn giá trị này và khoảng cách giữa các số dấu phẩy động lớn hơn 0,0005.


3
Về mét, điều này có nghĩa là, ở độ chính xác tương ứng 1m và 1mm, độ chính xác nửa cho phép 1km và 1m, độ chính xác đơn cho phép 8Mm và 8km, và độ chính xác kép cho phép 4Pm và 4Tm.
Aaron Franke

22

Đối với số nguyên dấu phẩy động (tôi sẽ đưa ra câu trả lời của tôi về độ chính xác kép IEEE), mọi số nguyên từ 1 đến 2 ^ 53 đều có thể biểu diễn chính xác. Ngoài 2 ^ 53, các số nguyên có thể biểu diễn chính xác được cách nhau bằng cách tăng dần lũy thừa của hai. Ví dụ:

  • Mọi số nguyên thứ 2 từ 2 ^ 53 + 2 đến 2 ^ 54 đều có thể được biểu diễn chính xác.
  • Mọi số nguyên thứ 4 từ 2 ^ 54 + 4 đến 2 ^ 55 đều có thể được biểu diễn chính xác.
  • Mọi số nguyên thứ 8 giữa 2 ^ 55 + 8 và 2 ^ 56 đều có thể được biểu diễn chính xác.
  • Mọi số nguyên thứ 16 từ 2 ^ 56 + 16 đến 2 ^ 57 đều có thể được biểu diễn chính xác.
  • Mọi số nguyên thứ 32 trong khoảng từ 2 ^ 57 + 32 đến 2 ^ 58 đều có thể được biểu diễn chính xác.
  • Mọi số nguyên thứ 64 từ 2 ^ 58 + 64 đến 2 ^ 59 đều có thể được biểu diễn chính xác.
  • Mọi số nguyên thứ 128 giữa 2 ^ 59 + 128 và 2 ^ 60 có thể được biểu diễn chính xác.
  • Mọi số nguyên thứ 256 từ 2 ^ 60 + 256 đến 2 ^ 61 đều có thể được biểu diễn chính xác.
  • Mọi số nguyên thứ 512 trong khoảng từ 2 ^ 61 + 512 đến 2 ^ 62 đều có thể được biểu diễn chính xác. . . .

Các số nguyên không thể biểu diễn chính xác được làm tròn thành số nguyên có thể biểu diễn gần nhất, do đó, trường hợp xấu nhất là làm tròn 1/2 khoảng cách giữa các số nguyên có thể biểu diễn.


19

Liên kết của Peter R với tham chiếu MSDN được trích dẫn chính xác có lẽ là một nguyên tắc chung, nhưng tất nhiên thực tế phức tạp hơn.

Thực tế là "điểm" trong "dấu chấm động" là một nhị phân điểm chứ không phải dấu thập phân có cách đánh bại trực giác của chúng ta. Ví dụ cổ điển là 0,1, cần độ chính xác chỉ một chữ số trong hệ thập phân nhưng không thể biểu diễn chính xác trong hệ nhị phân.

Nếu bạn có một ngày cuối tuần để giết người, hãy xem Điều mà mọi nhà khoa học máy tính nên biết về số học dấu chấm động . Có thể bạn sẽ đặc biệt quan tâm đến các phần về Chuyển đổi chính xácnhị phân sang thập phân .


5

Trước hết, cả IEEE-754-2008 và -1985 đều không có phao 16-bit; nhưng nó là một phép cộng được đề xuất với số mũ 5 bit và phân số 10 bit. IEE-754 sử dụng một bit dấu chuyên dụng, vì vậy phạm vi tích cực và tiêu cực là như nhau. Ngoài ra, phân số có 1 ngụ ý ở phía trước, vì vậy bạn sẽ có thêm một bit.

Nếu bạn muốn chính xác đến từng vị trí, vì bạn có thể biểu diễn từng số nguyên, câu trả lời khá đơn giản: Số mũ dịch chuyển dấu thập phân sang cuối bên phải của phân số. Vì vậy, phân số 10 bit sẽ cho bạn ± 2 11 .

Nếu bạn muốn một bit sau dấu thập phân, bạn bỏ một bit trước nó, vì vậy bạn có ± 2 10 .

Độ chính xác đơn có phân số 23 bit, vì vậy bạn có ± 2 24 số nguyên.

Bạn cần bao nhiêu bit độ chính xác sau dấu thập phân phụ thuộc hoàn toàn vào các phép tính bạn đang thực hiện và số lượng bạn đang thực hiện.

  • 2 10 = 1,024
  • 2 11 = 2,048
  • 2 23 = 8,388,608
  • 2 24 = 16,777,216
  • 2 53 = 9,007,199,254,740,992 (độ chính xác kép)
  • 2 113 = 10,384,593,717,069,655,257,060,992,658,440,192 (độ chính xác 4 lần)

Xem thêm


2

Xem IEEE 754-1985 :

v = (-1) ^ dấu * s ^ (lũy thừa-lũy thừa) * (1 + phân số)

Lưu ý (1 + phân số). Như @bendin đã chỉ ra, sử dụng dấu phẩy động nhị phân, bạn không thể biểu thị các giá trị thập phân đơn giản như 0,1. Hàm ý là bạn có thể mắc lỗi làm tròn bằng cách thực hiện các phép cộng đơn giản nhiều lần hoặc gọi những thứ như cắt ngắn. Nếu bạn quan tâm đến bất kỳ loại độ chính xác nào, cách duy nhất để đạt được nó là sử dụng số thập phân có dấu chấm cố định, về cơ bản là số nguyên được chia tỷ lệ.


0

Nếu tôi hiểu câu hỏi của bạn một cách chính xác, nó phụ thuộc vào ngôn ngữ của bạn.
Đối với C #, hãy xem bản tham chiếu MSDN . Float có độ chính xác 7 chữ số và độ chính xác gấp đôi 15-16 chữ số.


7
Trên thực tế, IEEE-754 xác định độ chính xác, vì vậy nó không phải là ngôn ngữ cụ thể.
derobert

0

Tôi mất khá nhiều thời gian để nhận ra rằng khi sử dụng double trong Java, tôi không bị mất độ chính xác đáng kể trong các phép tính. dấu chấm động thực sự có một khả năng rất tốt để biểu diễn số với độ chính xác khá hợp lý. Tôi đã đánh mất độ chính xác ngay lập tức khi chuyển đổi các số thập phân do người dùng nhập sang biểu diễn dấu phẩy động nhị phân được hỗ trợ nguyên bản. Gần đây tôi đã bắt đầu chuyển đổi tất cả các số của mình sang BigDecimal. BigDecimal có nhiều công việc phải giải quyết trong mã hơn là float hoặc gấp đôi, vì nó không phải là một trong những kiểu nguyên thủy. Nhưng mặt khác, tôi sẽ có thể đại diện chính xác các số mà người dùng nhập vào.

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.