Double vs FLOAT - непонятная ошибка MathFloor - страница 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));

спред: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.0000000000 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




спред: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

 


спред: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.0000000000 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

 

спред: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

 


 

 
переименовал тему, чтобы конкретизировать проблему. 
 
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.0000000000 AUTOPRICE=1.0514200000

Результат правильный. Averab2 < 105143.

 
fxsaber:

Результат правильный. Averab2 < 105143.

почему? ведь там Averab2=105143.0000000000 

 
Vladislav Andruschenko:

почему? ведь там Averab2=105143.0000000000 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Double vs FLOAT - непонятная ошибка MathFloor

fxsaber, 2017.02.26 08:27

Распринтовка double-числа - ни о чем. Если хочется распечатать истинное значение double, нужно посмотреть его байты.

 
Vladislav Andruschenko:

почему? ведь там Averab2=105143.0000000000 

потому что https://www.mql5.com/ru/docs/math/mathfloor
 
fxsaber:

 

я Вас понял. Спасибо, но это что касается распринтовки.

но и реальное значение внутри кода такое же как после распринтовки. я не однократно это проверял,

я понимаю,

что double 1 = 1.000000000000000000000000112123515;

и так далее. 

:-( ладно, главное что проблема решена с float 

 
Andrey F. Zelinsky:
потому что https://www.mql5.com/ru/docs/math/mathfloor

105143 

после MathFloor(105143) = 105142 

даже если 105143.00000000000000000000001

но я кажется понял о чем ВЫ говорите.  

хотя нет

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

 

2 MathFloor=2



почему же тогда MathFloor(105143) = 105142 не могу понять...  (если только там не 105143, а 105142,999999999999999999999999)

 
Vladislav Andruschenko:

почему же тогда ...

потому что https://www.mql5.com/ru/docs/convert/normalizedouble
 
Vladislav Andruschenko:

почему же тогда MathFloor(105143) = 105142 не могу понять...  (если только там не 105143, а 105142,999999999999999999999999)

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

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

  Print(TOSTRING(Price1) + TOSTRING(MathFloor(Price1)) +
        TOSTRING(Price2) + TOSTRING(MathFloor(Price2)) +
        TOSTRING(Price1 > Price2));
}
Результат
Price1 = 105143.0 MathFloor(Price1) = 105143.0 Price2 = 105143.0 MathFloor(Price2) = 105142.0 Price1>Price2 = true

Не надо распринтовку double-чисел воспринимать буквально. Переход на float - еще больше подводных камней. 

Причина обращения: