输出是 NaN ,如何?

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)

wal*_*nut 5

对于大型n程序,您的程序具有未定义的行为。

您正在计算2n(so 200) in的阶乘factorial200!是,根据 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.