Найти в Дзене
Геннадий Шушпанов

Как посчитать факториал

Часто для решения задачи существует более одного пути. Предположим понадобилось вычислить eˣ через известный ряд: В выражение входит факториал и нам нужны его значения для разных n. Можно решить задачу в лоб, использовав рекурсию, цикл или таблицу (ведь значений, которые уместятся в int или long не много). Но у этих методов есть большой недостаток: n! быстро растет и мы исчерпаем возможности представления чисел до того, как достигнем желаемой точности. Но есть иной путь -- не считать факториал. Заметим, что i-й член ряда можно выразить через (i-1)-й: В этом случае нет нужды считать факториал и возводить x в степень, получая огромные числа, а поэтому можно вычислить большее количество членов ряда. При этом всё, что нужно сделать, это сохранить предыдущее значение. Ниже представлена короткая программа для вычисления eˣ. Si хранит значение для i-го члена ряда. ex накапливает значение для eˣ, а ep используется для контроля точности. Если значения для eˣ на предыдущей и текущей итерациях со

Часто для решения задачи существует более одного пути. Предположим понадобилось вычислить eˣ через известный ряд:

В выражение входит факториал и нам нужны его значения для разных n. Можно решить задачу в лоб, использовав рекурсию, цикл или таблицу (ведь значений, которые уместятся в int или long не много). Но у этих методов есть большой недостаток: n! быстро растет и мы исчерпаем возможности представления чисел до того, как достигнем желаемой точности. Но есть иной путь -- не считать факториал. Заметим, что i-й член ряда можно выразить через (i-1)-й:

-2

В этом случае нет нужды считать факториал и возводить x в степень, получая огромные числа, а поэтому можно вычислить большее количество членов ряда. При этом всё, что нужно сделать, это сохранить предыдущее значение. Ниже представлена короткая программа для вычисления eˣ.

-3

Si хранит значение для i-го члена ряда. ex накапливает значение для eˣ, а ep используется для контроля точности. Если значения для eˣ на предыдущей и текущей итерациях совпали, то значение очередного члена ряда меньше единицы последнего значащего разряда результата. Можно выходить, поскольку мы уже ничего не улучшим.

В результате вычислений для e¹⁰⁰ получим 2,6881171418161336E+43 при n = 192, что значительно превышает 12, факториал которого ещё влезает в int, или 20 в случае long. Да и 100¹⁹² в диапазон double уже не влезает. Что касается точности вычислений, то Math.Exp(100) дает слегка иное значение 2,6881171418161356E+43, а калькулятор из Windows 11 своё: 2,68811714181613544841262555158e+43. Если в выражении для Si изменить порядок вычислений на Si/i*x, то полученный результат совпадет с Math.Exp(100).

-4