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?
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ừ.
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?
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ừ.
Đó 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.
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. –
những hình như không có sẵn trong giới hạn.h – MightyPork
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
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.
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à 01000000000000000000000000000000
là 1x2^-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
Chúng đến từ phạm vi của loại dấu phẩy động. –
Câu trả lời đúng nhưng vô dụng sẽ là "IEEE 754". –
Bạn có nghĩa là tại sao giới hạn những giá trị đó? – SirGuy