Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

Cheshire Знаток (321), закрыт 1 год назад
#include <iostream>
#include <iomanip>
#include <math.h>
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 << setw(10) << "x" << setw(10) << "y" << setw(10) << "z" << endl;
std::cout << fixed << setprecision(4);
x = xn;
do {
y = yn;
do {

if (z1 > z2) z = z1;
else z = z2;
cout << setw(10) << x << setw(10) << y << setw(10) << z << endl;
y += 0.8;
} while (y <= 3.4);
x += 0.6;
} while (x <= 1.8);
return 0;
}
Лучший ответ
Сергей Гений (58913) 2 года назад
У вас некоторые переменные из формулы не инициализированы. Например х и y. Если в y будет ноль, то выражение x/y вернет nan и эта ошибка передастся дальше по цепочке. То же касается тригонометрических функций.
CheshireЗнаток (321) 2 года назад
как её инициализировать?
СергейГений (58913) 2 года назад
ну хотябы ввести с клавиатуры перед основной формулой.
cin >> x >> y;
Компилятор обычно предупреждает, если есть неиспользованные или не инициализированные переменные чтобы не возникало ошибок.
Остальные ответы
Def Гений (55686) 2 года назад
Потому что переменная неинициализирована. Как исправить: 1). всегда инициализировать все переменные, которые можно инициализировать хотя бы дефолтными или нулевыми значениями. 2). Не пытаться использовать значения из неинициализированных переменных.
СергейГений (58913) 2 года назад
if (z1 > z2) z = z1;
else z = z2; так что z инициализируется
Def Гений (55686) Сергей Степанов, да, тут тяжёлый клинический случай. Ок, попробуем по шагам. 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;
СергейГений (58913) 2 года назад
Вы похожи на врача, который даже не глядя на пациента ставит диагноз.
Новичек - почему в z - мусор?
Профессор - вы не инициализировали переменную.
Новичек - как же, вот z =...
Профессор да не эту, другую.
Можно же было просто сказать - x забыли инициализировать.
И добавить что переменные не инициализируются через запятую.
Полосатый жираф Алик Искусственный Интеллект (313060) 2 года назад
Вот видно же, если x / y по абсолютной величине больше 1, то получишь такой результат. Проверяй перед вычислением!
Не бывает углов с косинусом больше 1!!!
Похожие вопросы