2012-04-11 20 views
29

Tôi đang đọc một cuốn sách C, nói về phạm vi của các dấu chấm động, các tác giả đã đưa ra bảng:Phạm vi của kiểu dữ liệu dấu chấm động trong C?

enter image description here

Tôi không biết nơi mà các con số trong cột Value tích cực và lớn nhất nhỏ nhất đến từ.

+4

Chúng đến từ phạm vi của loại dấu phẩy động. –

+9

Câu trả lời đúng nhưng vô dụng sẽ là "IEEE 754". –

+2

Bạn có nghĩa là tại sao giới hạn những giá trị đó? – SirGuy

Trả lời

18

Những con số này đến từ tiêu chuẩn IEEE-754, xác định đại diện tiêu chuẩn của các số dấu phẩy động. Bài viết trên Wikipedia tại liên kết explains cách đến các phạm vi này để biết số lượng bit được sử dụng cho các dấu hiệu, giá trị và số mũ.

1

Đó là hệ quả của kích thước của phần số mũ của loại, ví dụ như trong IEEE 754. Bạn có thể kiểm tra các kích thước với FLT_MAX, FLT_MIN, DBL_MAX, DBL_MIN trong float.h.

+0

là các macro này là macro chuẩn C? Tại sao tôi yêu cầu INT_MAX và INT_MIN có sẵn trong giới hạn.h. –

+0

những hình như không có sẵn trong giới hạn.h – MightyPork

25

Một số dấu chấm động 32 bit có 23 + 1 bit của mantissa và 8 bit số mũ (-126 đến 127 được sử dụng mặc dù) nên số lượng lớn nhất bạn có thể biểu diễn là:

(1 + 1/2 + ... 1/(2^23)) * (2^127) = 
(2^23 + 2^23 + .... 1) * (2^(127 - 23)) = 
(2^24 - 1) * (2^104) ~= 3.4e38 
2

Như dasblinkenlight đã trả lời, những con số đến từ cách mà các số dấu phẩy động được thể hiện trong IEEE-754, và Andreas có một sự phân tích tốt về toán học. Tuy nhiên, hãy cẩn thận rằng độ chính xác của các số dấu phẩy động không chính xác là 6 hoặc 15 chữ số thập phân đáng kể như bảng gợi ý, vì độ chính xác của các số IEEE-754 phụ thuộc vào số chữ số nhị phân đáng kể.

  • float có 24 chữ số nhị phân có ý nghĩa - mà tùy thuộc vào số lượng đại diện dịch để 6-8 chữ số thập phân của độ chính xác.

  • double có 53 chữ số nhị phân đáng kể, xấp xỉ 15 chữ số thập phân.

Another answer of mine có giải thích thêm nếu bạn quan tâm.

6

Các giá trị cho các kiểu dữ liệu float bắt nguồn từ việc 32 bit trong tổng số để đại diện cho số đó được phân bổ như thế này:

1 chút: dấu chút

8 bit: số mũ p

23 bit: mantissa

Số mũ được lưu trữ là p + BIAS trong đó BIAS là 127, mantissa có 23 bit và bit ẩn thứ 24 được giả định 1. bit ẩn này là bit quan trọng nhất (MSB) của phần định trị và e xponent phải được chọn sao cho nó là 1.

Điều này có nghĩa là số nhỏ nhất bạn có thể đại diện là 010000000000000000000000000000001x2^-126 = 1.17549435E-38.

Giá trị lớn nhất là 011111111111111111111111111111111, số thập phân là 2 * (1 - 1/65536) và số mũ là 127 cho số (1 - 1/65536) * 2^128 = 3.40277175E38.

Các nguyên tắc tương tự áp dụng cho độ chính xác kép trừ các bit là:

1 chút: dấu chút

11 bit: bit mũ

52 bit: bit mantissa

BIAS: 1023

Vì vậy, về mặt kỹ thuật, các giới hạn đến từ tiêu chuẩn IEEE-754 để biểu thị các số dấu phẩy động và trên đây là cách những giới hạn đó nó đến khoảng

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