Как избавиться от ошибки деления на 0?

 
Добрый день, возникла проблема mql4 не правильно расчитывает формулу :
1/MathPow(2.71,x) выдает ошибка деления на 0. Но насколько я помню со школьной программы такого быть не может)
 
Александр Алексеевич:
Добрый день, возникла проблема mql4 не правильно расчитывает формулу :
1/MathPow(2.71,x) выдает ошибка деления на 0. Но насколько я помню со школьной программы такого быть не может)

Ну, например:

(MathPow(2.71,INT_MIN)==0.0)==true
double - это 64 бита записанных по стандарту IEEE 754 и получить там 0.0 при вычислениях, ни разу не сложно. Математика вообще и математика, применимая к числам с плавающей точкой в представлении "железки" - это несколько разные виды математики))). Вместо INT_MIN, -1000 - вполне достаточно)))
 
Vladimir Simakov:

Ну, например:

double - это 64 бита записанных по стандарту IEEE 754 и получить там 0.0 при вычислениях, ни разу не сложно. Математика вообще и математика, применимая к числам с плавающей точкой в представлении "железки" - это несколько разные виды математики))). Вместо INT_MIN, -1000 - вполне достаточно)))
Извиняюсь) вчера с телефона писал))), там вот какая формула:    
   Out=1/(1+1/(MathPow(2.71,x)));

   да но вот тут:
(MathPow(2.71,INT_MIN)==0.0)==true

в какую степень возведется число 2.71?

По факту можно изменить вот эту часть 

1/(MathPow(2.71,x)) на exp(-x)

но и так при выполнении дает деление на ноль.

 
Александр Алексеевич:
Извиняюсь) вчера с телефона писал))), там вот какая формула:    
   да но вот тут:

в какую степень возведется число 2.71?

По факту можно изменить вот эту часть 

но и так при выполнении дает деление на ноль.

INT_MIN, с утра еще, был равен (int)0xFFFFFFFF, что в переводе на человеческий: -2147483648
 

код как он есть, весь, методом copy-paste приведите пожалуйста. Чтобы точно не было опечаток и zero-divide был именно в указанном месте и можно было проверить.

 

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


Или вопрос чисто академический?

 
Ihor Herasko:

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


Или вопрос чисто академический?

вопрос в том что, в mql4 стандартная функция 

exp(-x)

где x это любое число типа double, выдает ошибку zero divide. если читать доки по mql, то функция 

double  MathExp( 
   double  value      // степень для числа e 
   ); 
а если степень с минусом, тогда там расчет идет через деление, т.е получается что експонента в какой-то степени при расчете дает 0, из-за округления.
 
Maxim Kuznetsov:

код как он есть, весь, методом copy-paste приведите пожалуйста. Чтобы точно не было опечаток и zero-divide был именно в указанном месте и можно было проверить.

double func(double x)
  {
   double Out;
   Out=1/(1+1/(MathPow(2.71,x)));
   return(Out);
  }
получается что 2.71^x=0, из-за округления, если изменить код на:
double func(double x)
  {
   double Out;
   Out=1/(1+exp(-x));
   return(Out);
  }
результат такой же.
 
Александр Алексеевич:
получается что 2.71^x=0, из-за округления, если изменить код на: результат такой же.

и получается что при каком-то значении Х, експонента в степени -Х равна 0. отсюда и ошибка, а как поправить хз. так как mql округляет просто до 0, 

NormalizeDouble()

то же не помогает.

 

как вариант попробуйте заменить 1 на 1.0

в MQL иногда приведение типов double к int бывает неожиданным

double func(double x)
  {
   double Out;
   Out=1.0/(1.0+1.0/(MathPow(2.71,x)));
   return(Out);
  }
 
и еще проблема 
double func(double x)
  {
// 
   double Out;
   Out=NormalizeDouble(1/(1+exp(-x)),5);
   Print("OUT=  ",Out);
   return(Out);
  }

если в функцию подаем значение равное 48, Out = 1, если подать -12,23 Out=0, вот как так то?

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