ĐỊNH NGHĨA
Số phẩy động hay còn gọi là số thực, là một dạng dữ liệu rất quan trọng trong lập trình, đặc biệt là trong các bài toán liên quan đến tính toán. Trong lập trình C++, kiểu dữ liệu double (64 bit) và long double (80 bit) thường được sử dụng để đại diện cho các số phẩy động.
Trong hầu hết các tình huống, kiểu dữ liệu double là đủ sức giải quyết các bài toán. Tuy nhiên, trong một số trường hợp yêu cầu độ chính xác cao hơn, kiểu dữ liệu long double có thể là lựa chọn tốt hơn do nó sử dụng nhiều bit hơn, từ đó tăng cường độ chính xác.
Độ chính xác cần thiết của từng bài toán thường được chỉ định rõ trong đề bài, vì thế người lập trình cần đọc kỹ để chọn kiểu dữ liệu phù hợp.
Một trong những cách đơn giản để quy định số chữ số thập phân sau dấu phẩy khi in ra, bạn có thể sử dụng hàm printf(). Ví dụ:
printf("%.9f\n", x);
Câu lệnh này sẽ in ra giá trị của biến x với 9 chữ số sau dấu thập phân.
VẤN ĐỀ NỔI BẬT
‼️ Một trong những vấn đề phổ biến nhất khi làm việc với số phẩy động chính là sự không chính xác khi biểu diễn các số thập phân. Điều này thường dẫn đến tình trạng làm tròn không chính xác.
Xem ví dụ sau đây mà có thể khiến những lập trình viên mới cảm thấy khó chịu 🥶:
// Có thể bạn sẽ nghĩ rằng x = 0.9 + 0.1 = 1 đúng không?
double x = 0.3 * 3 + 0.1;
// Nhưng khi in giá trị của x với 20 chữ số thập phân, kết quả lại là: 0.99999999999999988898
printf("%.20f\n", x);
Như bạn có thể thấy, do lỗi làm tròn, giá trị thực của x nhỏ hơn 1 một chút, trong khi chúng ta chỉ mong muốn giá trị này phải là 1.
Do đó, việc so sánh hai số phẩy động bằng toán tử ==
là rất rủi ro. Mặc dù mắt thường có thể nhìn thấy chúng bằng nhau, nhưng thực tế máy tính có thể cho ra kết quả khác do lỗi làm tròn.
CÁCH GIẢI QUYẾT VẤN ĐỀ NÀY 🤔
✅ Cách hiệu quả hơn để so sánh các số phẩy động đó là kiểm tra điều kiện chênh lệch giữa hai số. Nếu hiệu số giữa a và b nhỏ hơn một giá trị nhất định (thường là nhỏ hơn 10⁻⁹), chúng ta có thể coi như hai số này là bằng nhau.
// Hàm abs() tính giá trị tuyệt đối, đảm bảo (a-b) không bị âm
if (abs(a-b) < 1e-9) {
// Kết luận a và b bằng nhau
}
TÀI NGUYÊN THAM KHẢO
Các bạn có thể tham khảo chuỗi video "Lên trình Thuật toán - Lập trình thi đấu 🏆" mà mình đang thực hiện trên Youtube để hiểu thêm về các khía cạnh trong lập trình.
Hy vọng rằng kiến thức được chia sẻ ở đây sẽ hữu ích cho bạn. Hẹn gặp lại 👋
source: viblo