2012-10-10 48 views
9

Mô tả cho loại float trong C đề cập đến số chữ số có nghĩa là 6. Tuy nhiên,Số chữ số có nghĩa cho loại dấu phẩy động

float f = 12345.6; 

và sau đó in nó sử dụng printf() không in 12345.6, nó in 12345.599609. Vì vậy, những gì hiện "6 chữ số có nghĩa" (hoặc "15 trong trường hợp của một double") có nghĩa là cho một loại điểm nổi?

+8

Lưu ý rằng các loại dấu phẩy động không được lưu trữ trong cơ sở 10, vì vậy số chữ số * thập phân * quan trọng nhất thiết phải là xấp xỉ. –

+2

Trên thực tế có 8 bit cho điểm kinh nghiệm và 23 bit cho frac. – halfelf

Trả lời

10

Theo số standard, không phải tất cả số thập phân có thể được lưu trữ chính xác trong bộ nhớ. Tùy thuộc vào kích thước của biểu diễn, lỗi có thể đạt tới mức tối đa nhất định. Đối với float, đây là 0.0001% (6 chữ số có nghĩa = 10^-6 = 10^-4 %).

Trong trường hợp của bạn, lỗi là (12345.6 - 12345.599609)/12345.6 = 3.16e-08 thấp hơn nhiều so với lỗi tối đa cho phao.

16

6 chữ số có nghĩa là lỗi tối đa xấp xỉ +/- 0,0001%. Giá trị phao đơn thực sự có khoảng 7,2 chữ số chính xác (source). Điều này có nghĩa là lỗi là khoảng +/- 12345.6/10^7 = 0.0. Đó là thứ tự lỗi của bạn (0,000391).

0

Vấn đề ở đây là bạn không thể đảm bảo một số có thể được lưu trữ trong một phao. Bạn cần phải đại diện cho số này với số thập phân, cơ sở và số mũ như là IEEE 754 giải thích. Số printf(...) cho thấy bạn là số phao thực đã được lưu trữ. Bạn không thể đảm bảo một số chữ số có nghĩa trong một số phao.

7

Những gì bạn thấy không thực sự là vấn đề với các chữ số có nghĩa, nhưng thực tế là các số trên máy tính được lưu trữ dưới dạng nhị phân và không có biểu diễn nhị phân hữu hạn cho 3/5 (= 0,6). 3/5 ở dạng nhị phân trông giống như 0.100110011001 ..., với mẫu "1001" lặp đi lặp lại mãi mãi. Trình tự này tương đương với 0,599999 ... lặp lại. Bạn thực sự nhận được ba chữ số thập phân ở bên phải dấu thập phân trước bất kỳ lỗi nào liên quan đến các cú đá chính xác.

Điều này tương tự như cách không có biểu diễn cơ sở-10 hữu hạn là 1/3; chúng ta có 0.3333 lặp đi lặp lại mãi mãi.

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