Giải thích Float có 4 byte và lưu giá trị 1000 tỷ?

Mình có đoạn code và output “hoang đường” như bên dưới.
Theo những gì được biết, một số n bit chỉ có thể có giá trị tối đa là 2^n-1;
Vậy tại sao float có 32 bit (4 bytes) lại có thể có giá trị 1000 tỷ ?
Mời các anh em.

#include <iostream>;

int main(int argc, char *argv[]){
    float value=9999999999999; // 9.999.999.999.999
    std::cout<<"Size of value: "<< sizeof (value) << std::endl;
    std::cout<<"Value is : "<< value <<std::endl;
    return 0;
}

Output:

Size of value: 4
Value is     : 1e+013

Có lẽ là vì nó lưu theo dạng dấu phẩy động. Int32 thì độ chính xác ở tất cả các giá trị là như nhau, còn các kiểu số thực thì số mũ càng lớn, độ chính xác càng nhỏ.

1 Like

nó có lưu được 9’999’999’999’999 đâu, nó lưu 1e+13 mà? Nó chơi ăn gian nên nó lưu được đúng rồi

in ra thấy có giá trị là Value is : 9999999827968.000000 ăn gian, ko lưu đúng. Nó cũng chỉ lưu được 4 tỷ giá trị nhưng nó map 4 tỷ giá trị số nguyên tới 4 tỷ giá trị khác nhau trên số thực thôi. Nó thích map vô số thực nào chả được!!! Ở đây nó ko map được tới số thực 9’999’999’999’999 này

4 Likes

trường hợp này chắc là bị tràn số thôi , kiểu số nguyên thì khi bị tràn số nó sẽ chỉ lưu được các bit trong pham vi biểu diễn, bit tràn bị bỏ đi
VÍ dụ đoạn code như này

unsigned char a = 273;
printf( "%d",a); // a = 17

Khi a = 273 thì biểu diễn nhị phân là 1 0001 0001 , nhưng a chỉ có 8 bit ( vì là char ) nên con 1 ngoài cùng bên trái bị bỏ đi, lúc này máy tính sẽ lưu a là 0001 0001 = 17.
Từ đó có thể đoán là kết quả 1e+13 chắc là phần 32 bit còn lại của biến float kia

32 bit thì không thể có giá trị tới e+13 được.

Có vẻ hợp lý. Nó đã ăn gian.

Mình tưởng cái này là cơ bản mà?

số lớn nhất float32 có thể đạt được theo chuẩn IE3 754 là 3.402823 x 10^38 cơ.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?