c - C中的公式P(n) = (n!)(6^n)产生了一个很大的值

标签 c factorial approximate

我试图在 C 中表示以下数学表达式:

P(n) = (n!)(6^n)

程序应在 n = 156 时计算表达式的答案。我曾尝试用 C 语言创建程序,但未能生成答案。答案大约是 10^397。该程序使用 2 个对数恒等式。它还利用斯特林近似来计算大阶乘。

我怎样才能让它产生正确的答案,你对我如何改进代码有什么建议吗? (我对编程还很陌生):

#include <math.h>
typedef unsigned int uint;

int main()
{
uint n=156;                               // Declare variables
double F,pi=3.14159265359,L,e=exp(1),P;
F = sqrt(2*pi*n) * pow((n/e),n);          // Stirling's Approximation Formula
L = log(F) + n*log(6);                    // Transform P(n) using logarithms - log(xy) = log(x) + log(y) and log(y^n) = n*log(y)
P = pow(e,L);                             // Transform the resultant logarithm back to a normal numbers
}

谢谢! :)

最佳答案

大多数 C 实现中的整数和浮点变量都不能支持这种数量级的数字。典型的 64 位 double 会达到 10308 之类的值,在该数量级会出现大量精度损失。

您需要所谓的“bignum 库”来计算它,这不是标准 C 的一部分。

关于c - C中的公式P(n) = (n!)(6^n)产生了一个很大的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27256720/

相关文章:

c# - 将 double 与自适应近似相等进行比较

c - 父进程不等待子进程 - C

c - 结构体初始化错误

c - 如何在 win32 上为 mingw 使用 makefile

prolog - 递归过程解释

ruby - MiniTest 的 assert_in_delta 和 assert_in_epsilon 方法有什么区别?

c - 使用此复杂逻辑的 switch 语句的意外输出

Java 打印阶乘 1-30

python - 使用 Factoradic 系统允许重复时查找第 K 个字典排列

java - Lucene/Solr 用于近似(公司)名称匹配