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