@missbells

Почему результат выводится inf?

Добрый день! Рассчитыва арифметическое выражение - сумму ряда с факториалом.. Если задаю сумму ряда длиной до 6, то все работает, если длину ряда задаю n = 6, то в консоли выскакивает вместо результата inf.

Подскажите, пожалуйста, в чем может быть проблема?

пс. факториал считается правильно.. проверяла. проблема именно в сумме ряда.

Вот код:

using namespace std;

int factorial (int n);

int main()
{
	double sum = 0.0;
	int n, x;
	cout << "Enter n" << endl;
	cin >> n;
	cout << "Enter x" << endl;
	cin >> x;
	for (int i = 1; i <= n; i++) {
		sum += (factorial(2*i) + abs((double)x)) / factorial(i*i);
	}
	cout << "Result is " << sum << endl;
	_getch();
    return 0;
}

int factorial(int n) {
	if (n > 1) {
		return n * (factorial(n - 1));
	}
	else {
		return 1;
	}
}
  • Вопрос задан
  • 21614 просмотров
Пригласить эксперта
Ответы на вопрос 2
terrier
@terrier
пс. факториал считается правильно.. проверяла. проблема именно в сумме ряда.

Проверьте еще раз, например на таком примере: factorial(36)
Вспомним, что факториал - число большое, а в int влезает не так много. А что у нас там является результатом знакового переполнения в C++, напомните?
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
У нас тут переполнение, 36! не влезает в тип int. Сделайте хотя бы double.

Inf («машинная бесконечность») — обычно результат дробного деления на ноль. Почему? Посчитаем, сколько двоек в 36!
Делятся на 2 — 18 сомножителей.
И ещё на 4 — 9 шт.
И ещё на 8 — 4 шт.
И ещё на 16 — 2 шт.
И ещё на 32 — 1 шт.
Итого в составе 36! будет 34 двойки, то есть 36! делится на 234. Разумеется, целочисленная арифметика, работающая в кольце остатков от деления на 232, даст ноль. При этом, разумеется, 32-битный регистр многократно и безнадёжно переполнится.

Более сложный способ расчёта ряда — рекуррентное соотношение. Очередное слагаемое поделим на две части: ai = (2i)! / i²! и bi = |x| / i²!. Постройте, как соотносятся ai−1 и ai, аналогично для b.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы