:) ... Осторожно ! Ошибки в МТ ( достало - Проложение II ) Уже смешно. :)

 

Продолжение про ошибки.... Господа разработчика, эта ошибка уже системная, так сказать!!! ... Не обижайтесь, ладно.

И ордера не модифицировать типа ошибка 1 вылазает и пр.

Вот сообственно о чем я веду речь...

Сделайте скрипт и удивитесь.

void ErrorDemo1 ( )
{
   double d;
   int i,i2,i3;
   
   d=0.0;

   int ErrorCount=0;
   int TotalTry=17000;
   
   for ( int j=0; j<TotalTry; j++ ){
      
      i  = d/Point; 
      i2 = (i*Point)/Point;
      
      i3 = i - i2;
   
      if ( i3 != 0 ){
         Print("d:",d,",ОШИБКА:",i3,"(",i3*Point,")");
         ErrorCount++;
      }

      
      /*
      
      // ниже тоже ошибка точности но "эта" ошибка просто фигня по сравнению  с верхней!!! :)) 
      
      double d2;
      double d3;
      double d4;

      d2 = i;   
      d2 = d2*Point;

      d3 = d2 - d;
      d4 = d3 * MathPow(10,20);
      
      if ( d3 != 0.0 ){
         Print("-d:",DoubleToStr(d,33),",i:",i,",d2:",DoubleToStr(d2,99),",Ошибка:",DoubleToStr(d4,15),"*1.E20");
      }
      else {
         Print("+d:",DoubleToStr(d,33),",i:",i,",d2:",DoubleToStr(d2,99));  
      }
      
      */
      
      
      
      d+=Point   ;
   }   
   
   Print("TotalTry:",TotalTry,",ErrorCount:",ErrorCount);

}
 
да чем дальше в лес тем толще партизаны, у меня глюк такой 4 терминала стоят и на всех такая фигня открыто например в окне котировок 3 пары gbpusd gbpchf и usdjpy хочу подгрузить например котировки audcad вызываю свойства нажимаю показать audcad - все показал в окне котировок. Теперь открываем график audcad и че мы видим а видим то что график то не audcad а eurusd :))) пробуем торговать - на этом графике евро а сделки прут по audcad :)))) глюки - они заполонили всю планету (с)
 
MProgrammer:

Продолжение про ошибки.... Господа разработчика, эта ошибка уже системная, так сказать!!! ... Не обижайтесь, ладно.

И ордера не модифицировать типа ошибка 1 вылазает и пр.

Вот сообственно о чем я веду речь...

Сделайте скрипт и удивитесь.

Вставьте округление, чтобы не наступать на грабли, которые сами подложили :)

      i  = MathRound(d/Point);             
      i2 = MathRound((i*Point)/Point);

Это в теории от перестановки операций результат не меняется, в реальном мире вычисления вещественных чисел на компьютере всегда будет иметь небольшую погрешность. Эта погрешность может накапливаться и давать такие "чудеса".

 
Rosh:
MProgrammer:

Продолжение про ошибки.... Господа разработчика, эта ошибка уже системная, так сказать!!! ... Не обижайтесь, ладно.

И ордера не модифицировать типа ошибка 1 вылазает и пр.

Вот сообственно о чем я веду речь...

Сделайте скрипт и удивитесь.

Вставьте округление, чтобы не наступать на грабли, которые сами подложили :)

      i  = MathRound(d/Point);             
      i2 = MathRound((i*Point)/Point);

Это в теории от перестановки операций результат не меняется, в реальном мире вычисления вещественных чисел на компьютере всегда будет иметь небольшую погрешность. Эта погрешность может накапливаться и давать такие "чудеса".

Да!

тут речь не о ошибке округления а об ошибке в ОДИН пункт... Или 0.0001 цены... 0.0001 это не ошибка которой можно принебречь -- с этим надо что-то делать...

Запустите скрипт посмотрите ... на 17000 пунктов где то 200 ошибок. Попробуйте.

 
MProgrammer:

Да!

тут речь не о ошибке округления а об ошибке в ОДИН пункт... Или 0.0001 цены... 0.0001 это не ошибка которой можно принебречь -- с этим надо что-то делать...

Запустите скрипт посмотрите ... на 17000 пунктов где то 200 ошибок. Попробуйте.


Я пробовал. После вставки округления - ноль ошибок.

 
int i,i2,i3;
...

i  = d/Point;
...

Другими словами:

int i = double D/ Point;

значение Point обычно тоже double

 
D500_Rised:
int i,i2,i3;
...

i  = d/Point;
...

Другими словами:

int i = double D/ Point;

значение Point обычно тоже double

Скажите, а можно чтобы было еще смешнее еще сразу и выводы писать... ?

 

MProgrammer, Вы же профессиональный программист.




Разве Вы не замечаете что при вычислении целого числа i в Вашем коде используются два числа с типом double?




Уж как ни Вам не знать, что это ведет к потерям точности и конечно же ошибкам вычислений в результате?

А смысл вот этого цикла имеет сакральный смысл? :


for ( int j=0; j<TotalTry; j++ ){
      
      i  = d/Point; 
      i2 = (i*Point)/Point;
      
      i3 = i - i2;
   
      if ( i3 != 0 ){
         Print("d:",d,",ОШИБКА:",i3,"(",i3*Point,")");
         ErrorCount++;
      }

Ведь кроме ErrorCount, там больше ничего не меняется, при изменении j.



Для примера скрипт, с наглядным примером. Думаю, разберетесь...


int start()
{
int x,y;//!!!
double q;
int a=5;
int b=10;
double c=0.24;
double d=0.4;
x=b/a;
y=c/d;// !!!
q=c/d;// !!!

Print(x," ",y," ",q);

return(0);
}

 
D500_Rised:


Ведь кроме ErrorCount, там больше ничего не меняется, при изменении j.



Там в цикле d меняется - комменты и оператор за ними - часть цикла.

Успехов.

 
VladislavVG:
D500_Rised:


Ведь кроме ErrorCount, там больше ничего не меняется, при изменении j.



Там в цикле d меняется - комменты и оператор за ними - часть цикла.

Успехов.

Если не затруднит, укажите где именно в приведенном цикле происходит изменение переменной d.

Вероятно, мой браузер не может отобразить эту фантомную часть кода, строка


 d+=Point   ;

находится вне тела цикла.

 
D500_Rised:

 d+=Point   ;

находится вне тела цикла.

Да вроде в цикле...

Ведь в самом цикле есть еще одна открывающая скобка:

if ( i3 != 0 ){
Причина обращения: