Значение переменной -nan(ind) - страница 2

 
Vitalii Ananev:

Не с точностью double в mql все нормально. Это уже мой косяк. Не учел особенности используемой функции. Функция график которой выглядит как гипербола от -1.0 до 1.0. Я хочу на выходе получить -1.0 и запускаю процесс подбора коэффициентов, но не учел особенности этой функции. На самом деле функция ни когда не достигает -1.0 или 1.0, а только стремится к ним. В результате получается что то типа -0.999999999999999999(9) , число превышающие максимально допустимую точность числа типа double.  

Выход за пределы точности не даст NaN.

double d = 0.9;
d += 0.09;
d += 0.009;
d += 0.0009;
...

isnan(d); // false
isinf(d); // false

Можно получить inf при переполнении экспоненты дабла, и дальнейшие действия с бесконечностью уже могут дать nan (0*inf, inf/inf, ...). Но переполнить экспоненту - это надо очень постараться -307 <= exp <= 308.

 
Vict:

Выход за пределы точности не даст NaN.

Можно получить inf при переполнении экспоненты дабла, и дальнейшие действия с бесконечностью уже могут дать nan (0*inf, inf/inf, ...). Но переполнить экспоненту - это надо очень постараться -307 <= exp <= 308.

Долго ли умеючи. :)

функция  Y = F(X) = (Exp(X)-Exp(-X))/(Exp(S)+Exp(-X))  меняя X можно получить Y. Я в коде подбираю такой X что бы в результате Y был равным -1. Но функция ни когда не достигает абсолютно точного значения -1. В результате X стремится к минус бесконечности, а Y приближается к -1. А условие завершения цикла Y=-1. Если использовать округление до все нормально работает.

 

Решение проблемы очень простое:

Находим переменную в алгоритме где раньше всего замечено значение -nan(ind) 

с помощью функции Print() и просмотра логов.

Потом после переменной делаем в коде так:   NormalizeDouble(переменная,10);

И проблема испаряется.


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