2010-05-11 33 views

Trả lời

10

Nó đưa ra câu trả lời "sai" đơn giản vì không phải tất cả các giá trị thực đều được thể hiện bằng phao (hoặc gấp đôi, cho vấn đề đó). Những gì bạn sẽ nhận được là một xấp xỉ dựa trên mã hóa cơ bản.

Để đại diện cho tất cả các giá trị thực sự, thậm chí giữa 1.0x10 -100 và 1.1x10 -100 (mức giới hạn thực sự rất nhỏ), bạn vẫn cần một số lượng vô hạn các bit.

Giá trị IEEE754 chính xác duy nhất chỉ có 32 bit (một số trong đó được giao nhiệm vụ cho những thứ khác như số mũ và đại diện NaN/Inf) và do đó không thể cung cấp cho bạn độ chính xác vô hạn. Họ thực sự có 23 bit có sẵn cho độ chính xác của khoảng 2 (có thêm một bit ngầm) hoặc chỉ hơn 7 chữ số thập phân (log (2) là khoảng 7,2).

Tôi kèm theo từ "sai" trong dấu ngoặc kép vì nó không phải là thực sự là sai. Có gì sai là sự hiểu biết của bạn về cách máy tính đại diện cho con số (không được xúc phạm mặc dù, bạn không đơn độc trong sự hiểu lầm này).

Đi qua trên http://www.h-schmidt.net/FloatApplet/IEEE754.html và nhập số của bạn vào hộp "Biểu diễn thập phân" để xem điều này hoạt động.

Nếu bạn muốn có con số chính xác hơn, hãy dùng gấp đôi thay vì nổi - số này có gấp đôi số bit có sẵn để biểu diễn giá trị (giả sử triển khai C của bạn đang sử dụng loại dữ liệu chính xác đơn và đôi IEEE754 cho float và double tương ứng).

Nếu bạn muốn có độ chính xác tùy ý, bạn sẽ cần sử dụng thư viện "bignum" như GMP mặc dù hơi chậm so với các loại gốc để đảm bảo bạn hiểu được sự cân bằng.

2

Số thập phân 12345.054321 không thể được biểu diễn chính xác dưới dạng float trên nền tảng của bạn. Kết quả mà bạn đang thấy là số xấp xỉ thập phân với số gần nhất có thể được biểu diễn dưới dạng float.

+0

Tôi biết điều này đã xảy ra trong trường hợp C#. Nhưng không bao giờ biết trong trường hợp của C. – anonymous

+0

'float 'của C cũng là loại chính xác cố định nên không có sự khác biệt với C#. –

0

Giá trị dấu phẩy động có độ chính xác đơn chỉ có thể biểu diễn khoảng tám đến chín chữ số (thập phân) quan trọng. Ngoài điểm đó, bạn sẽ thấy lỗi lượng tử hóa.

0

Đó là tất cả để làm với độ chính xác. Số của bạn không thể được lưu trữ chính xác trong một phao.

+0

Đúng và sai - số OP không thể được lưu trữ chính xác, nhưng nổi có thể lưu trữ chính xác số chính xác cao, chúng chỉ phải được thể hiện chính xác trong nhị phân (ví dụ: 1/65536). –

+2

@Matt, đó không thực sự là tuyên bố của zaf, người đã tuyên bố: _Số của bạn_ không thể ... – paxdiablo

+0

Phải, được thăng hạng. Tôi chỉ nói rõ rằng độ chính xác không phải là vấn đề với phao nổi. –

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