Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 05.08.2019, 03:48   #1
Wayfarer_
Новичок
Джуниор
 
Регистрация: 05.08.2019
Сообщений: 1
Вопрос сломался оператор или я?

в конечном итоге должна вывести значения beta, y, t1,E именно в том случае когда E равно y.
P.S Там есть равные числа E и y, я проверял вручную.
все работает, НО, когда я пишу if на выводе ничего нет, хотя ответ есть.
Помогите.
Код:
#include <iostream>
#include <math.h>
using namespace std;

int main() {

	int k = 25;
	double h = 7.02716;

	int V_0 = 600;
	int g = 980;
	const double pi = 3.14159265359;
	double alpha_1;
	cout << "Введите alpha_1 :";
	cin >> alpha_1;
	double alpha_2 = asin((sin(alpha_1) / (k * sqrt(1 - ((2 * g * h) / (pow(V_0, 2) * pow(cos(alpha_1), 2)))))));
	double Z_01 = 0.68606;
	double d = 0.56;
	double Z_02 = Z_01 - d;

	double V_max = sqrt(pow(V_0, 2) + 2 * g * h);
	double l = h - Z_02;

	double V_y1 = V_0 * sin(alpha_1);
	double V_y2 = V_max * sin(alpha_2);
	double T1 = (-1 * (V_0)* cos(alpha_1) + sqrt((pow(V_0, 2) * pow(cos(alpha_1), 2) + 2 * g * Z_01))) / g;
	double T2 = ((V_max)* cos(alpha_2) - sqrt((pow(V_max, 2) * pow(cos(alpha_2), 2) - 2 * l * g))) / g;

	double y1 = V_y1 * T1;
	double y2 = V_y2 * T2;
	double y = y1 - y2;

	cout << "t1 = " << T1 << endl;
	cout << "t2 = " << T2 << endl;
	cout << "y1 = " << y1 << endl;
	cout << "y2 = " << y2 << endl;
	cout << "y = " << y << endl;

	////////////////////////////////

	cout << "B " << endl;
	//double betta = atan((V_0 * sin(alpha_1)) / (V_0 * cos(alpha_1) + g * T1));
	for (double beta = 0.20943951023931956; beta > 0.19198621771937624; beta -= 0.000001745329251943296) {

		long double t1 = (sqrt(pow(V_0, 2) + 2 * g * Z_01) * cos(beta) - sqrt((pow(V_0, 2) + 2 * g * Z_01) * pow(cos(beta), 2) - 2 * g * d)) / g;
		long double E = sqrt(pow(V_0, 2) + 2 * g * Z_01) * sin(beta) * t1;
		if ( E == y) {
			//cout << "t = " <<t1 <<"E = "<< "beta = " << beta << endl;
			cout << "beta = " << beta << "  t = " << t1 << "  E = " << E << "   y = " << y << endl;
		}
	}
			

	
}

Последний раз редактировалось BDA; 05.08.2019 в 04:25.
Wayfarer_ вне форума   Ответить с цитированием
Старый 05.08.2019, 04:01   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,542
По умолчанию

Значения double, да ещё полученные в результате вычислений, категорически не рекомендуется проверять на равенство. Ошибка где-нибудь в последнем разряде даст несравнение. Проверяйте на малость абсолютную величину разности
Black Fregat вне форума   Ответить с цитированием
Старый 06.08.2019, 14:52   #3
ezus
Пользователь
 
Регистрация: 08.05.2009
Сообщений: 58
По умолчанию

Лучше проверку выполнять не на абсолютную разность, а на относительную. Тогда нет зависимости от порядка чисел.
ezus вне форума   Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DNS сломался jura_k Общие вопросы Web 0 13.11.2018 19:59
Блог сломался rrrFer Обсуждение статей 7 06.01.2015 22:29
Цикл For сломался weech Общие вопросы Delphi 6 24.11.2014 17:12
wpf, сломался ресайз окна stupidboy WPF, UWP, WinRT, XAML 1 19.10.2011 18:50