Округление чисел в МТ4 через NormalizeDouble - страница 14

 

Сделал когда-то функции для округления снизу и сверху

Может кому-то поможет

//+------------------------------------------------------------------+
double RoundMax(double price,double symbol_point,int symbol_digits)
  {
   return(NormalizeDouble(price+MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits-1));
  }
//+------------------------------------------------------------------+
double RoundMin(double price,double symbol_point,int symbol_digits)
  {
   return(NormalizeDouble(price-MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits-1));
  }
//+------------------------------------------------------------------+
int MyK(double price,double symbol_point,int symbol_digits)
  {
   double tmp1=NormalizeDouble(price, symbol_digits);
   double tmp2=NormalizeDouble(price, symbol_digits-1);
   return((MathAbs(tmp1-tmp2)<symbol_point)?10:5);
  }
//+------------------------------------------------------------------+
 
Victor Nikolaev:

Сделал когда-то функции для округления снизу и сверху

Может кому-то поможет

Спасибо, возьму в коллекцию
 
lilita bogachkova:

попробуйте получить результат 0.99999999999999999

X = 0.99999999999999999

10*X = 10*0.99999999999999999 

10*X-X = 10*0.99999999999999999-0.99999999999999999

9*X = 9*0.99999999999999999

получим 9*X = 9 или X равен 1 (один) 

 v1 = (1/3) = 0.33333333 | v2 = 3*(1/3) = 1.00000000

 

или  0.99999999999999999 = 1.0

 v1 (1.00000000) >= 1.0

В данном случае  0.9999999999999999999999 представляет собой 1.0. Но задача стоит "отбросить", значит в результат должны быть девятки. 
 

Всем спасибо за полезную ветку!

Для себя выбрал решение округлять на 1 цифру больше через NormalizeDouble, а потом обрезать последнюю цифру. Пока что это полностью подходит. 

 

И снова про округление......

подскажите пожалуйста по ситуации (только не кидайте помидорами, я гуманитарий),

имеется такая переменная:

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

по идее delta изначально нормализирована,

OrderLots наверное должен возвращать нормализированные даблы,

но каким-то образом иногда в редких случаях я получаю числа вроде 2.775557561562891e-17

то есть это почти нуль но не нуль.......

первый вопрос - это нормально?

второй вопрос - как я понимаю мне достаточно будет вторую нормализацию чтобы хвостов не появлялось?

третий вопрос (предчувствую что я все равно не пойму, но все таки спрошу):

сложение двух нормализованных чисел может давать ненормализованное? 

P.S. прошу прощения что снова это поднимаю, но перечитывать снова всё это просто нет сил

 


 
transcendreamer:

И снова про округление......

подскажите пожалуйста по ситуации (только не кидайте помидорами, я гуманитарий),

имеется такая переменная:

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

по идее delta изначально нормализирована,

OrderLots наверное должен возвращать нормализированные даблы,

но каким-то образом иногда в редких случаях я получаю числа вроде 2.775557561562891e-17

то есть это почти нуль но не нуль.......

первый вопрос - это нормально?

второй вопрос - как я понимаю мне достаточно будет вторую нормализацию чтобы хвостов не появлялось?

третий вопрос (предчувствую что я все равно не пойму, но все таки спрошу):

сложение двух нормализованных чисел может давать ненормализованное? 

P.S. прошу прощения что снова это поднимаю, но перечитывать снова всё это просто нет сил

  1. Да.
  2. Да.
  3. Да.
 
fxsaber:
  1. Да.
  2. Да.
  3. Да.
спасибо
 
transcendreamer:

P.S. прошу прощения что снова это поднимаю, но перечитывать снова всё это просто нет сил

Лучше проверьте самостоятельно на разных примерах, это даст понимание.

Единственное, я делаю не так:

if(delta>0)

а так

if(delta>0.0)

для чисел double. Не знаю, имеет ли это на самом деле значение, но по моему варианту я ни разу не столкнулся с ошибкой (сравнивать стараюсь только одинаковые типы переменных). 

 
Andrey Dik:

Не знаю, имеет ли это на самом деле значение, но по моему варианту я ни разу не столкнулся с ошибкой (сравнивать стараюсь только одинаковые типы переменных). 

Не имеет.
 
Некоторые числа можно представить только в виде бесконечной дроби, например,  1/3 в десятичной системе. Но 1/3 имеет не является бесконечной дробью в третичной системе, там она == 0,1. Т.е. в разных системах счисления свои бесконечные дроби. Следовательно, небесконечная дробь в десятичной может быть таковой в двоичной. Например: 0.1, 0.2, 0.3, 0.4, ... не имеют точного представления в двоичном виде. Хоть десять раз вызовите NormalizeDouble, там будет либо 0.199999999..1, либо 0.200000...1. Не знаю, может является новостью.
Причина обращения: