Cтранное число

 

Приветствую.

Получаю странные числа, типа таких: -1.#INF0000, или -6015049850928292200000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00000000

Из-за чего они могут получатся? Прога работает с числами типа double. Выводить в лог проблематично, так как выполняются очень большие циклы, и в каком месте появляется ошибка выявить не возможно. Кто что скажет?

Подобная тема Странные числа . Но там результаты не были оглашены.


 
joo >>:
При выполнении недопустимой операции, переполнении и проч. результат просто становится "не числом" - INFINITY или NAN.

скорее всего присутствует деление на ноль в коде.

 
Swan >>:
При выполнении недопустимой операции, переполнении и проч. результат просто становится "не числом" - INFINITY или NAN.

скорее всего присутствует деление на ноль в коде.

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

 

Во первых, удостоверьтесь, что все переменные инициализируются перед использованием (перед чтением обязательно произведено явное присваивание значения). Если это не поможет - проверяйте операции типа возведения в степень и логарифмирования. Ещё проверяйте сглаживание типа EMA.

Если вычислений много - прикидывайте допустимые диапазоны значений переменных; если значения не попадают в нужные диапазоны - выводите содержимое всех переменных в лог (или записываете в файл) и анализируете вручную.

 
lea >>:

Мне хотелось бы, а также захочется тем, кто столкнется с этой проблемой, знать точно - из-за чего может возникнуть такая ситуация. Не предположения, а конкретная причина. Может разработчики или админы помогут?

 

Попробуй проводить деление вот этой функцией. Она готовит обратное число, после чего делимое умножается на это обратное число.


/*///01~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 деление с проверкой, деление заменяется умножением на обратное число
/*///01~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
double ox( double x)
{//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 double y=0;
 if(x!=0.0) y=1.0/x; 
 else y= 1.0/MathPow(10.0,300);
return(y);
}//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


используется так:


int start()
{double a=3.0;
 double b=0.05;
 double c,d;
 //c=a/b;
 d=ox( b);
 c=a*d;
return(0);
}
 
joo >>:

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

Плохо, если нет.

чиста конкретно:) в результате вычислений получается значение минус бесконечность (-1.#INF)

 

А что вас не устраивает? в MQL числа представлены до MathPow(10,307) так что первое конечно в зашкал,

а второе вполне нормальное большое отрицательное число.

 

Проблема решена. Дело было не в делении, я говорил, что его нет. Происходило переполнение переменной.

Всем спасибо за участие.

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