Hỏi về sự khác nhau giữa float và double

Theo trong lý thuyết em học được thì hai kiểu dữ liệu này chỉ khác nhau vệ độ lớn float 4 bytes, double 8 bytes. Nhưng vì sao như ví dụ dưới đây, nó lại khác nhau ạ?

#include <stdio.h>

int  main()
{
    float   f = 0.1;
    double  d = 0.1;
    if (f == d)
        printf("True\n");
    else
        printf("False\n");
}

output là False

Nó là cả một vấn đề đó bạn :slight_smile:

float sẽ đc nâng lên double và đương nhiên nó ko thể có đủ chữ số, vì cả hai đều là xấp xỉ của 1/10, cũng như 0.3333 là xấp xỉ 1/3 vậy.

8 Likes

Trong lập trình, so sánh số thực (dấu phẩy động) là 1 so sánh “nguy hiểm”.
Số thực dc lưu ở dạng dấu phẩy động, nên sẽ có sai số. Ví dụ biểu diễn số 1.0, thì giá trị trong thanh ghi có lúc nó sẽ thành 1.0000000001, có khi nó sẽ thành 0.99999999999.
→Phần này, hãy đọc kỹ về kiểu dấu phẩy động, cách mà dấu phẩy động dc biểu diễn trong memory/register.
Hơn nữa, so sánh float với double lại càng sai số thêm.

P/s: Trong lập trình, người ta thường giới hạn con số thực , làm tròn đến bao nhiêu con số sau dấu phẩy đấy, rồi “rời rạc” hóa(nguyên hóa) con số để làm việc: so sánh tuyệt đối.
Để giữ nguyên số thực là chỉ để tính toán và xuất giá trị thuần ra ngoài thôi.

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