- Целые типы
- Вещественные типы (double, float)
- Комплексное число (complex)
- Тип string
- Структуры, классы и интерфейсы
- Объект динамического массива
- Матрицы и векторы
- Приведение типов
- Тип void и константа NULL
- Пользовательские типы
- Указатели объектов
- Ссылки. Модификатор & и ключевое слово this
Вещественные типы (double, float)
Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL5 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования.
Тип |
Размер в байтах |
Минимальное положительное значение |
Максимальное значение |
Аналог в С++ |
---|---|---|---|---|
float |
4 |
1.175494351e-38 |
3.402823466e+38 |
float |
double |
8 |
2.2250738585072014e-308 |
1.7976931348623158e+308 |
double |
double
Вещественный тип чисел double занимает 64 бита (1 знаковый бит, 11 бит экспоненты и 52 бита мантиссы).
float
Вещественный тип чисел float занимает 32 бита (1 знаковый бит, 8 бит экспоненты и 23 бита мантиссы).
vector
Одномерный массив чисел типа double. Память под данные распределяется динамически. Свойства вектора могут быть получены при помощи методов, при этом размер вектора может быть изменен. В шаблонных функциях можно использовать запись vector<double>.
vectorf
Одномерный массив чисел типа float, может использоваться вместо vector, если потеря точности не имеет значения. В шаблонных функциях можно использовать запись vector<float>.
vectorc
Одномерный массив чисел типа complex, предназначен для работы с комплесными числами. В шаблонных функциях можно использовать запись vector<complex>. На данный момент операции над векторами типа vectorc еще не реализованы.
matrix
Матрица — двумерный массив чисел типа double. Память под элементы матрицы распределяется динамически. Свойства матрицы могут быть получены при помощи методов, при этом размер вектора может быть изменен. В шаблонных функциях можно использовать запись matrix<double>.
matrixf
Двумерный массив чисел типа float, может использоваться вместо matrix, если потеря точности не имеет значения. В шаблонных функциях можно использовать запись matrix<float>.
matrixc
Двумерный массив чисел типа complex, предназначен для работы с комплесными числами. В шаблонных функциях можно использовать запись matrix<complex>. На данный момент операции над матрицами типа matrixc еще не реализованы.
Имя double означает, что точность этих чисел вдвое превышает точность чисел типа float. В большинстве случаев тип double является наиболее удобным. Ограниченной точности чисел float во многих случаях попросту недостаточно. Причина, по которой тип float все еще используется, - экономия памяти при хранении (это важно для больших массивов вещественных чисел).
Константы с плавающей точкой состоят из целой части, точки (.) и дробной части. Целая и дробная части представляют собой последовательности десятичных цифр.
Примеры:
double a=12.111;
|
Существует научный способ записи вещественных констант, зачастую этот способ записи более компактный, чем традиционный.
Пример:
double c1=1.12123515e-25;
|
Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби.
Например, числа 0.3 и 0.7 представлены в компьютере бесконечными дробями, в то время как число 0.25 хранится точно, так как представляет из себя степень двойки.
В связи с этим, категорически не рекомендуется сравнивать между собой два вещественных числа на равенство, так как такое сравнение не является корректным.
Пример:
void OnStart()
|
Если все же необходимо сравнить на равенство два вещественных числа, то можно сделать это двумя разными способами. Первый способ заключается в сравнении разницы между двумя числами с какой-то малой величиной, задающей точность сравнения.
Пример:
bool EqualDoubles(double d1,double d2,double epsilon)
|
Необходимо отметить, что значение параметра epsilon в приведенном примере не может быть меньше предопределенной константы DBL_EPSILON. Значение этой константы 2.2204460492503131e-016. Для типа float соответствующая константа FLT_EPSILON = 1.192092896e-07. Смысл этих значений таков, что это наименьшее значение, удовлетворяющее условию 1.0+DBL_EPSILON != 1.0 (для чисел типа float 1.0+FLT_EPSILON != 1.0).
Второй способ предполагает сравнивать нормализованную разность двух вещественных чисел с нулевым значением. Сравнивать разность нормализованных чисел с нулём бесполезно, так как в результате любой математической операции с нормализованными числами результат получается ненормализованным.
Пример:
bool CompareDoubles(double number1,double number2)
|
В результате некоторых операций математического сопроцессора может получиться недействительное вещественное число, которое нельзя использовать в математических операциях и операциях сравнения, так как результат выполнения операций над недействительными вещественными числами неопределен. Например, при попытке вычислить арксинус от 2, результатом будет минус бесконечность.
Пример:
double abnormal = MathArcsin(2.0);
|
Кроме минус бесконечности существуют плюс бесконечность и NaN (не число). Чтобы определить, что данное число недействительно, можно использовать функцию MathIsValidNumber(). По стандарту IEEE они имеют специальное машинное представление. Например, плюс бесконечность для типа double имеет битовое представление 0x7FF0 0000 0000 0000.
Примеры:
struct str1
|
Смотри также