Bất cứ ai có thể giải thích đại diện của float trong bộ nhớ?


20

Đây không phải là câu hỏi trùng lặp khi tôi đọc câu hỏi trước.

Bất cứ ai có giúp đỡ tôi trong việc tìm hiểu how float values are stored in the memory.

Tôi nghi ngờ ở đây là các giá trị float chứa ' .'( for example 3.45) làm thế nào '.'sẽ được biểu diễn trong bộ nhớ?

Bất cứ ai có thể xin vui lòng làm rõ tôi với một sơ đồ?


21
Làm thế nào về nguồn ít mong đợi nhất, Wikipedia? vi.wikipedia.org/wiki/Floating_point#I Internalal_Vpresentation
9000

4
Và bạn có thể thêm bài viết chính: Điểm nổi của IEEE
mouviciel

4
Nếu bạn giống tôi và bạn muốn tìm hiểu bằng cách chơi với mọi thứ, đưa đầu vào và nhận đầu ra, v.v., hãy kiểm tra trang web này: binaryconvert.com/convert_double.html
KChaloux

Có một loạt các định dạng dấu phẩy động, tất cả đều khác nhau. Điểm nổi của IEEE là phổ biến nhất hiện nay, nhưng nó không phải là điểm duy nhất. Khi tôi chưa tốt nghiệp, tôi đã phải học định dạng dấu phẩy động CDC 6600 và nó có một số lợi thế so với IEEE, lớn nhất là 48 bit mantissa cho độ chính xác đơn. IEEE bị giới hạn ở khoảng 24 bit mantissa cho độ chính xác đơn, đó là lý do tại sao mọi lớp phương pháp số giới thiệu ngày nay đều nói với các sinh viên "Luôn sử dụng gấp đôi, không nổi."
John R. Strohm

Xem floating-point-gui.de và nhớ rằng URL
Basile Starynkevitch

Câu trả lời:


44

Dấu thập phân không được lưu trữ rõ ràng ở bất cứ đâu; đó là một vấn đề hiển thị.

Giải thích sau đây là một sự đơn giản hóa; Tôi đang bỏ qua rất nhiều chi tiết quan trọng và các ví dụ của tôi không nhằm thể hiện bất kỳ nền tảng nào trong thế giới thực. Nó sẽ cung cấp cho bạn một hương vị về cách các giá trị dấu phẩy động được biểu thị trong bộ nhớ và các vấn đề liên quan đến chúng, nhưng bạn sẽ muốn tìm các nguồn có thẩm quyền hơn như Điều mà mọi nhà khoa học máy tính nên biết về số học dấu phẩy động .

Bắt đầu bằng cách biểu thị một giá trị dấu phẩy động trong một biến thể của ký hiệu khoa học, sử dụng cơ sở 2 thay vì cơ sở 10. Ví dụ: giá trị 3.14159 có thể được biểu diễn dưới dạng

    0,7853975 * 2 2

0,7853975 là ý nghĩa , hay còn gọi là mantissa; nó là một phần của số chứa các chữ số có nghĩa. Giá trị này được nhân với cơ sở 2 được nâng lên thành sức mạnh của 2 để có được 3,14159.

Số dấu phẩy động được mã hóa bằng cách lưu trữ ý nghĩa và số mũ (cùng với một bit dấu).

Bố cục 32 bit thông thường trông giống như sau:

 3 32222222 22211111111110000000000
 1 09876543 21098765432109876543210
+-+--------+-----------------------+
| |        |                       |
+-+--------+-----------------------+
 ^    ^                ^
 |    |                |
 |    |                +-- significand 
 |    |
 |    +------------------- exponent 
 |
 +------------------------ sign bit

Giống như các kiểu số nguyên đã ký, bit thứ tự cao biểu thị dấu; 0 chỉ giá trị dương, 1 chỉ giá trị âm.

8 bit tiếp theo được sử dụng cho số mũ. Các số mũ có thể dương hoặc âm, nhưng thay vì đặt một bit dấu khác, chúng được mã hóa sao cho 10000000 đại diện cho 0, do đó 00000000 đại diện cho -128 và 11111111 đại diện cho 127.

Các bit còn lại được sử dụng cho ý nghĩa. Mỗi bit đại diện cho một công suất âm 2 đếm từ bên trái, vì vậy:

    01101 = 0 * 2 -1 + 1 * 2 -2 + 1 * 2 -3 + 0 * 2 -4 + 1 * 2 -5 
          = 0,25 + 0,125 + 0,03125 
          = 0,40625

Một số nền tảng giả định bit dẫn "ẩn" trong ý nghĩa và luôn được đặt thành 1, vì vậy các giá trị trong phạm vi có ý nghĩa luôn nằm trong khoảng [0,5, 1). Điều này cho phép các nền tảng này lưu trữ các giá trị với độ chính xác cao hơn một chút (nhiều hơn ở bên dưới). Ví dụ của tôi không làm điều này.

