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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2010, 15:03   #1
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию Оцените программу нахождения e^x

Решил задачу Дейтлов (программа вычисляющая значение e^x по формуле e^x = 1 + x / 1! + x^2 / 2! + x^3 / 3! ...)
Код:
#include<iostream>
using std::cin;
using std::cout;
using std::endl;

#include<math>

#include<windows>

void rustext(char str[])
{
   char buffer[1024];
   CharToOem(str, buffer);
   cout << buffer;
}

int main()
{
   double e = 1;
   int delitel = 1; // делитель слагаемого
   int stepen = 1; // степень х из e^x
   int j;
   int factorial; // факториал делителя
   double slagaemoe; // очередное слагаемое из суммы e^x
   int delimoe; // делимое слагаемого

   rustext("Введите степень х числа e^x: ");
   cin >> stepen;

   while (slagaemoe > 0.000001)
   {
      delimoe = pow(delimoe, stepen);

      for (j = 1; j <= delitel; j++)
      {
         factorial *= j;
      }

      slagaemoe = delimoe / delitel;
      e += slagaemoe;
   }

   cout << "e = " << e << endl;

   system("pause");
   return 0;
}
Теперь вопрос в том, как проверить правильность вычислений. Нашел формулу

Она подойдет для проверки, как считаете?
Изображения
Тип файла: jpg formula_ex.jpg (3.8 Кб, 243 просмотров)
fs444 вне форума Ответить с цитированием
Старый 29.01.2010, 15:28   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Простите, Вы, просто, чему равно число e, знаете? А просто единицу в таком случае в свою программу Вы вводили?..
Vago вне форума Ответить с цитированием
Старый 29.01.2010, 20:11   #3
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
Простите, Вы, просто, чему равно число e, знаете? А просто единицу в таком случае в свою программу Вы вводили?..
Я уже молчу про функцию exp
Carbon вне форума Ответить с цитированием
Старый 29.01.2010, 22:21   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Эту задачу можно решить проще и эффективнее. Вообще, в подобных задачах, на вычисление суммы ряда желательно находить некую общую часть, на которую увеличивается каждый следующий элемент ряда. В данном случае очевидно, что каждое следующее слагаемое можно получить помножив текущее на х и на порядковый номер слагаемого в ряде-1
Код:
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
	double p = 1, e = 1;
	int    x;
	
	cout << "Введите x: ";
	cin  >> x;
	for(int i = 1; p > 0.00001; i++) {
		p = p * x / i;
		e += p;
	}
	
	cout << "exp(x) == " << exp(x) << endl; // Для проверки
	cout << "custom == " << e << endl;
	
	cin.get();
	return 0;
}
netrino вне форума Ответить с цитированием
Старый 01.02.2010, 14:36   #5
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию

Ругнулся "Ambiguity between 'std::ext(double)' and 'std::exp(long double)'" и вместо русских букв вывел крякозябры.

Почему не пишешь system("pause"); чтобы программа не сворачивалась сама? У тебя для этого cin.get() служит?

Немного подредактировал имена переменных, чтобы самому понятнее было:

Код:
#include<iostream>
using std::cin;
using std::cout;
using std::endl;

#include<math>

#include<windows>

void rustext(char str[])
{
   char buffer[1024];
   CharToOem(str,buffer);
   cout << buffer;
}

int main()
{
   double slagaemoe = 1;
   double e = 1;
   int x;

   rustext("Введите х: ");
   cin >> x;

   for (int i = 1; slagaemoe > 0.00001; i++)
   {
      slagaemoe = slagaemoe * x / i;

      e += slagaemoe;
   }

   cout << "exp(x) == " << exp(x) << endl; // Для проверки
   cout << "e^x == " << e << endl;

   cin.get();

   system("pause");
   return 0;
}
А каким образом в числителе здесь вычисляется х^степень?

Цикл for будет протекать так? Я правильно понимаю:
Код:
   double slagaemoe = 1;
   double e = 1;
   int x;

   cin >> x; // берем 5 для примера

   for (int i = 1; slagaemoe > 0.00001; i++)
   {
      slagaemoe = slagaemoe * x / i;

      e += slagaemoe;
   }

============ 1 ===

slagaemoe = slagaemoe * x / i = 1 * 5 / 1 = 5 / 1 = 5
e = e + slagaemoe = 1 + 5 = 6

=== 2 ===

slagaemoe = slagaemoe * x / i = 5 * 5 / 2 = 25 / 2 = 12
e = e + slagaemoe = 6 + 5 = 11

=== 3 ===

slagaemoe = slagaemoe * x / i = 12 * 5 / 3 = 60 / 3 = 20
e = e + slagaemoe = 11 + 20
Цитата:
Я уже молчу про функцию exp
А ты не молчи, объясни подробнее.

Последний раз редактировалось fs444; 01.02.2010 в 14:47.
fs444 вне форума Ответить с цитированием
Старый 01.02.2010, 18:01   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от fs444 Посмотреть сообщение
Ругнулся "Ambiguity between 'std::ext(double)' and 'std::exp(long double)'" и вместо русских букв вывел крякозябры.
Угу, на маке писал, тут проблем с кодировкой нет..
Цитата:
Сообщение от fs444 Посмотреть сообщение
Почему не пишешь system("pause"); чтобы программа не сворачивалась сама? У тебя для этого cin.get() служит?
Да.

Цитата:
Сообщение от fs444 Посмотреть сообщение
А каким образом в числителе здесь вычисляется х^степень?
А незачем каждый раз вычислять x^n, это неэффективно.
Мы знаем, что слагаемое(n) больше слагаемого(n-1) на x/n, то есть
слагаемое(n) = слагаемое(n-1) * x / n.
Это освобождает нас от необходимости каждый раз вычислять следующее слагаемое "целиком"(так как мы используем предыдущее слагаемое для вычисления следующего, то есть не делаем лишних операций по умножению/делению). Это повышает производительность.

Цитата:
Сообщение от fs444 Посмотреть сообщение
Цикл for будет протекать так?
Немного ошиблись в расчётах, но в целом примерно так.
netrino вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите написать программу нахождения углов треугольника на Delphi _Andruha_ Помощь студентам 3 10.11.2010 09:17
Составить программу для нахождения значения выражения ) dodyks Помощь студентам 4 10.05.2009 16:16
Составить программу нахождения всех делителей натурального числа N livestrong Помощь студентам 3 24.12.2008 19:02
Составить программу нахождения натурального числа n livestrong Помощь студентам 14 24.12.2008 18:15
Составить программу нахождения максимального элемента Red Devel Помощь студентам 3 25.12.2007 19:08