c# - 指数和阶乘的序列迭代产生意外结果
问题描述
我在学习过程中尝试了一个简单的任务,但我被卡住了并且有一些奇怪的结果。我必须编写一个带有 2 个参数“x”和“a”的简单方法。此方法的结果必须是所有 x k /k 的总和!其中k从0开始到无穷大,'a'是精度参数。
但我不知道为什么当我将 Console.Write 放在循环内时,数字表现得很疯狂, 我有这个 x = 2 和 x = 6
此外,当我试图将我的代码放入方法并使用结果时,什么也没有发生。我有另一种数学阶乘计算 k 的方法!
decimal wynik = 0;
int x = 2;
int a = 6;
for (int k = 1; k > 0; k++)
{
if (Algorithms.Factorial(k) > 0)
{
wynik += Math.Round(Convert.ToDecimal(Math.Pow(x, k)) /
Algorithms.Factorial(k), a);
Console.WriteLine(wynik);
}
}
Console.WriteLine(wynik);
和Factorial
方法
static public int Factorial(int n)
{
int wynik = 1;
for (int i = 1; i <= n; i++)
{
wynik *= i;
}
return wynik;
}
当然,我想以方法结束并返回结果,但是为了练习,我正在使用 Main 方法,非常感谢您的帮助!
解决方案
阶乘增长很快,请看
13! = 6227020800 > int.MaxValue
这就是为什么返回很可能导致int
整数溢出和奇怪的结果。
增长也很快(虽然没有阶乘那么快)。让这些大数相互抵消:static public int Factorial(int n)
x ** k
double x = 2;
double tolerance = 0.00001;
double result = 1.0; // x**0 / 0! == 1 / 1 == 1
double term = 1.0;
for (int k = 1; term > tolerance; ++k) {
// given term = (x ** (k - 1)) / (k - 1)!
// we can compute next term as
term = term * x / k;
result += term;
}
// Let's have a look (in fact, you have Taylor serie for exp)
Console.WriteLine($"actual : {result} (+/- {tolerance:0.##############})";
Console.WriteLine($"expected : {Math.Exp(x)}"");
结果:
actual : 7.3890545668323435 (+/- 0.00001)
expected : 7.38905609893065
推荐阅读
- onelogin - Onelogin CLI 身份验证失败
- android - com.google.android.gms.auth.UserRecoverableAuthException:NeedPermission
- javascript - Vuetify.js:如何在 v-card' v-img 组件的右上角显示文本?
- python - 在 Django 模型中覆盖 save() 方法时的 Transaction.atomic?
- node.js - 从使用 NPM 刷新浏览器同步中排除文件夹
- ansible - ansbile gather_facts 模块前面缺少 ansble_*
- timer - 我在数据保存和计时器方面遇到了一些问题
- mysql - 备份:运行命令抛出一般错误:“mysqldump”不被识别为内部或外部命令
- spring - 处理实体继承spring boot
- javascript - 数字增量jQuery显示空数字错误