Я пытаюсь написать программу для вычисления вероятностной функции масс распределения Пуассона P (x = n) с параметром лямбда, используя эту формулу: ( (e^-lambda)*(lambda^n))/n!
Этот подход хорошо работает, когда я использую маленькие лямбды и маленькие числа, но если я хочу вычислить, например, P (x = 30) с лямбда 20, результат будет 4.68903e + 006, что неверно.
Думаю, проблема в вычислении n !. Я реализовал функцию для вычисления значения факториала и использовал тип данных unsigned long long
для результата вычисления факториала, но проблема в том, что количество 30! равно 265,252,859,812,191,058,636,308,480,000,000, а максимальное число, доступное для длинных длин без знака, составляет 18,446,744,073,709,551,615, что меньше 30 !.
Что мне делать, чтобы решить эту проблему? Есть ли какой-либо другой способ или какая-либо функция для вычисления этой возможности в С ++?
тип данных
std::lgamma
, чтобы избежать проблем с большими числами. - person rwong   schedule 27.10.2015