Double vs FLOAT - unklarer MathFloor-Fehler - Seite 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));

Verbreitung: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




Verbreitung: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


Verbreitung: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

Verbreitung: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


 
das Thema umbenannt, um das Problem genauer zu beschreiben.
 
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

Das Ergebnis ist korrekt. Averab2 < 105143.

 
fxsaber:

Das Ergebnis ist korrekt. Averab2 < 105143.

Warum? weilAverab2=105143.0000000000

 
Vladislav Andruschenko:

Warum?averab2=105143.0000000000

Forum für Handel, automatisierte Handelssysteme und Strategietests

Double vs FLOAT - unklarer MathFloor-Fehler

fxsaber, 2017.02.26 08:27

Der Ausdruck der Doppelnummer ist nicht von Bedeutung. Wenn Sie den wahren Wert von double ausdrucken wollen, müssen Sie sich die Bytes ansehen.

 
Vladislav Andruschenko:

Warum? weilAverab2=105143.0000000000

dennhttps://www.mql5.com/ru/docs/math/mathfloor
 
fxsaber:

Ich verstehe Sie. Danke, aber das betrifft nur das Entlüften.

Aber der tatsächliche Wert innerhalb des Codes ist derselbe wie nach dem Entpacken. Ich habe es mehr als einmal überprüft,

Das verstehe ich,

dass Double 1 = 1,0000000000000000000000000000112123515;

und so weiter.

:-( ok, die Hauptsache ist, dass das Problem mit float gelöst wird

 

105143

nach MathFloor(105143) =105142

auch wenn 105143.000000000000000000001

aber ich glaube, ich weiß, wovon du sprichst.

obwohl keine

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

2 MathFloor=2



warum MathFloor(105143) =105142 kann ich nicht verstehen... (es sei denn, es ist nicht105143, sondern105142,9999999999999999999999)

 
Vladislav Andruschenko:

warum dann...

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

warum dann MathFloor(105143) =105142 kann ich nicht verstehen... (es sei denn, es ist nicht105143, sondern105142,999999999999999999999999)

#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));
}
Ergebnis
Price1 = 105143.0 MathFloor(Price1) = 105143.0 Price2 = 105143.0 MathFloor(Price2) = 105142.0 Price1>Price2 = true

Sie sollten Doppelnummern nicht wörtlich nehmen. Die Umstellung auf Floating ist ein noch größerer Fallstrick.

Grund der Beschwerde: