Странности в расчетах ...

 

Проверял работу советника и наткнулся на странный результат вычислений. Для проверки написал простой скрипт: есть три числа, a, b, c, задача - сравнить разность a и b с разностью b и c. Нормализуем значения a, b, c для четырех знаков, вычисляем разности. Выводим на экран значения этих разностей, а также логическую "1", если разности одинаковые. Что имеем: обе разности одинаковы, но переменная k в комменте все время показывает "0", говоря о том, что они не равны. Не могу понять, в чем фишка ... Может у кого-то есть идеи на этот счет? Скрипт прилагаю.

//+------------------------------------------------------------------+
//|                                                     TestDiff.mq4 |
//|                      Copyright © 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+

int start()
{
   int k;
   double a = 1.36844455;
   double b = 1.36750246;
   double c = 1.36660756;
   double aa;
   double bb;
   double cc;
   double diff_1;
   double diff_2;



   
   aa = NormalizeDouble(a,4);
   bb = NormalizeDouble(b,4);
   cc = NormalizeDouble(c,4);
        
   diff_1 = aa - bb;
   diff_2 = bb - cc;
        
   if (diff_1==diff_2) k = 1;
   else k = 0;
      
   Comment(DoubleToStr(diff_1,4),"\n",
           DoubleToStr(diff_2,4),"\n",
           k);
   
   return;
}

На экране такая картинка:

 
FxRoller:

Проверял работу советника и наткнулся на странный результат вычислений. Для проверки написал простой скрипт: есть три числа, a, b, c, задача - сравнить разность a и b с разностью b и c. Нормализуем значения a, b, c для четырех знаков, вычисляем разности. Выводим на экран значения этих разностей, а также логическую "1", если разности одинаковые. Что имеем: обе разности одинаковы, но переменная k в комменте все время показывает "0", говоря о том, что они не равны. Не могу понять, в чем фишка ... Может у кого-то есть идеи на этот счет? Скрипт прилагаю.

На экране такая картинка:

Не стоит проверять переменные типа Double на равенство. Напиши условие например так:
if (diff_1 - diff_2 < 0.00001)
 
FxRoller:

Проверял работу советника и наткнулся на странный результат вычислений. Для проверки написал простой скрипт: есть три числа, a, b, c, задача - сравнить разность a и b с разностью b и c. Нормализуем значения a, b, c для четырех знаков, вычисляем разности. Выводим на экран значения этих разностей, а также логическую "1", если разности одинаковые. Что имеем: обе разности одинаковы, но переменная k в комменте все время показывает "0", говоря о том, что они не равны.

вам надо аналогично нормализовать и разности тоже

       
   diff_1=NormalizeDouble(aa-bb,4);
   diff_2=NormalizeDouble(bb-cc,4);
 

а так? )

//+------------------------------------------------------------------+
//|                                                     TestDiff.mq4 |
//|                      Copyright © 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+

int start()
{
   int k;
   double a = 1.36844455;
   double b = 1.36750246;
   double c = 1.36660756;
   double aa;
   double bb;
   double cc;
   double diff_1;
   double diff_2;



   
   aa = NormalizeDouble(a,4);
   bb = NormalizeDouble(b,4);
   cc = NormalizeDouble(c,4);
        
   diff_1 = NormalizeDouble(a-b,4);//- NormalizeDouble(b,4);
   diff_2 = NormalizeDouble(b-c,4);// - NormalizeDouble(c,4);
   Print(" "+diff_1+" "+diff_2);        
   if (diff_1==diff_2) k = 1;
   else k = 0;
      
   Comment(DoubleToStr(diff_1,4),"\n",
           DoubleToStr(diff_2,4),"\n",
           k);
   
   return;
}
 
sanyooooook:

а так? )



Спасибо, буду пробовать.
 
FxRoller:

Спасибо, буду пробовать.
уже проверено, работает )
 

И так, по ходу. Логическую проверку

   if (diff_1==diff_2) k = 1;
   else k = 0;

можно написать проще (k желательно сделать булевой - bool) :

   k = diff_1==diff_2;
Причина обращения: