Giá trị tuyệt đối của một số
API MQL5 cung cấp hàm MathAbs
có thể loại bỏ dấu trừ khỏi số nếu nó tồn tại. Do đó, không cần phải tự viết mã các tương đương dài dòng như sau:
if(x < 0) x = -x;
numeric MathAbs(numeric value) ≡ numeric fabs(numeric value)
Hàm này trả về giá trị tuyệt đối của số được truyền vào, tức là mô-đun của nó. Đối số có thể là số thuộc bất kỳ loại nào. Nói cách khác, hàm được nạp chồng cho các loại char/uchar
, short/ushort
, int/uint
, long/ulong
, float
và double
, mặc dù với các loại không dấu thì giá trị luôn không âm.
Khi truyền một chuỗi, nó sẽ được chuyển đổi ngầm thành số double
và trình biên dịch sẽ tạo ra một cảnh báo liên quan.
Kiểu của giá trị trả về luôn giống với kiểu của đối số, và do đó trình biên dịch có thể cần ép kiểu giá trị sang kiểu của biến nhận nếu các kiểu khác nhau.
Ví dụ sử dụng hàm có sẵn trong tệp MathAbs.mq5
.
void OnStart()
{
double x = 123.45;
double y = -123.45;
int i = -1;
PRT(MathAbs(x)); // 123.45, số được giữ nguyên
PRT(MathAbs(y)); // 123.45, dấu trừ bị loại bỏ
PRT(MathAbs(i)); // 1, int được xử lý tự nhiên
int k = MathAbs(i); // không có cảnh báo: kiểu int cho tham số và kết quả
// các tình huống có cảnh báo:
// yêu cầu chuyển đổi từ double sang long
long j = MathAbs(x); // có thể mất dữ liệu do chuyển đổi kiểu
// cần chuyển đổi từ kiểu lớn (4 byte) sang kiểu nhỏ (2 byte)
short c = MathAbs(i); // có thể mất dữ liệu do chuyển đổi kiểu
...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Điều quan trọng cần lưu ý là việc chuyển đổi một số nguyên có dấu sang số nguyên không dấu không tương đương với việc lấy mô-đun của một số:
uint u_cast = i;
uint u_abs = MathAbs(i);
PRT(u_cast); // 4294967295, 0xFFFFFFFF
PRT(u_abs); // 1
2
3
4
Cũng lưu ý rằng số 0 có thể mang dấu:
...
double n = 0;
double z = i * n;
PRT(z); // -0.0
PRT(MathAbs(z)); // 0.0
PRT(z == MathAbs(z)); // true
}
2
3
4
5
6
7
Một trong những ví dụ tốt nhất về cách sử dụng MathAbs
là kiểm tra sự bằng nhau của hai số thực. Như đã biết, số thực có độ chính xác hạn chế trong việc biểu diễn giá trị, điều này có thể suy giảm thêm trong quá trình tính toán dài (ví dụ, tổng của mười giá trị 0.1 không cho chính xác 1.0). Điều kiện nghiêm ngặt value1 == value2
có thể cho kết quả false
trong hầu hết các trường hợp, khi mà sự bằng nhau theo lý thuyết nên đúng.
Do đó, để so sánh các giá trị thực, thường sử dụng ký hiệu sau:
MathAbs(value1 - value2) < EPS
trong đó EPS
là một giá trị dương nhỏ biểu thị độ chính xác (xem ví dụ trong phần Phép toán so sánh).