【发布时间】:2021-12-01 09:02:30
【问题描述】:
我需要计算以下内容:
S= 1- x^2 / 2! + x^4 / 4! - x^6 / 6! + ... + (-1)^n * x^2n / (2n)!
其中 n 介于 1 到 100 之间,x 是双精度数。
我有以下代码:
unsigned int factorial (unsigned int n)
{
if (n == 0)
return 1;
return n * factorial(n - 1);
}
double exFive(int n, double x)
{
double s = 1;
for (int i = 1; i <= n; ++i)
{
int j = 2 * i;
s = s + pow(-1, i) * pow(x, 2*i) / factorial(j); //problem is here I guess
}
return s;
}
void fiveIO()
{
int n = 1;
double x;
cout << "Input n: ";
cin >> n;
while ((n < 1) || (n > 100))
{
cout << "Wrong number, input again: ";
cin >> n;
}
cout << "Input: ";
cin >> x;
cout << "Result is " << fixed << setprecision(2) << exFive(n, x);
}
它可以工作,但是结果是 nan,其中 n 高于 ~15.. 但我不知道为什么。 我猜是 FiveX 功能。
所以,例如,n = 3, x = 5 输出 -7.16(这是正确的),但 n = 50, x = 5 输出“nan”.. 是因为输出的数字太大了吗?但是那我该怎么做呢?
【问题讨论】:
-
典型的32位
int只能容纳factorial(12)的结果,任何更大的n都会导致整数溢出。NaN是float除以0的结果。 -
而 64 位数字只能处理 ~
20!。 -
200!有 375 位数字:如果你想暴力破解这个问题,你将需要一些扩展精度库,例如
GMP。 -
@Yksisarvinen 我以为
NAN是由0.0/0.0或inf-inf生成的 -
@MatG 嗯,是的,你是对的。除以零应该产生
inf,0.0 / 0.0,我的错。