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

 
Andrey Dik:
float это кастрация чисел не дающая никаких преимуществ. Лучше разберитесь со всеми потерями в преобразованиях и используйте наивысшую из возможных точностей - double.
Спасибо. Попробую все таки разобраться где у меня была ошибка. А пока float работает тьфу тьфу. Не привык бросать начатое. Но эта ошибка вывела меня из колеи. 
 
Vladislav Andruschenko:
Спасибо. Попробую все таки разобраться где у меня была ошибка. А пока float работает тьфу тьфу. Не привык бросать начатое. Но эта ошибка вывела меня из колеи. 
Дело конечно хозяйское, но обратите внимание на то, что ВСЕ стандартные математические функции работают с числами double и выдают результат double. Применяя эти функции к числам float происходит всё равно внутреннее преобразование к double, так что в любом случае будете терять в точности, достоверности в полученных результататов.

Лично я никогда не использую в вычислениях и при сравнении чисел приёмы сравниявая разность с каким то минимальным принятым значением, всегда работаю с максимально возможной точностью вплоть до 16-го знака, и только в самой последней операции делаю нормализацию. При правильном обращении с double проблем не возникает, чего и Вам советую делать, иначе будете сталкиваться с трудно уловимыми проблемами в искажении результатов связанных с потерей точности на каком то из шагов вычислений/преобразований.
 
Andrey Dik:
Дело конечно хозяйское, но обратите внимание на то, что ВСЕ стандартные математические функции работают с числами double и выдают результат double. Применяя эти функции к числам float происходит всё равно внутреннее преобразование к double, так что в любом случае будете терять в точности, достоверности в полученных результататов.

Лично я никогда не использую в вычислениях и при сравнении чисел приёмы сравниявая разность с каким то минимальным принятым значением, всегда работаю с максимально возможной точностью вплоть до 16-го знака, и только в самой последней операции делаю нормализацию. При правильном обращении с double проблем не возникает, чего и Вам советую делать, иначе будете сталкиваться с трудно уловимыми проблемами в искажении результатов связанных с потерей точности на каком то из шагов вычислений/преобразований.
Спасибо за развернутый ответ.
 

цена рейтинга в 2017 непричесанно верна  

 это не молью, а навозом...

 
Mikhail Dovbakh:

цена рейтинга в 2017 непричесанно верна  

 

Расскажите. 
 

вот так должно быть

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


 

 
Taras Slobodyanik:

вот так должно быть

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


 

Вы поменяли свой код несколько раз.

Я точно также делал. эксперементировал, понимая, что такое double и int но при явных вычислениях получал не то что нужно .

 первая строчка то что ВЫ предложили 

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
 

так всё верно 105143.5000000000  округляется вниз 43 получается... 

(46-41)/2=2,5 , округляем вниз = 2

 
Taras Slobodyanik:

так всё верно 105143.5000000000  округляется вниз 43 получается... 

(46-41)/2=2,5 , округляем вниз = 2

 


эт да,  

но при разных спредах (2,3,4,5,6,7) округление вниз - разное и иногда не совсем точное. проблема в этом.  

 
проверил от 0 до 8 всё ок...