Vì vậy, giá trị 3.14159 của chúng tôi sẽ được biểu diễn dưới dạng như

    0 10000010 11001001000011111100111
    ^ ^ ^
    | | |
    | | + --- có ý nghĩa = 0,7853975 ...
    | |
    | + ------------------- số mũ = 2 (130 - 128)
    |
    + ------------------------- dấu = 0 (tích cực)

    giá trị = -1 (ký hiệu) * 2 (số mũ) * (có ý nghĩa)
    giá trị = -1 0 * 2 2 * 0,7853975 ...
    giá trị = 3,14159 ...

Bây giờ, một điều bạn sẽ nhận thấy nếu bạn cộng tất cả các bit trong ý nghĩa và đó là chúng không có tổng số 0,7853975; họ thực sự đi ra đến 0,78539747. Không có đủ bit để lưu trữ giá trị chính xác ; chúng tôi chỉ có thể lưu trữ một xấp xỉ. Số lượng bit trong ý nghĩa và xác định độ chính xác hoặc có bao nhiêu chữ số có nghĩa bạn có thể lưu trữ. 23 bit cho ta khoảng 6 chữ số thập phân chính xác. Các loại dấu phẩy động 64 bit cung cấp đủ số bit trong ý nghĩa và cung cấp độ chính xác khoảng 12 đến 15 chữ số. Nhưng hãy lưu ý rằng có những giá trị không thể được biểu diễn chính xác cho dù thế nàonhiều bit bạn sử dụng. Cũng giống như các giá trị như 1/3 không thể được biểu diễn trong một số hữu hạn các chữ số thập phân, các giá trị như 1/10 không thể được biểu diễn trong một số bit hữu hạn. Vì các giá trị là gần đúng, các phép tính với chúng cũng gần đúng và tích lũy các lỗi làm tròn.

Số lượng bit trong số mũ xác định phạm vi (giá trị tối thiểu và tối đa bạn có thể đại diện). Nhưng khi bạn tiến tới các giá trị tối thiểu và tối đa của bạn, kích thước của khoảng cách giữa các giá trị đại diện sẽ tăng lên. Nghĩa là, nếu bạn không thể biểu thị chính xác các giá trị trong khoảng từ 0,785394 đến 0,785398, thì bạn không thể biểu diễn chính xác các giá trị trong khoảng từ 7,85394 đến 7,85398, hoặc các giá trị trong khoảng từ 78.5394 đến 78.5398 hoặc các giá trị trong khoảng từ 785394.0 đến 785398.0. Hãy cẩn thận khi nhân các số rất lớn (về độ lớn) với các số rất nhỏ.


"nhưng thay vì bảo lưu một bit ký hiệu khác" Những gì bạn mô tả là hành vi chính xác của một số nguyên đã ký.
Simon

6

Các .không được lưu trữ ở tất cả. Trước tiên, bạn nên hiểu ký hiệu kỹ thuật, có hệ số chính xác cố định và số mũ nguyên: 1là 1.0 · 10 0 = 1.0E0, 2 là 2.0E0, 10 là 1.0E1v.v ... Điều này cho phép ký hiệu rất ngắn với số lượng lớn. Một tỷ là 1.0E9. Yếu tố trước Ethường được ký hiệu là số chính xác cố định : 1.00000E9. Kết quả từ điều này là số một tỷ và một = 1.000.000.001 và một tỷ đều giống nhau trong ký hiệu này, khi độ chính xác không đủ lớn. Cũng lưu ý rằng các yếu tố không bao giờ cần một số không hàng đầu. Thay vào đó, số mũ có thể được giảm cho đến khi đó không còn là trường hợp nữa.

Trong bộ nhớ, một số dấu phẩy động được biểu diễn tương tự: Một bit có dấu, một số bit tạo thành yếu tố là số chính xác cố định (mật mã mantissa,), các bit còn lại tạo thành số mũ. Sự khác biệt đáng kể so với ký hiệu kỹ thuật cơ sở 10 là tất nhiên bây giờ số mũ có cơ sở 2. Kích thước chính xác của từng bộ phận phụ thuộc vào tiêu chuẩn dấu phẩy động chính xác mà bạn đang sử dụng.


3
Đây là "ký hiệu khoa học". "Ký hiệu kỹ thuật" là khi số mũ bị giới hạn ở bội số của 3.
Clement J.

7
Cơ sở 2 được sử dụng là rất quan trọng. Nó xác định giá trị có thể được lưu trữ một cách chính xác và đó không phải là, và thậm chí nếu bạn không thể bị làm phiền để phát triển một trực giác cho giá trị (Tôi biết tôi có thể không), bạn nên ít nhất hãy nhớ rằng chữ số thập phân là một hoàn toàn vô dụng cách nghĩ về phao.

1
@delnan: Nếu nó giúp, mỗi bit trong lớp phủ là một nửa so với bit cao hơn. Vì vậy, phao có thể lưu trữ tổng các lũy thừa âm của hai: 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128, v.v., đến giới hạn của lớp phủ . Vì vậy, epsilon trong 32 bit float2^-22 * exponentkhoảng 1/4194304.
greyfade
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.