Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算e^x的C程序_C_Exponential - Fatal编程技术网

计算e^x的C程序

计算e^x的C程序,c,exponential,C,Exponential,我正在尝试编写一个C程序,它将允许我评估e^x,但我不确定我是否走上了正确的轨道。对于较低的x值,它似乎工作正常,但超过5可能会有太多的错误。只是想知道是否有人能看到我的代码哪里出了问题(或者如果我的代码是正确的,这可能是因为PC无法处理n对n的大值!) 谢谢:-) 瓦德福德 unsigned int counter1 = 1, counter2 = 1, counter3 = 1, num, numFactorial, X; float e, ex, x; printf( "%s", "En

我正在尝试编写一个C程序,它将允许我评估e^x,但我不确定我是否走上了正确的轨道。对于较低的x值,它似乎工作正常,但超过5可能会有太多的错误。只是想知道是否有人能看到我的代码哪里出了问题(或者如果我的代码是正确的,这可能是因为PC无法处理n对n的大值!)

谢谢:-)

瓦德福德

unsigned int counter1 = 1, counter2 = 1, counter3 = 1, num, numFactorial, X;
float e, ex, x;

printf( "%s", "Enter a number: ");
scanf( "%d", &num);

printf( "%s", "Enter a value for x: ");
scanf( "%f", &x);

e = e + 2;
counter3 = num;

while ( counter3 > 1 ) {

    counter1 = counter3;
    numFactorial = counter3;
    X = x;

    while( counter1 > 1 ) {
        numFactorial = numFactorial * ( counter3 - counter2);
        counter1--;
        counter2++;
        X = X * x;
    }    
    counter2 = 1;
    e = e + ( 1 / (float) numFactorial );
    ex = ex + X * ( 1 / (float) numFactorial );
    counter3--;
}    

ex = ex + x + 1;

printf( "e to the nth order of approximation (n = %d) is: %f", num, e);
printf( "\ne^x to the nth order of approximation (n = %d) is: %f", num, ex);

我刚刚试过你的代码,x=3,它最多可以工作到num=19(所以在扩展中是第19个顺序)。之后,数量偏离其预期值。这是一个溢出的问题,你的数字太大了

如果我理解正确,您希望在两个级数展开式中获得给定数量x到给定阶数(num)的和指数的值

然后计算阶乘num!在代码内部。 如果numfactoria是一个无符号int,则这不适用于大于15的数字。这仅仅是因为数字的表示形式。 至少要用双倍的

根据我的经验,当你需要计算阶乘时,如果这是你想要做的,使用库“math.h”中的,叫做tgamma。
如果查看Gamma函数的wikipedia页面,可以使用它获得整数的阶乘:num!=tgamma(num+1)

你能描述一下这个方法吗?是泰勒级数吗?如果是的话,原因是你需要更多的泰勒级数项来做一个很好的近似,确实是这样。在程序开始给出奇怪的结果之前,我只能将它扩展到大约10个术语(10!)。你可能会得到一些溢出/下溢-为什么不为此使用库函数呢?10!太大,请尝试使用
double
而不是
float
。对于exp(x)而言,10个术语并不坏。16位
无符号
(相当于标准的最低要求)将在计算
9时溢出。32位
无符号
将在计算
13时溢出。即使是64位
无符号
(很少有实现会超过此值)也会导致计算溢出
21。一个
无符号的
溢出了定义良好的行为(模算术),但这将在代码中引起相当大的转移。将
numFactorial
转换为
float
无法解决此问题。此外,您的代码可能会很快溢出
X
(重复乘以
X
),除非
X
非常小(即不超过
1.0
)。嗨,这是Deitel和Deitel编写的C:如何编程的问题。因此,我试图仅使用我到目前为止阅读的章节中包含的信息来回答这个问题-不幸的是,这不包括双精度函数或伽马函数。所以从我所听到的,我的程序在崩溃之前只能运行到目前为止是有道理的。公平吗?好的,我有第六版的Deitel。在我的版本中,您指的是练习3.46第95页。所以,是的,这本书没有提到函数,对于循环,double或gamma。它只在不能用来命名变量的C关键字中提到double。然后,你所做的是正确的,事实上你不能按照序列的顺序上升是因为阶乘给了你巨大的数字(正如其他人在评论中已经指出的)。唯一需要尝试的是从一开始就将计数器3转换为float,以及所有其他计数器。让人放心的是,我一直在发牢骚,说我无法让这个程序运行。谢谢:)