Double vs FLOAT - erreur MathFloor peu claire - page 2

 
      float AUTOPRICE;
      float askP=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      float bidP=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
      float Averab=((askP+bidP))/2.0;
      AUTOPRICE=MathFloor(Averab)*Point;
      Print("FLOAT  "+"  askP="+askP+" bidP="+bidP+" Averab="+DoubleToString(Averab,10)+" AUTOPRICE="+DoubleToString(AUTOPRICE,10));

      double AUTOPRICE2;
      double askP2=NormalizeDouble(Ask,Digits)/NormalizeDouble(Point,Digits);
      double bidP2=NormalizeDouble(Bid,Digits)/NormalizeDouble(Point,Digits);
      double Averab2=((askP2+bidP2))/2.0;
      AUTOPRICE2=MathFloor(Averab2)*Point;
      Print("DOUBLE  "+"  askP2="+askP2+" bidP2="+bidP2+" Averab2="+DoubleToString(Averab2,10)+" AUTOPRICE="+DoubleToString(AUTOPRICE2,10));

écarté : 2

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30 : DOUBLE askP2=105143 bidP2=105141 Averab2=105142.000000 AUTOPRICE=1.0514200000

2017.02.26 09:56:54.475 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30 : FLOAT askP=105143 bidP=105141 Averab=105142.0000000000 AUTOPRICE=1.0514199734




écarté : 3

2017.02.26 09:57:47.832 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30 : DOUBLE askP2=105144 bidP2=105141 Averab2=105142.5000000000 AUTOPRICE=1.0514200000

2017.02.26 09:57:47.832 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30 : FLOAT askP=105144 bidP=105141 Averab=105142.5000000000 AUTOPRICE=1.0514199734


écarté : 4

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30 : DOUBLE askP2=105145 bidP2=105141 Averab2=105143.000000 AUTOPRICE=1.0514200000

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30 : FLOAT askP=105145 bidP=105141 Averab=105143.0000000000 AUTOPRICE=1.0514299870

écarté : 5

2017.02.26 09:58:39.495 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 09:58:39.495 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30 : FLOAT askP=105146 bidP=105141 Averab=105143.5000000000 AUTOPRICE=1.0514299870


 
J'ai renommé le sujet pour être plus précis sur le problème.
 
Vladislav Andruschenko:

2017.02.26 09:58:05.813 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30 : DOUBLE askP2=105145 bidP2=105141 Averab2=105143.000000 AUTOPRICE=1.0514200000

Le résultat est correct. Averab2 < 105143.

 
fxsaber:

Le résultat est correct. Averab2 < 105143.

pourquoi ? parce queAverab2=105143.0000000000

 
Vladislav Andruschenko:

Pourquoi ?Averab2=105143.0000000000

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Double vs FLOAT - erreur MathFloor peu claire

fxsaber, 2017.02.26 08:27

L'impression du double numéro ne représente rien. Si vous voulez imprimer la valeur réelle d'un double, vous devez regarder ses octets.

 
Vladislav Andruschenko:

Pourquoi ? Parce queAverab2=105143.0000000000

parce quehttps://www.mql5.com/ru/docs/math/mathfloor
 
fxsaber:

Je vous entends. Merci, mais cela ne concerne que le désamorçage.

Mais la valeur réelle dans le code est la même qu'après le désamorçage. Je l'ai vérifié plus d'une fois,

Je comprends,

que le double 1 = 1,000000000000000000000000112123515 ;

et ainsi de suite.

:-( ok, l'essentiel est que le problème soit résolu avec le float.

 
Andrey F. Zelinsky:
parce quehttps://www.mql5.com/ru/docs/math/mathfloor

105143

après MathFloor(105143) =105142

même si 105143.000000000000000000001

mais je pense que je sais de quoi tu parles.

bien qu'aucun

Print(2+" MathFloor="+MathFloor(2));

2 MathFloor=2



Je ne comprends pas pourquoi MathFloor(105143) =105142... (à moins que ce ne soit pas105143 mais105142.999999999999999999999999)

 
Vladislav Andruschenko:

pourquoi alors...

parce quehttps://www.mql5.com/ru/docs/convert/normalizedouble
 
Vladislav Andruschenko:

pourquoi alors MathFloor(105143) =105142 je ne peux pas comprendre... (à moins que ce ne soit pas105143, mais105142.9999999999999999999999999999)

#define TOSTRING(A) #A + " = " + (string)(A) + " "

void OnStart()
{
  double Price1 = 105143;
  double Price2 = Price1 - 1 e-11;

  Print(TOSTRING(Price1) + TOSTRING(MathFloor(Price1)) +
        TOSTRING(Price2) + TOSTRING(MathFloor(Price2)) +
        TOSTRING(Price1 > Price2));
}
Résultat
Price1 = 105143.0 MathFloor(Price1) = 105143.0 Price2 = 105143.0 MathFloor(Price2) = 105142.0 Price1>Price2 = true

Vous ne devriez pas prendre les doubles chiffres littéralement. Le passage au flottant est encore plus un écueil.