Số dấu phẩy động được sử dụng cho các giá trị được biểu thị bằng dấu thập phân.
Ví dụ sau cho biết cách khai báo các biến dấu phẩy động, minh họa các vấn đề bạn có thể gặp phải khi so sánh các giá trị dấu phẩy động và cách khắc phục 😀
/*
Ví dụ dấu phẩy động
Ví dụ khởi tạo giá trị value bằng 1.1
Và liên tục giảm 0.1 để về 0
*/
float value = 1.1;
void setup()
{
Serial.begin(9600);
}
void loop()
{
value = value - 0.1; // giảm 0.1 mỗi lần loop
if ( value == 0)
Serial.println("Giá trị đã bằng 0");
else if (almostEqual(value, 0))
{
Serial.print("Giá trị ");
Serial.print(value, 7); // in ra giá trị thập phân đến số thứ 7
Serial.println(" gần bằng 0");
} else {
Serial.println(value);
delay(100);
}
}
// Hàm xấp xỉ bằng, sẽ trả lại giá trị nếu |a - b| < DELTA
// Delta là giá trị xấp xỉ bằng giữa 2 số
boolean almostEqual(float a, float b)
{
const float DELTA = .00001; // giá trị delta
if (a == 0) return fabs(b) <= DELTA;
if (b == 0) return fabs(a) <= DELTA;
return fabs((a - b) / max(fabs(a), fabs(b))) <= DELTA ;
}
Giờ ta quan sát Serial Monitor
1.00
0.90
0.80
0.70
0.60
0.50
0.40
0.30
0.20
0.10
Giá trị -0.0000001 gần bằng 0
-0.10
-0.20
Ồ, tại sao lại là gần bằng ?, bạn tính đúng ra phải là Giá trị đã bằng 0
chứ ?, Khi trừ lần lượt 0.1 thì giá trị sẽ về 0 nhưng không đúng như vậy, điều này liên quan đến việc lưu trữ dấy phẩy động trong bộ nhớ và giá trị sẽ không đúng chính xác = 0 mà nó chỉ gần đâu đấy trong khoảng delta. và bạn phải dùng hàm fas để kiểm tra các giá trị gần đúng.