Ошибка zero divide. Помогите исправить!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Timur1988
253
Timur1988  
Здравствуйте! Написал индикатор, который показывает корреляцию по Пирсону. На таймфреймах M30 и ниже выдает ошибку zero divide. Как исправить?
for(int i=bar; i<n; i++)
      {
      for(int k=1; k<m; k++)
         {
         /*для первого символа*/
         close_x[i][k]=iClose(symbol_x, period, i+k-1);           //объявление элементов в каждом измерении: сначала [1,1], затем [1,2], [1,3]...[1,m], [2,1], [2,2]...[n,m]
         sum_x[i]+=close_x[i][k];                                 //считаем сумму значений элементов к каждом измерении [1,1]+[1,2]+[1,3]=
         /*для второго символа*/
         close_y[i][k]=iClose(symbol_y, period, i+k-1);              
         sum_y[i]+=close_y[i][k];
         }

      M_x[i]=sum_x[i]/(m-1);                                      // находим среднее арифметическое среди m-1 элементов в измерении i
      M_y[i]=sum_y[i]/(m-1); 
      
      for(int k=1; k<m; k++)
         {
         /*1*/
         D_x[k]=close_x[i][k]-M_x[i];                             // находим отклонение от среднего ариф элемента к в измерении i
         D2_x[k]=(D_x[k]*D_x[k]);                                 // квадрат этого отклонения
         /*2*/
         D_y[k]=close_y[i][k]-M_y[i];
         D2_y[k]=(D_y[k]*D_y[k]);
         
         D_xy[k]=D_x[k]*D_y[k];                                   // произведение отклонений элементов символов x и y
         ED_xy[i]+=D_xy[k];                                       // сумма этих произведений
         ED2_x[i]+=D2_x[k];                                       // сумма квадрата отклонений символа x
         ED2_y[i]+=D2_y[k];                                       //.................................. y
         Koef[i]=ED_xy[i]/sqrt(ED2_x[i]*ED2_y[i]);                // коэф корреляции Пирсона начиная с i измерения среди m-1 баров
ошибка в последней строчке: при M30  знаменатель sqrt(ED2_x[i]*ED2_y[i]) = 0. Why??????????????
Konstantin Erin
2162
Konstantin Erin  
Timur1988:
Здравствуйте! Написал индикатор, который показывает корреляцию по Пирсону. На таймфреймах M30 и ниже выдает ошибку zero divide. Как исправить?
ошибка в последней строчке: при M30  знаменатель sqrt(ED2_x[i]*ED2_y[i]) = 0. Why??????????????

Помогаю. Рядом тема: Индикатор не отображается на графике помогите разобраться

Там показал, как это исправляется
Timur1988
253
Timur1988  
STARIJ:

Помогаю. Рядом тема: Индикатор не отображается на графике помогите разобраться

Там показал, как это исправляется

Я правильно понял, что нужно добавить некоторое значение в числитель?

Sergey Kolemanov
1019
Sergey Kolemanov  
Timur1988:
Здравствуйте! Написал индикатор, который показывает корреляцию по Пирсону. На таймфреймах M30 и ниже выдает ошибку zero divide. Как исправить?
ошибка в последней строчке: при M30  знаменатель sqrt(ED2_x[i]*ED2_y[i]) = 0. Why??????????????

Ошибка zero divide это деление на 0. Замените строку 

Koef[i]=ED_xy[i]/sqrt(ED2_x[i]*ED2_y[i]);                // коэф корреляции Пирсона начиная с i измерения среди m-1 баров

на

if(sqrt(ED2_x[i]*ED2_y[i]) != 0)Koef[i]=ED_xy[i]/sqrt(ED2_x[i]*ED2_y[i]); else Koef[i]= 0.0;               // коэф корреляции Пирсона начиная с i измерения среди m-1 баров

Вообще , там где происходит деление и знаменатель явно не определён , нужно его проверять.

Timur1988
253
Timur1988  

Спасибо, товарищи! Выручили!
*проверял по отдельности значение ED2_x[i], ED2_y[i] и sqrt(ED2_x[i]*ED2_y[i]) - везде значение, отличное от нуля. буду знать теперь, что делать в таких ситуациях!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий