Nan ind c как исправить
Перейти к содержимому

Nan ind c как исправить

  • автор:

Выдаёт -nan(ind) [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 2 года назад .

В двух идентичных примерах коды работают по разному:

double f2(int n, double a, int x) < a += sin(x * n); if (1 < n)< n--; f2(n, a, x); >else < return a; >> 

В данном случае выдаётся: -nan(ind)

void f3(int n, double a, int x) < a += sin(x * n); if (1 < n) < n--; f3(n, a, x); >else< cout > 

Здесь же ответ выдаётся правильный, хотя смысл решения тот же. Почему в пером случае в качестве ответа какая-то фигня. Функция вызывается со следующими параметрами: a = 0,n = 2,x = 2

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

Кто нибудь сталкивался с этим. В результате вычислений получил значение переменной -nan(ind).

Igor Zakharov 2019.04.18 12:24 #1
Vitalii Ananev :

Кто нибудь сталкивался с этим. В результате вычислений получил значение переменной -nan(ind).

nan это «не число»

ind — недействительное число

Vitalii Ananev 2019.04.18 12:38 #2
Igor Zakharov :

nan это «не число»

ind — недействительное число

Вычислял как раз числа. Видимо вышел за пределы допустимого размера числа.

Igor Zakharov 2019.04.18 12:39 #3
Vitalii Ananev :

Вычислял как раз числа. Видимо вышел за пределы допустимого размера числа.

В конце странички есть примеры, когда может вылезти

  • www.mql5.com

Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL5 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования. Константы с плавающей точкой.

Vitalii Ananev 2019.04.18 12:47 #4
Igor Zakharov :

В конце странички есть примеры, когда может вылезти

Nikolai Semko 2019.04.18 14:11 #5
есть простой способ проверить переменную double на предмет недействительного числа:
if (x!=x) Print («Error»);
Vitalii Ananev 2019.04.18 15:49 #6
Nikolai Semko :
есть простой способ проверить переменную double на предмет недействительного числа:
if (x!=x) Print(«Error»);

В статье по ссылке выше есть функция которая проверяет числа на действительность. Но мне это не поможет. 🙂 Ищу где ошибка в логике, которая приводит к такому результату. Решил полностью переписать этот кусок кода.

Nikolai Semko 2019.04.18 15:58 #7
Vitalii Ananev :

В статье по ссылке выше есть функция которая проверяет числа на действительность. Но мне это не поможет. 🙂 Ищу где ошибка в логике, которая приводит к такому результату. Решил полностью переписать этот кусок кода.

содержимое этой функции и есть return(x==x).

Эта проверка и позволяет поймать момент «ошибки». Это бывает не всегда ошибка, а просто причиной переполнения(нехватки точности) типа double.

Vitalii Ananev 2019.04.18 17:40 #8
Nikolai Semko :
содержимое этой функции и есть return(x==x).

Эта проверка и позволяет поймать момент «ошибки». Это бывает не всегда ошибка, а просто причиной переполнения(нехватки точности) типа double.

Да, я именно так и думал, что не хватило точности. Выводил отладочную информацию. В результате всех вычислений на N-ной итерации цикла число стало настолько маленькой, что привело к такому результату.

Maxim Kuznetsov 2019.04.18 19:03 #9
Vitalii Ananev :

Да, я именно так и думал, что не хватило точности. Выводил отладочную информацию. В результате всех вычислений на N-ной итерации цикла число стало настолько маленькой, что привело к такому результату.

операции с «очень маленькими» числами не должны приводить к NaN кроме некоторых специально оговоренных случаев.

вообще про NaN и необходимость следования в какой-то мере стандартам, давно-давно давал заявку в СД. Получил ответ » результат операций с NaN неопределён, заявка закрыта». Поэтому чуствительную математику с той поры считаю не-mql программами.

Vitalii Ananev 2019.04.19 05:27 #10
Maxim Kuznetsov :

операции с «очень маленькими» числами не должны приводить к NaN кроме некоторых специально оговоренных случаев.

вообще про NaN и необходимость следования в какой-то мере стандартам, давно-давно давал заявку в СД. Получил ответ » результат операций с NaN неопределён, заявка закрыта». Поэтому чуствительную математику с той поры считаю не-mql программами.

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

С чем связан вывод -nan(ind)?

Author24 — интернет-сервис помощи студентам

Ошибка -nan(ind) и nan
Доброго времени суток форумчане! Решаю задачу, в которой необходимо найти площадь треугольника по.

-nan(ind)
нужно вычислить значение функции, вроде сделал все проверки, но все равно при вводе отрицательного.

-nan(ind)
Что такое -nan(ind) и как это исправить? #define _CRT_SECURE_NO_WARNINGS #include <iostream>.

Ошибка -nan
#include "pch.h" #include <iostream> #include <math.h> using namespace std; int main()

Почему значение z выдаёт в виде -nan (ind) и как это исправить

#include
#include
#include
using namespace std;
int main()
double z, z1, z2, x, xn, xk, xh, y, yn, yk, yh, e = exp(1.0);
xn = 1; xk = 1.8; xh = 0.6; yn = 2.2; yk = 3.4; yh = 0.8; z1 = exp(2) * sqrt(log(pow(x, 4) + 2) / log(e)); z2 = x * acos(x / y);
std::cout std::cout x = xn;
do y = yn;
do

Лучший ответ

У вас некоторые переменные из формулы не инициализированы. Например х и y. Если в y будет ноль, то выражение x/y вернет nan и эта ошибка передастся дальше по цепочке. То же касается тригонометрических функций.

CheshireЗнаток (321) 2 года назад
как её инициализировать?
СергейГений (56618) 2 года назад

ну хотябы ввести с клавиатуры перед основной формулой.
cin >> x >> y;
Компилятор обычно предупреждает, если есть неиспользованные или не инициализированные переменные чтобы не возникало ошибок.

Остальные ответы

Потому что переменная неинициализирована. Как исправить: 1). всегда инициализировать все переменные, которые можно инициализировать хотя бы дефолтными или нулевыми значениями. 2). Не пытаться использовать значения из неинициализированных переменных.

СергейГений (56618) 2 года назад
if (z1 > z2) z = z1;
else z = z2; так что z инициализируется

Def Просветленный (37384) Сергей Степанов, да, тут тяжёлый клинический случай. Ок, попробуем по шагам. 1. Объявляется пучок неинициализированных переменных double z, z1, z2, x. // Переменная x неинициализирована 2. Проводятся вычисления с неинициализированными переменными z1 = exp(2) * sqrt(log(pow(x, 4) + 2) / log(e)); z2 = x * acos(x / y); // Переменные z1 и z2 неинициализированы — в них записан мусор 3. Инициализируется x: x = xn; // От того, что x инициалиализирована, переменные z1 и z2 никак не станут инициализированными. 4. Переменной z присваивается неинициализированный мусор if (z1 > z2) z = z1; else z = z2;

СергейГений (56618) 2 года назад

Вы похожи на врача, который даже не глядя на пациента ставит диагноз.
Новичек — почему в z — мусор?
Профессор — вы не инициализировали переменную.
Новичек — как же, вот z =.
Профессор да не эту, другую.
Можно же было просто сказать — x забыли инициализировать.
И добавить что переменные не инициализируются через запятую.

Вот видно же, если x / y по абсолютной величине больше 1, то получишь такой результат. Проверяй перед вычислением!
Не бывает углов с косинусом больше 1.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *