Dijkstra June 2018 | Page 25

TẠI SAO CHÚNG TA CẦN FLOATING POINT? Với kiểu dữ liệu fixed point, dấu chấm thập phân (decimal point) là cố định: T rong khoa học máy tính, đặc biệt là trong ngôn ngữ C/C++, ta có nhiều sự lựa chọn về kiểu dữ liệu để biểu thị một số nguyên từ số nhị phân (từ int, đại diện cho số nguyên âm và dương với khoảng giá trị từ -32768 đến 32767 trên hệ thống 16 - bit, cho tới unsigned long long, đại diện cho số nguyên dương từ 0 đến 2^64-1). Như vậy, đối với số thực, người ta làm thế nào? Floating point là câu trả lời cho câu hỏi trên, nó được tạo ra nhằm mục đích biểu thị một số thực trên máy tính. Thế thì tại sao lại là float- ing point mà không phải là fixed point? trong đó: decimal là số bit biểu thị phần nguyên, frac là số bit biểu thị phần thập phân. Lấy ví dụ về một kiểu dữ liệu fixed point 8 bit, phần decimal là 5 bit và phần frac là 3 bit. Ta có: Kiểu dữ liệu fixed point như trên là rất đơn giản và phù hợp với những ứng dụng có yêu cầu độ chính xác tương đối. Nhưng đối với các ứng dụng yêu cầu độ chính xác rất cao hoặc rất thấp, nó sẽ gặp nhiều giới hạn và không sử dụng hiệu quả được các bit đang có. Chính vì thế, chúng ta cần đến kiểu dữ liệu floating point - dấu chấm động - để biểu thị một số thực bằng mã nhị phân. Tuy nhiên floating point cũng có hạn chế nhất định của nó, cái mà có thể gây ra lỗi không mong muốn trong quá trình cod- ing. Trước khi bắt đầu, các bạn hãy thử xem đoạn code sau đây: int main(int agrc, char ** arg) { float a = 1e10f; float b = 1e10f; float c = 0.1f; float result_1 = a - b + c; float result_2 = a + c - b; printf(“a - b + c = %.4f\n”, result_1); printf(“a + c - b = %.4f\n”, result_2); return 0; } Theo bạn, kết quả in ra sẽ là gì? Có thể nhiều bạn sẽ ngạc nhiên sau khi chạy thử chương trình: a - b + c = 0.1000 a + c - b = 0.0000 Bài viết này sẽ làm rõ vấn đề tại sao kết quả lại là như trên. ĐỊNH DẠNG CHẤM ĐỘNG THEO CHUẨN IEEE 754 Theo tiêu chuẩn IEEE 754 về số floating point, có tổng cộng 3 trường để biểu thị một số float, lần lượt là: • Sign bit: bit dấu, luôn là 1 bit và là bit có trọng số cao nhất (most significant bit) • Exponent bits: phần mũ, cơ số luôn là 2 • Fraction bits: phần thập phân, hay còn là mantissa DIJSKTRA 25