Double vs FLOAT - errore MathFloor poco chiaro - pagina 4

 
Andrey Dik:
Il galleggiamento è la castrazione dei numeri e non offre alcun vantaggio. Meglio affrontare tutte le perdite nelle conversioni e usare la massima precisione possibile - il doppio.
Grazie. Cercherò di capire dove ho sbagliato. Per ora il galleggiante funziona ancora bene. Non ho l'abitudine di rinunciare a ciò che ho iniziato. Ma questo errore mi ha fatto perdere l'equilibrio.
 
Vladislav Andruschenko:
Grazie. Cercherò di capire dove era il mio errore. Nel frattempo, il galleggiante funziona. Non sono abituato a smettere. Ma questo errore mi ha lasciato perplesso.
Sta a voi, ma notate che TUTTE le funzioni matematiche standard lavorano con numeri doppi e producono risultati doppi. L'applicazione di queste funzioni a numeri float produce una conversione interna in double, quindi si perde comunque la precisione e la validità dei risultati.

Personalmente, non uso mai nei calcoli e nei confronti di numeri il metodo che confronta la differenza con qualche valore minimo accettato, lavoro sempre con la massima precisione possibile fino al 16° segno, e solo nell'ultima operazione faccio la normalizzazione. Se gestite correttamente il doppio non ci sono problemi, cosa che vi consiglio di fare, altrimenti incontrerete problemi di distorsione dei risultati associati a una perdita di precisione in uno dei passi dei calcoli/conversioni.
 
Andrey Dik:
Sta a te, ma nota che TUTTE le funzioni matematiche standard lavorano con numeri doppi e danno risultati doppi. Applicare queste funzioni a numeri float è ancora una conversione interna al doppio, quindi in ogni caso, si perde precisione e validità nei risultati ottenuti.

Personalmente, non uso mai nei calcoli e nei confronti di numeri il metodo che confronta la differenza con qualche valore minimo accettato, lavoro sempre con la massima precisione possibile fino al 16° segno, e solo nell'ultima operazione faccio la normalizzazione. Se lavorate con il doppio correttamente nessun problema, cosa che vi consiglio di fare, altrimenti incontrerete problemi di distorsione dei risultati associati a una perdita di precisione in uno dei passi dei calcoli/conversioni.
Grazie per la sua risposta esauriente.
 

il prezzo di valutazione nel 2017 è sfacciatamente corretto

non sono le falene, è il letame...

 
Mikhail Dovbakh:

il prezzo di valutazione nel 2017 è sfacciatamente corretto

Raccontaci.
 

è così che dovrebbe essere

double Averab=(Ask+Bid)/2/_Point;
double AUTOPRICE=MathFloor( NormalizeDouble(Averab,2) )*_Point;
 
Taras Slobodyanik:

dovrebbe essere così.

double Averab=MathAbs(Ask-Bid)/2/_Point;
double AUTOPRICE=MathFloor( NormalizeDouble(Averab,2) )*_Point;


Hai cambiato il tuo codice diverse volte.

Ho fatto la stessa cosa, ho sperimentato, ho capito cosa sono double e int, ma quando ho calcolato esplicitamente non erano ciò di cui avevo bisogno.

La prima riga è quella che hai suggerito tu.

MathFloor( NormalizeDouble((Ask+Bid)/Point,_Digits) )*Point
2017.02.26 18:24:59.133 2017.01.02 00:03:00  Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: MathFloor=2.10287
2017.02.26 18:24:59.133 2017.01.02 00:03:00  Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: DOUBLE    askP2=105146 bidP2=105141 Averab2=105143.5000000000 AUTOPRICE=1.0514300000
2017.02.26 18:24:59.133 2017.01.02 00:03:00  Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: FLOAT    askP=105146 bidP=105141 Averab=105143.5000000000 AUTOPRICE=1.0514299870
 

quindi è giusto105143.5000000000 arrotondato per difetto 43 è...

(46-41)/2 = 2,5, arrotondato per difetto = 2

 
Taras Slobodyanik:

quindi è giusto105143.5000000000 arrotondato per difetto 43 è...

(46-41)/2 = 2,5, arrotondato per difetto = 2


Proprio così,

ma con diversi spread (2,3,4,5,6,7) l'arrotondamento verso il basso è diverso e a volte non del tutto preciso.

 
Controllato da 0 a 8 tutto è OK...