2012-08-25 58 views
18

Tôi đã đọc rất nhiều về phao, nhưng tất cả đều liên quan không cần thiết. Tôi nghĩ Tôi đã có nó khá nhiều hiểu, nhưng chỉ có một điều tôi muốn biết chắc chắn:Loại số nào có thể biểu diễn trong dấu phẩy động nhị phân?

Tôi biết rằng, các phần phân đoạn của mẫu 1/pow(2,n), với n một số nguyên, có thể được biểu diễn chính xác trong số dấu chấm động. Điều này có nghĩa là nếu tôi thêm 1/32 vào chính nó 32 triệu lần, tôi sẽ nhận được chính xác 1,000,000.

Còn thứ gì đó như 1/(32+16) thì sao? Đó là một trong tổng của hai quyền hạn của hai, không làm việc này? Hay là 1/32+1/16 hoạt động? Đây là nơi tôi đang bối rối, vì vậy nếu bất cứ ai có thể làm rõ điều đó đối với tôi, tôi sẽ đánh giá cao nó.

Trả lời

27

Nguyên tắc có thể được tóm tắt như sau:

  • Một số có thể được đại diện chính xác trong hệ nhị phân nếu nguyên tố của mẫu chỉ chứa 2. (tức là mẫu số là một cường quốc-of-hai)

Vì vậy, 1/(32 + 16) không thể đại diện trong nhị phân vì có hệ số 3 trong mẫu số. Nhưng 1/32 + 1/16 = 3/32 là.

Điều đó nói rằng, có nhiều hạn chế hơn để thể hiện trong loại dấu phẩy động. Ví dụ: bạn chỉ có 53 bit mantissa trong IEEE double vì vậy 1/2 + 1/2^500 không thể đại diện được.

Vì vậy, bạn có thể thực hiện tổng quyền hạn của hai miễn là phạm vi của số mũ không vượt quá 53 quyền hạn.


Để khái quát này để các cơ sở khác:

  • Một số có thể được đại diện chính xác trong cơ sở 10 nếu nguyên tố của mẫu số bao gồm chỉ có 2 và 5 của.

  • Một số hợp lý X thể được biểu diễn chính xác trong cơ sở N nếu nguyên tố của mẫu số của X chỉ chứa số nguyên tố được tìm thấy trong các thừa số của N.

+3

Vì vậy, nếu tôi đã có quyền đó, tôi có thể sử dụng bất kỳ số nào 'X/Y' miễn là' Y' là một lũy thừa của 2 và 'X' là một số nhỏ hơn' 2^53'? –

+2

Vâng, đúng vậy. (chặn các trường hợp quá/tràn) – Mysticial

+0

@Mysticial: +1 cho câu trả lời, nhưng tôi nghi ngờ. 24/48 = 0,5, tuy nhiên theo quy tắc trên, nó không thể đại diện vì 3 là một trong những yếu tố chính của 48, không phải là một trong 10 yếu tố chính. Tại sao? – legends2k

4

số Floating-point được nghĩa đen đại diện sử dụng biểu mẫu:

1.m * 2^e 

đâu 1.m là một phần nhị phân và e là một số nguyên dương hoặc âm.

Như vậy, bạn có thể đại diện 1/32 + 1/16 chính xác, như: (. 1.10 là phần nhị phân tương đương với 1,5)

1.1000000 * 2^-4 

1/48, tuy nhiên, không được biểu diễn ở định dạng này.

+0

(Tôi nghĩ bạn có nghĩa là '1.m * 2^e'.) – huon

+0

Derp. Phải, tất nhiên. :) – duskwuff

+0

Không nên là '1.1000000 * 2^-4'? – mkeiser

0

Một điểm chưa được đề cập là ngữ nghĩa, một số dấu phẩy động có thể được coi là đại diện cho một loạt các giá trị.Phạm vi của các giá trị có một điểm trung tâm được xác định chính xác, và thông số IEEE thường yêu cầu kết quả của phép tính dấu phẩy động là số có phạm vi chứa điểm sẽ vận hành theo các điểm trung tâm của các số gốc, nhưng theo trình tự:

 
    double N1 = 0.1; 
    float N2 = (float)N1; 
    double N3 = N2; 

N2 là đại diện chính xác đơn lẻ chính xác rõ ràng của giá trị được biểu diễn trong N1, bất chấp yêu cầu ngớ ngẩn của ngôn ngữ để sử dụng dàn diễn viên rõ ràng. N3 sẽ đại diện cho một trong các giá trị mà N2 có thể đại diện (thông số ngôn ngữ xảy ra để chọn giá trị double có phạm vi được đặt ở giữa phạm vi của float). Lưu ý rằng trong khi N2 đại diện cho giá trị của loại của nó có phạm vi chứa giá trị chính xác, N3 thì không.

Ngẫu nhiên, việc chuyển đổi một số từ chuỗi sang phao bằng ngôn ngữ .net và .net có vẻ như chuyển đổi trung gian sang double, đôi khi có thể thay đổi giá trị. Ví dụ, mặc dù giá trị 13571357 có thể biểu diễn dưới dạng phao đơn chính xác, giá trị 13571357.499999999069f được làm tròn thành 13571358 (mặc dù nó rõ ràng là gần 13571357).

+0

1. "yêu cầu ngớ ngẩn của ngôn ngữ để sử dụng dàn diễn viên rõ ràng": Bạn đang nói về ngôn ngữ nào? C không yêu cầu một diễn viên ở đây ... – glglgl

+0

@glglgl: Mã ví dụ được trích dẫn sẽ hợp lệ trong C, Java hoặc C#; hai ngôn ngữ sau cả hai yêu cầu các diễn viên để 'float', mặc dù không để' double'. – supercat

+0

Ok, cảm ơn. Bình luận 2. không áp dụng nữa, tôi nghĩ về chuỗi -> double -> float chuyển đổi, và có vẻ như bạn đang ở đây. – glglgl

8

Một số hữu hạn có thể được đại diện trong IEEE 754 định dạng kép có độ chính xác chung khi và chỉ khi nó tương đương với M • 2 e đối với một số nguyên M và e như vậy -2 < M và -1074 ≤ e ≤ 971.

Đối với độ chính xác duy nhất, -2 < M và -149 ≤ e ≤ 104.

Đối với độ chính xác gấp đôi, đây là hậu quả của sự thật là định dạng chính xác kép sử dụng 52 bit để lưu trữ một meaningand (thường có 53 bit do một implicit 1) và sử dụng 11 bit để lưu trữ một số mũ. 11 bit mã hóa các số từ 0 đến 2047, nhưng 0 và 2047 bị loại trừ cho các mục đích đặc biệt và số được mã hóa bị thiên vị 1023, vì vậy nó đại diện cho số mũ không thiên vị từ -1022 đến 1023. Tuy nhiên, những số mũ không thiên vị này là cho các nghĩa trong khoảng [1, 2], và những người có nghĩa là có phân số. Để diễn tả các yếu tố và là một số nguyên, tôi điều chỉnh phạm vi số mũ bằng 52. Độ chính xác đơn là tương tự nhau, với 23 bit để lưu trữ một liên kết 24 bit, và 8 bit cho số mũ và độ lệch 127.

Expressing các số có thể biểu diễn bằng cách sử dụng số nguyên nhân với sức mạnh của hai chứ không phải là các khái niệm phân đoạn phổ biến hơn và đơn giản hóa một số lý thuyết số và lý do khác về các thuộc tính dấu phẩy động. Tôi đã sử dụng nó trong câu trả lời này bởi vì nó cho phép tập các giá trị đại diện được thể hiện ngắn gọn.

+0

Hãy xem đây chính là loại "tham gia quá sâu" mà tôi đã đề cập trong câu hỏi của mình ... –

+2

@Kolink: Câu trả lời chính là một câu cho biết chính xác số nào có thể và không thể biểu diễn được, chỉ sử dụng các khái niệm quen thuộc của số nguyên , nhân, quyền hạn và ít hơn (hoặc bằng). Đơn giản hơn bạn có thể nhận được bao nhiêu? Bạn có một số nguyên lần một sức mạnh của hai, và số nguyên và sức mạnh phải nằm trong giới hạn nhất định. Phần còn lại của câu trả lời chỉ là lời giải thích về việc câu đó đến từ đâu. –

+1

+1. Đã chỉnh sửa để sửa các giới hạn trên cho e. –

Các vấn đề liên quan