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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2020, 10:39   #1
Ленащщ
Новичок
Джуниор
 
Регистрация: 20.10.2018
Сообщений: 16
Восклицание Как правильно вывести результат

Решение дифференциального уравнения методом Эйлера-Коши
Не могу понять, как правильно вывести результат
Код:
double func(double x, double y) 
{
    if (((pow(y, 3) + x + 1))!= 0)
        return (3 * pow(y, 2)) / (pow(y, 3) + x + 1);
}
 
int main()
{
    double x0, y0, xn;
    setlocale(0, "");
    cout << "х0=";
    cin >> x0;
    cout << endl;
    cout << "y0=";
    cin >> y0;
    cout << endl;
    cout << "xn=";
    cin >> xn;
    cout << endl;
 
    const int n = 10;   
    double h = (xn - x0) / n;
    double X[(int)n];
    double Y1[(int)n];
    double Y[(int)n];
 
    X[0] = x0; Y[0] = 1;
    for (int i = 1; i <= n; i++) 
    {
        X[i] = x0 + i * h;
        Y1[i] = Y[i - 1] + h * func(X[i - 1], Y[i - 1]);
        Y[i] = Y[i - 1] + h * (func(X[i - 1], Y[i - 1]) + func(X[i], Y1[i])) / 2.0;
    }
    return 0;
}
Ленащщ вне форума Ответить с цитированием
Старый 04.06.2020, 11:13   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Сама функция какая-то странная:
Код:
 if (((pow(y, 3) + x + 1))!= 0)
        return (3 * pow(y, 2)) / (pow(y, 3) + x + 1);}
а если = 0 - что на выходе ? где else ? Если = 0, то - хавайся у бульбу ?
Не говоря уже о том, что проверять double на = или != - всё равно, что переходить улицу в час пик с завязанными глазами.
Но учебные задания бывают и ещё более идиотическими.

Последний раз редактировалось digitalis; 04.06.2020 в 21:13.
digitalis вне форума Ответить с цитированием
Старый 06.06.2020, 12:57   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Не говоря уже о том, что проверять double на = или != - всё равно, что переходить улицу в час пик с завязанными глазами
а как тогда?
BLACK_RAIN вне форума Ответить с цитированием
Старый 06.06.2020, 13:57   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
а как тогда?
Если вопрос об переходе улицы - то на зелёный свет с открытыми глазами.
Если об этой странной функции, то она д.быть определена для любого значения аргумента.
А если о проверке на равенство real, то это азбучная истина: 2*2 м.быть не равно 2+2 для real, поэтому проверяют на
Abs( разность двух значений ) < eps.

Последний раз редактировалось digitalis; 06.06.2020 в 14:02.
digitalis вне форума Ответить с цитированием
Старый 06.06.2020, 14:14   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Abs( разность двух значений ) < eps.
подробнее, пожалуйста
BLACK_RAIN вне форума Ответить с цитированием
Старый 06.06.2020, 14:54   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Ну какое тут "подробно" . Из-за особенностей машинной арифметики значение, полученное одним путём, может быть не равным тому же значению, полученному другим путём, хотя вычисляя на бумажке - знаем, что одно и то же. Не приходилось видеть, к примеру, в результатах 2.99999, когда мы точно знаем, что д.быть 3.0 ? И если тупо сравнивать на =, то равные значения могут оказаться хоть на 1 бит отличающимися, и тогда прокрутим (или недокрутим) один лишний цикл, например. Поэтому для real типично: if Abs(var1 - var2) < eps
Я спросил у Яндекса: "сравнение float на равенство"... Первая же ссылка на Хабр.

Последний раз редактировалось digitalis; 06.06.2020 в 20:22.
digitalis вне форума Ответить с цитированием
Старый 06.06.2020, 15:27   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
if Abs(var1 - var2) < eps
error: 'eps' was not declared in this scope
к сожалению
BLACK_RAIN вне форума Ответить с цитированием
Старый 06.06.2020, 16:04   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Нужно самому объявить eps со значением желаемой точности сравнения.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 06.06.2020, 16:13   #9
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Нужно самому объявить eps со значением желаемой точности сравнения.
а как понять, какой точности достаточно?
BLACK_RAIN вне форума Ответить с цитированием
Старый 06.06.2020, 20:09   #10
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Это каждый решает сам - сколько точности ему достаточно для данной задачи.
"
Каждый выбирает для себя -
Женщину, религию, дорогу...
" © Ю. Д. Левитанский

ИЧСХ : ТС давно слиняла, а дяди тут рвут рубахи в поисках докопаться до истины

Последний раз редактировалось digitalis; 06.06.2020 в 20:12.
digitalis вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести результат SQL в Memo DKENT БД в Delphi 6 13.01.2018 18:46
Вывести результат DKENT PHP 4 29.03.2017 00:41
Нужно вывести результат класса prikolist Общие вопросы C/C++ 20 23.05.2009 20:06
Как вывести результат работы php скрипта eldar Работа с сетью в Delphi 21 08.08.2008 14:16
как вывести результат расчета????? в VB Николай969 Помощь студентам 1 17.01.2008 17:45