2009-11-02 37 views
5

Vì vậy, chúng ta biết rằng các phân số như 0,1, không thể được biểu diễn chính xác trong cơ sở nhị phân, gây ra các vấn đề chính xác (như đã đề cập ở đây: Formatting doubles for output in C#). Và chúng ta biết chúng ta có kiểu thập phân cho biểu diễn số thập phân của số ... nhưng vấn đề là, rất nhiều phương thức Math, không hỗ trợ kiểu thập phân, vì vậy chúng ta chuyển đổi chúng thành gấp đôi, làm hỏng số lần nữa.Làm thế nào đối phó với thực tế là hầu hết các phân số thập phân không thể được biểu diễn chính xác trong nhị phân?

vậy chúng ta nên làm gì?

+0

Lưu ý rằng ** phân số chỉ không chính xác khi sử dụng định dạng dấu chấm động, cố định **. Không có gì ngăn cản bạn đại diện cho một phần tùy ý chính xác như tỷ lệ thực sự của hai con số, khác với thực tế là bạn phải làm tất cả toán học bằng tay. –

+1

loại hoạt động bạn tham chiếu là gì, không có sẵn cho số thập phân? Bạn có thể vui lòng xây dựng? –

Trả lời

7

Đối với một cuộc kiểm tra toàn diện trong những thách thức liên quan đến việc thực hiện các phép tính dấu chấm động, xem bài viết này:

gì Mỗi nhà khoa học máy tính nên biết về Floating-Point Arithmetic http://docs.sun.com/source/806-3568/ncg_goldberg.html

+3

Bạn có chắc chắn rằng đủ cụ thể không? –

+0

Cảm ơn bạn đã liên kết. –

1

bạn có thể chuyển các dấu thập phân để các con số là toàn bộ, sau đó làm số học số nguyên 64 bit, sau đó chuyển nó trở lại. Sau đó, bạn sẽ chỉ phải lo lắng về vấn đề tràn.

3

vậy chúng ta nên làm gì?

Chúng tôi chỉ tiếp tục thở. Nó thực sự không phải là một vấn đề về cấu trúc. Chúng tôi có độ chính xác giới hạn nhưng thường là quá đủ. Bạn chỉ cần nhớ định dạng/tròn khi trình bày các con số.

Vấn đề trong đoạn mã sau là với WriteLine(), không phải trong tính toán (s):

double x = 6.9 - 10 * 0.69; 
Console.WriteLine("x = {0}", x); 

Nếu bạn có một vấn đề cụ thể, bài đó thứ. Thường có nhiều cách để tránh mất chính xác. Nếu bạn thực sự cần> = 30 chữ số thập phân, bạn cần một thư viện đặc biệt.

4

Ồ, chúng ta nên làm gì về thực tế là hầu hết các phân số thập phân không thể được biểu diễn trong nhị phân? hoặc cho rằng vấn đề, phân số nhị phân không thể được đại diện trong thập phân?

hoặc, thậm chí, vô cùng (trên thực tế, không thể đếm được vô số) số thực trong tất cả các căn cứ không thể được biểu diễn chính xác trong bất kỳ hệ thống máy tính nào ??

không có gì! Để thu hồi một cliche cũ, bạn có thể nhận được đủ gần cho công việc của chính phủ ... Trong thực tế, bạn có thể nhận được đủ gần cho bất kỳ công việc ... Không có giới hạn mức độ chính xác máy tính có thể tạo ra, nó chỉ có thể không được vô hạn (đó là những gì sẽ được yêu cầu cho một chương trình đại diện số để có thể đại diện cho mỗi thể số thực)

bạn thấy đấy, cho mỗi đề án trình bày số bạn có thể thiết kế, trong bất kỳ máy tính, nó có thể chỉ đại diện cho số hữu hạn số thực khác biệt khác nhau với độ chính xác 100.00%. Và giữa mỗi cặp liền kề của những con số này (những con số có thể được biểu diễn với độ chính xác 100%), sẽ luôn có vô cùng các số khác mà nó không thể đại diện chính xác 100%.

+0

Có vô số đếm được không? –

+2

Có, số lượng số hữu tỉ (số thập phân, hoặc về mặt kỹ thuật, những con số có thể được biểu diễn dưới dạng tỷ số của hai số nguyên), có thể đếm được ... Bằng chứng là liệt kê tất cả các số nguyên làm tiêu đề hàng và cột trong bảng và mỗi ô chứa phần nhỏ là giá trị cột chia cho giá trị hàng. Bạn "Đếm" sau đó bằng đường chéo (từ trái sang phải phía trên bên phải) bắt đầu bằng ô trên cùng bên trái (1/1), sau đó đường chéo thứ hai là 1/2, 2/1, sau đó là đường chéo thứ ba là 1/3, 2/2, 3/1, vv .. thủ tục này có hiệu quả "đếm" các lý trí ... –

+0

Cantor đã đưa ra điều này (trong những năm 1800 tôi nghĩ) ông gọi đây là cấp độ đầu tiên của vô cực aleph-null hoặc aleph zero. Số lượng các số thực (lý trí và số vô tỉ như sqrt (2), là aleph = Một, và không đếm được. Ông đã chứng minh rằng có vô số cấp độ vô hạn, mặc dù vượt quá khả năng của tôi để giải thích trong một chú thích! –

3

Hãy nhớ rằng độ chính xác bạn cần và quy tắc làm tròn được yêu cầu sẽ phụ thuộc vào miền sự cố của bạn.

Nếu bạn viết phần mềm để điều khiển lò phản ứng hạt nhân, hoặc để mô hình phần thứ nhất của một giây sau vũ trụ sau khi vụ nổ lớn (bạn tôi thực sự làm điều đó), bạn sẽ cần độ chính xác cao hơn nhiều. thuế bán hàng (một cái gì đó tôi làm cho một cuộc sống). Ví dụ:

Trong thế giới tài chính, sẽ có các yêu cầu cụ thể về độ chính xác hoặc ngầm hoặc rõ ràng. Một số khu vực pháp lý về thuế của Hoa Kỳ chỉ định thuế suất cho 5 chữ số sau chữ số thập phân. Lược đồ làm tròn của bạn cần cho phép độ chính xác đó nhiều. Khi phần lớn Tây Âu chuyển đổi sang Euro, có một cách tiếp cận rất cụ thể để làm tròn được viết thành luật. Trong giai đoạn chuyển tiếp đó, nó là cần thiết để làm tròn chính xác theo yêu cầu.

Biết quy tắc của miền của bạn và kiểm tra rằng lược đồ làm tròn của bạn đáp ứng các quy tắc đó.

2

Tôi nghĩ mọi người ngụ ý: Đảo ngược ma trận thưa thớt? "Có một ứng dụng cho rằng", v.v.

Tính toán bằng số là một con ngựa nổi. Nếu bạn có một vấn đề, nó có thể được đưa vào đồng cỏ trước năm 1970 hoặc thậm chí sớm hơn nhiều, mang theo thư viện chuyển tiếp bằng thư viện hoặc đoạn trích bằng đoạn trích trong tương lai.

1

Và chúng tôi biết chúng tôi có các loại thập phân cho phần trình bày thập phân của số ... nhưng vấn đề là, rất nhiều các phương pháp toán học, không hỗ trợ loại thập phân, vì vậy chúng tôi có chuyển đổi chúng để tăng gấp đôi, làm hỏng số một lần nữa.

Một số hỗ trợ Math methodslàmdecimal: Abs, Ceiling, Floor, Max, Min, Round, Sign, và Truncate. Những gì các chức năng này có điểm chung là chúng trả về kết quả chính xác. Điều này phù hợp với mục đích của decimal: Để thực hiện chính xác số học với số cơ sở-10.

Các chức năng trig và Exp/Log/Pow trả về các câu trả lời gần đúng, vậy điều gì sẽ là điểm quá tải cho loại số học "chính xác"?

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