Duplo versus FLOAT - erro de MathFloor não claro - página 4

 
Andrey Dik:
A flutuação é a castração de números e não oferece nenhuma vantagem. Lidar melhor com todas as perdas nas conversões e usar a maior precisão possível - o dobro.
Obrigado. Vou tentar descobrir onde cometi um erro, afinal de contas. Por enquanto, a bóia ainda está funcionando também. Eu não tenho o hábito de desistir do que comecei. Mas este erro me desequilibrou.
 
Vladislav Andruschenko:
Obrigado. Vou tentar descobrir onde estava meu erro. Enquanto isso, o carro alegórico está funcionando. Eu não estou acostumado a desistir. Mas este erro me fez passar por um loop.
Depende de você, mas note que TODAS as funções matemáticas padrão trabalham com números o dobro e produzem resultados o dobro. A aplicação destas funções aos números flutuantes produz conversão interna para o dobro, de modo que você perderá precisão e validade dos resultados de qualquer maneira.

Pessoalmente, nunca uso nos cálculos e comparações de números o método que compara a diferença com algum valor mínimo aceito, sempre trabalho com a máxima precisão possível até o 16º sinal, e somente na última operação faço a normalização. Se você manejar o dobro corretamente, não há problema, o que aconselho a fazer, caso contrário você encontrará problemas de distorção dos resultados associados a uma perda de precisão em uma das etapas dos cálculos / conversões.
 
Andrey Dik:
Depende de você, mas note que TODAS as funções matemáticas padrão funcionam com números duplos e dão resultados duplos. A aplicação destas funções aos números flutuantes ainda é uma conversão interna para o dobro, portanto, em qualquer caso, você perderá precisão e validade nos resultados obtidos.

Pessoalmente, nunca uso nos cálculos e comparações de números o método que compara a diferença com algum valor mínimo aceito, sempre trabalho com a máxima precisão possível até o 16º sinal, e somente na última operação faço a normalização. Se você trabalhar com o dobro corretamente, não haverá problemas, o que aconselho a fazer, caso contrário você encontrará problemas de distorção dos resultados associados a uma perda de precisão em uma das etapas dos cálculos / conversões.
Obrigado por sua resposta abrangente.
 

o preço de classificação em 2017 é sem dúvida correto

não são as traças, é o esterco...

 
Mikhail Dovbakh:

o preço de classificação em 2017 é sem dúvida correto

Diga-nos.
 

é assim que deve ser

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

deveria ser assim.

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


Você mudou seu código várias vezes.

Eu fiz a mesma coisa. Eu experimentei, eu entendi o que são o dobro e a int, mas quando eu o calculei explicitamente, eu percebi a coisa errada.

A primeira linha é o que você sugeriu.

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
 

então é isso mesmo105143.5000000000 arredondado para baixo 43 é...

(46-41)/2 = 2,5, arredondado para baixo = 2

 
Taras Slobodyanik:

então está certo105143.5000000000 arredondado para 43...

(46-41)/2 = 2,5, arredondado para baixo = 2


isso mesmo,

mas com spreads diferentes (2,3,4,5,6,7) o arredondamento para baixo é diferente e às vezes não é muito preciso.

 
Verificado de 0 a 8, tudo está bem...