Sự khác nhau giữa kiểu dữ liệu float và double trong C/C++ là gì?

float với double là hai kiểu dữ liệu hoàn toàn khác nhau, sự khác nhau ở đây chính là số bits được dùng để biểu diễn và miền giá trị của chúng.

float

Số bits biểu diễn: 32

Miền giá trị: 1.17549e-38 ~ 3.40282e+38

double

Số bits biểu diễn: 64 bits

Miền giá trị: 2.22507e-308 ~ 1.79769e+308

Kiểu dữ liệu double dùng tới 64 bits để biểu diễn nên miền giá trị của nó rộng hơn gấp nhiều lần so với float, con số ở trên còn phụ thuộc vào từng hệ điều hành cụ thể, nếu bạn sử dụng máy tính lâu đời, có thể sẽ khác đôi chút.

Kiểm tra bằng cách chạy chương trình sau:

#include <iostream>
#include <limits>
using namespace std;

int main(){
    /* Xuất ra số bits biểu diễn kiểu dữ liệu float và double: 1 byte = 8 bits */
    cout << "So bits bieu dien float: " << sizeof(float) * 8 << " bits" << endl; // = 32 bits
    cout << "So bits bieu dien double: " << sizeof(double) * 8 << " bits" << endl; // = 64 bits

    /* Miền giá trị của kiểu dữ liệu float */
    cout <<"Gia tri nho nhat cua float la: " << FLT_MIN << endl;
    cout <<"Gia tri lon nhat cua float la: " << FLT_MAX << endl;

    /* Miền giá trị của kiểu dữ liệu double */
    cout <<"Gia tri nho nhat cua double la: " << DBL_MIN << endl;
    cout <<"Gia tri lon nhat cua double la: " << DBL_MAX << endl;

    return 0;
}

Kết quả của phép chia ở đoạn code bạn chạy thử nghiệm là như nhau bởi vì nó đã được rút gọn chỉ còn lại độ chính xác 5 chữ số, nếu bạn dùng hàm precision() để mở rộng độ chính xác, khi đó kết quả sẽ khác biệt, kiểu dữ liệu double sẽ cho kết quả chính xác hơn.

// Mở rộng độ chính xác đến 40 chữ số.
cout.precision(40);

float a = 8.0 / 3.0;
double b = 8.0 / 3.0;
cout << a << endl; // = 2.66666674613952640000
cout << b << endl; // = 2.66666666666666650000