Пресловутая ошибка Zero divide - страница 2

 
double SafeCrossEntropy( double T, double Z ){
//--------------------------------------------
   double Result, R;
//--------------------------------------------
//   Print("Процедура проверки порогов.");
//--------------------------------------------
   if( T==0 )
      return(0);
   else {
      if( MathAbs(Z)>1 )
// Shouldn//t be the case with softmax,
// but we just want to be sure.
         if( T/Z==0 )
            R = MathPow(0.1,300);     // MinRealNumber;
         else
            R = MathAbs(T/Z);
      else 
// В нормальном случае
         if( (Z==0) || (MathAbs(T)>=MathPow(10.0,300)*MathAbs(Z)) )  // MaxRealNumber*MathAbs(Z) )
            R = MathPow(10.0,300);                                   // MaxRealNumber;
         else
            R = MathAbs(T/Z);
       Result = T*MathLog(R);          // MathLog(R);
   }
   return(Result);
}

Вместо выделенного текста можете смело написать: if( false )
Результат не изменится. 
Если Т или Z - вычисляемые параметры, то, соответственно,  T==0 и Z==0 также тождественны false. 
 
Kadet:

Та то, что это деление на ноль - это и коню понятно.

Не понятно откуда оно берётся, ведь при малых объёмах данных его нет, а как только задашь в работу 20-30 рабочих индикаторов - так и выскакивает.

При 10-15 индикаторах - великолепно работает, но хочется более точных прогнозов. Вот и пытаюсь задать больше вариантов.

К тому же if-ы перед всеми возможными делениями - пробовал. Не помогло. И нормализацию пробовал. Тоже не помогло.

Вот подозреваю вот это место, при расчёте логарифма. Там используются максимально большие и минимально малые значения (таких два куска симметричных за исключением мелочей), которые, возможно, из-за нехватки разрядности и представляются как "0". Может они и вылетают как "0", хотя не должны.

А за идею с print-ами большое спасибо. Сам её частенько использую, а тут что-то не догадался.


   if( T==0 )
      return(0);
   else {
      if( MathAbs(Z)>1 )
// Shouldn//t be the case with softmax,
// but we just want to be sure.
         if( T/Z==0 )
            R = MathPow(0.1,300);     // MinRealNumber;

Условие T/Z==0 всегда false.

См. выше по цепочке условий: если T!=0, если |Z|>1, то T/Z всегда != 0

 

вот тут лажа

        R = MathPow(10.0,300);                                   // MaxRealNumber;
         else
            R = MathAbs(T/Z);
 

думаю проще через Ctrl+F найти все "/" и сделать ф-цию вида:

double division(double X,double Y){
   if(Y==0){Print("деление на ноль");return(0.000000000000001);}
return(X/Y);
}

логические ошибки не уйдут, но ошибки в ходе исполнения будут видны и работоспособность кода не будет утеряна

 
IgorM:

думаю проще через Ctrl+F найти все "/" и сделать ф-цию вида:

логические ошибки не уйдут, но ошибки в ходе исполнения будут видны и работоспособность кода не будет утеряна

imho, нечто вроде повязки счастья на глазах. Препятствует падению в пропасть, но не развивает навыка подниматься.
 
tara:
imho, нечто вроде повязки счастья на глазах. Препятствует падению в пропасть, но не развивает навыков подниматься.

:D

сознаюсь - грешен не проверяю в своих кодах такие ошибки, НО к счастью не помню на своей памяти за последние годы появления такой ошибки, возможно все дело в том, что я ВСЕГДА проверяю исходные данные, и в зависимости от задачи, привожу исходные данные в соответствие, для исторических данных у меня это предыдущее ненулевое знаечние

Причина обращения: