Thắc mắc về so sánh số thực

int main()
{
    float i=3.88;

    i=i*100-388;
    if(i!=0.0)
    printf("%f",i);
    return 0;
}

Như ở trên mọi người có thể giúp em giải thích tại sao i sau khi thực hiện phép toán nó lại không bằng 0.0 không ạ? và có cách nào để i thành được 0.0 không ak??

Vì 3.88 ở hệ 10 không thể biểu diễn chính xác bằng dạng chấm nổi nên 3.88 * 100 cũng sai số theo luôn.

Bạn có thể tham khảo ở phần “Value actually stored”.

Về cách khắc phục thì theo mình chắc chỉ có nước dùng epsilon khoảng 10^-9 để kiểm tra sự giống khác thôi. Giống thì abs(i) < epsilon, còn khác thì ngược lại

5 Likes

Vậy lỗi trên là do giá trị lưu vào float thực sự là khác với giá trị mình đã nhập vào, thế giờ mình muốn lấy lại (chính xác ) giá trị mình đã nhập ban đầu thì mình nên làm kiểu gì để được ak :thinking:???

Float không có đi chung với so sánh bằng
Để xử lý thì cần hiểu rõ hoàn cảnh cụ thể

3 Likes

cụ thể là em muốn viết một function dùng để đọc float, sử dụng putchar()
nhưng đọc đến phần phân số là nó gặp rắc rối (do lỗi trên) nên in ra kết quả không đúng.
ex: 3.88 mà in thì nó ra 3.8800…(rồi một chuỗi số không chính xác)
anh chỉ em cách giải quyết hay hướng hoặc một tài liệu nào đó để em xử lý được không ak
(tại thấy mấy function built-in nó vẫn xử lý được ak)

nếu không sử dụng để tính toán thì đọc và ghi như chuỗi
còn tính toán thì sẽ phải có quy ước về độ chính xác như bạn ở trên đã nói

1 Like

Cho nhập vào chuỗi, rồi bạn chuyển sang dạng struct để tính toán :slight_smile: vì có dấu phẩy rất vướng víu.

1 Like

Nếu bạn muốn tính toán “chính xác”, nên tham khảo kiểu này https://en.wikipedia.org/wiki/Fixed-point_arithmetic và chọn scaling factor10^n thử xem.

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