Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2019, 02: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 в 03:25.
Wayfarer_ вне форума Ответить с цитированием
Старый 05.08.2019, 03:01   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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