- Tipi Integer
- Tipi Reali (double, float)
- Numero complesso (complex)
- Tipo Stringa
- Strutture, Classi e Interfacce
- Oggetto Array Dinamico
- Matrices and vectors
- Typecasting
- Tipo Void e Costante NULL
- Tipi definiti dall'utente
- Puntatori agli Oggetti
- Riferimento. Il Modifier & e la parola chiave this
Tipi Reali (double, float)
I tipi reali (o tipi a virgola mobile) rappresentano i valori con una parte frazionaria. Nel linguaggio MQL5 ci sono due tipi di numeri floating point(_* a virgola mobile) .Il metodo di rappresentazione dei numeri reali nella memoria del computer è definito dallo standard IEEE 754 ed è indipendente dalle piattaforme, sistemi operativi o linguaggi di programmazione.
Tipo |
Dimensione in byte |
Valore Minimo Positivo |
Valore Massimo |
Analogo C++ |
---|---|---|---|---|
float |
4 |
1.175494351e-38 |
3.402823466e+38 |
float |
double |
8 |
2.2250738585072014e-308 |
1.7976931348623158e+308 |
double |
double
double tipo di numero reale che occupa 64 bit (1 bit di segno, 11 bit di esponente e 52 bit di mantissa).
float
float tipo di numero reale che occupa 32 bit (1 bit di segno, 11 bit di esponente e 23 bit di mantissa).
vector
Array unidimensionale di numeri di tipo double. La memoria per i dati viene allocata dinamicamente. Le proprietà del vettore possono essere ottenute utilizzando i metodi, con la quale la dimensione del vettore può essere modificata. La voce vector<double> può essere usata nelle funzioni dei template.
vectorf
Array unidimensionale di numeri di tipo float che può essere utilizzato al posto di vector se la perdita di precisione non ha importanza. La voce vector<float> può essere usata nelle funzioni dei template.
vectorc
Array unidimensionale di numeri di tipo complex è pensato per gestire numeri complessi. La voce vector<complex> può essere usata nelle funzioni dei template. Le operazioni sui vettori di tipo vectorc non sono ancora state implementate.
matrix
Matrix è un array bidimensionale di numeri di tipo double. La memoria per gli elementi della matrice è distribuita dinamicamente. Le proprietà della matrice possono essere ottenute utilizzando i metodi, con la quale la forma della matrice può essere cambiata. La voce matrix<double> può essere usata nelle funzioni dei template.
matrixf
Array bidimensionale di numeri di tipo float che può essere utilizzato al posto di matrix se la perdita di precisione non ha importanza. La voce matrix<float> può essere usata nelle funzioni dei template.
matrixc
Array bidimensionale di numeri di tipo complex è pensato per gestire numeri complessi. La voce matrix<complex> può essere usata nelle funzioni dei template. Le operazioni sulle matrici di tipo matrixc non sono ancora state implementate.
Il nome double significa che la precisione di questi numeri è due volte l'accuratezza del tipo di numerifloat. Nella maggior parte dei casi, il tipo double è il più conveniente. In molti casi la precisione limitata dei numeri float non è sufficiente. Il motivo per cui il tipo float è ancora usato, è per salvare la memoria (questo è importante per grandi array di numeri reali).
Costanti in floating-point consistono di una parte intera, un punto (.) e la parte frazionaria. Le parti intera e frazionaria sono sequenze di cifre decimali.
Esempi:
double a=12.111;
|
C'è un modo scientifico di scrivere costanti reali, spesso questo metodo di registrazione è più compatto di quello tradizionale.
Esempio:
double c1=1.12123515e-25;
|
Va ricordato che i numeri reali sono memorizzati nella memoria con una certa precisione limitata nel sistema binario, mentre generalmente viene utilizzata la notazione decimale . Ecco perché molti numeri che sono appunto rappresentati nel sistema decimale possono essere scritti solo come una frazione infinita nel sistema binario.
Per esempio, i numeri 0,3 e 0,7 sono rappresentati nel computer come frazioni infinite, mentre il numero di 0,25 è memorizzato esattamente così, perché rappresenta la potenza di due.
A questo proposito, si raccomanda di non confrontare due numeri reali per l'uguaglianza, in quanto tale confronto non è corretto.
Esempio:
voidOnStart()
|
Se si ha ancora bisogno di confrontare l'uguaglianza di due numeri reali, allora si può fare in due modi diversi. Il primo modo consiste nel confrontare la differenza tra due numeri con qualche piccola quantità che specifica la precisione del confronto.
Esempio:
bool EqualDoubles(double d1,double d2,double epsilon)
|
Osservato che il valore di epsilon nell'esempio precedente non può essere inferiore alla costante predefinita DBL_EPSILON. Il valore di questa costante è 2.2204460492503131e-016. La corrispondente costante per il tipo float è FLT_EPSILON = 1.192092896e-07. Il significato di questi valori è il seguente: è il valore più basso che soddisfa la condizione 1.0 + DBL_EPSILON! = 1.0 (per numeri di tipo float 1.0 + FLT_EPSILON! = 1.0).
Il secondo modo offre il confronto della differenza normalizzata di due numeri reali con zero. Non ha senso confrontare la differenza di numeri normalizzati con uno zero, perché qualsiasi operazione matematica con i numeri normalizzati da un risultato non-normalizzato.
Esempio:
bool CompareDoubles(double number1,double number2)
|
Alcune operazioni del co-processore matematico possono provocare il numero reale valido, che non può essere utilizzato in operazioni matematiche e operazioni di confronto, poiché il risultato di operazioni con numeri reali non validi è indefinito. Per esempio, quando si cerca di calcolare l' arcoseno di 2, il risultato è l'infinito negativo.
Esempio:
double abnormal = MathArcsin(2.0);
|
Oltre al meno infinito c'è il più infinito e NaN (not a number). Per determinare che questo numero non è valido, è possibile utilizzare MathIsValidNumber(). Secondo lo standard IEEE, hanno una particolare rappresentazione macchina. Per esempio, più infinito per il tipo double ha la rappresentanza bit di 0x7FF0 0000 0000 0000.
Esempi:
struct str1
|
Vedi anche