Ash*_*h M -1 c++ nan taylor-series
我正在尝试对泰勒级数进行编码,但是在 n(=100) 的值很大的情况下,我将得到“nan”作为输出。我哪里做错了?
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n;
double x;
cin >> n;
cin >> x;
long double temp_val = 1;
int sign = 1;
int power = 1;
long long int factorial = 1;
for(int i = 1 ; i < n ; i++){
sign = sign* -1 ;
power = 2*i;
factorial = factorial*(2*i)*(2*i-1);
temp_val += sign*pow(x,power)/factorial;
}
cout<<temp_val;
}
Run Code Online (Sandbox Code Playgroud)
对于大型n程序,您的程序具有未定义的行为。
您正在计算2n(so 200) in的阶乘factorial。200!是,根据 Wolfram Alpha:
788657867364790503552363213932185062295135977687173263294742533244359449963403342920304284011984623904177212138919638830257642790242637105061926624952829931113462857270763317237396988943922445621451664240254033291864131227428294853277524242407573903240321257405579568660226031904170324062351700858796178922222789623703897374720000000000000000000000000000000000000000000000000
为了比较,along long int可以保持的典型最大值是
9223372036854775807
(假设它是 64 位)
很明显,你将无法200!融入其中。当您溢出有符号整数变量时,您的程序将具有未定义的行为。这意味着无法保证它将如何表现。
但即使将变量类型更改为无符号,也不会发生太大变化。该程序将不再有未定义的行为,但factorial实际上不会保存正确的值。相反,它会继续回零。
即使您更改factorial为 type double,这在典型double实现中也可能不足以保持此值。您的平台可能具有long double大于double并能够容纳此值的类型。
您将遇到类似的问题pow(x, power)if xis not close to 1。
正如@idclev463035818 在回答中提到的,泰勒级数如果直接评估,在数值上是非常不正常的,实际上不能以这种形式实际用于大n.